Compare commits

...

44 commits
v2.3.1 ... main

Author SHA1 Message Date
sheik
7359830877
feat: use tea binary from system if available (#53)
As a proposal solution to this issue: https://code.forgejo.org/actions/forgejo-release/issues/51

We use the system installed tea binary if available or download it as it was done before if not.
The location of the binary is stored in a new variable `$TEA_BIN` which replaces the need for the `$ BIN_DIR` location.

I tested it on Alpine and Debian.

Co-authored-by: Rayan Mestiri <rayan.mestiri@gmail.com>
Co-authored-by: Rayan MESTIRI <rayan.mestiri@NLGRSSL600K.ratpsmart.local>
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/53
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
Co-authored-by: sheik <sheik@noreply.code.forgejo.org>
Co-committed-by: sheik <sheik@noreply.code.forgejo.org>
2025-06-28 20:36:41 +00:00
earl-warren
85122bff5d
Merge pull request 'fix: private GPG key used in CI expired May 2025' (#55) from wip-try into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/55
2025-06-27 17:02:54 +00:00
Earl Warren
d555422510
fix: private GPG key used in CI expired May 2025
Renew them.
2025-06-27 15:00:34 +02:00
earl-warren
23391e15ac
Merge pull request 'Update actions/checkout action to v4' (#47) from renovate/actions-checkout-4.x into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/47
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2025-05-05 10:19:08 +00:00
earl-warren
8486c48d5f
Merge pull request 'Migrate renovate config' (#50) from renovate/migrate-config into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/50
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2025-05-05 05:54:01 +00:00
Renovate Bot
cf13c2cb1d
Migrate config renovate.json 2025-05-05 01:03:45 +00:00
earl-warren
cb5b30e358
Merge pull request 'Update https://code.forgejo.org/actions/setup-forgejo action to v2.0.11' (#49) from renovate/https-code.forgejo.org-actions-setup-forgejo-2.x into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/49
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2025-04-13 10:06:09 +00:00
Renovate Bot
f0a9704521
Update https://code.forgejo.org/actions/setup-forgejo action to v2.0.11 2025-04-13 08:31:13 +00:00
Renovate Bot
13b5920f54
Update actions/checkout action to v4 2025-04-13 08:31:08 +00:00
earl-warren
73fec07c28
Merge pull request 'chore: teach renovate to update the example version' (#46) from earl-warren/forgejo-release:wip-renovate into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/46
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2025-04-13 06:46:33 +00:00
Earl Warren
dccbd17bd8
chore: teach renovate to update the example version 2025-04-12 13:33:43 +02:00
earl-warren
bc1ca37df0
Merge pull request 'chore: update the example to refer to v2.6.0' (#45) from wip-readme into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/45
2025-04-12 11:28:07 +00:00
Earl Warren
a198449381
chore: update the example to refer to v2.6.0
and be explicit about the parameters to improve readability
2025-04-12 13:24:33 +02:00
dorianim
a6e3fdb19e
feat: add default token and document default values (#44)
This PR adds `${{ secrets.GITHUB_TOKEN }}` as the default value for the token and documents all default values in the readme.
Fixes #43

Co-authored-by: Dorian Zedler <dorian@itsblue.de>
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/44
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
Co-authored-by: dorianim <dorianim@noreply.code.forgejo.org>
Co-committed-by: dorianim <dorianim@noreply.code.forgejo.org>
2025-04-07 06:35:43 +00:00
earl-warren
73ed2a76a2
Merge pull request 'fix: the tag cache must be deleted when the tag is deleted' (#40) from limiting-factor/forgejo-release:wip-delete into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/40
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2025-02-23 23:11:48 +00:00
limiting-factor
1a6975277b fix: the tag cache must be deleted when the tag is deleted
Otherwise it will linger and potentially create problem when
using overrides.
2025-02-23 23:52:48 +01:00
earl-warren
e2af55222e
Merge pull request 'fix: override=true must not needlessly delete a tag' (#39) from limiting-factor/forgejo-release:wip-override into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/39
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2025-02-23 20:43:42 +00:00
limiting-factor
0079bcb471 fix: override=true must not needlessly delete a tag
If the tag to be set is exactly the same as the tag that exists, do
not delete it.

When the tag is recreated although it is not necessary, it may trigger
workflows that have already been triggered and send the workflow in a
loop.

- split `get_tag` & `matched_tag` out of ensure_tag
- in case of an override, only delete the tag if it fails `matched_tag`
- trace shell lines to help debug
- add testing
2025-02-23 21:22:31 +01:00
limiting-factor
9d4ddfbaad chore(editorconfig): comply with .editorconfig 2025-02-23 19:02:08 +01:00
Michael Kriese
e4b9180780 Merge pull request 'Replace actions/setup-forgejo action with actions/setup-forgejo v1.0.1' (#36) from renovate/actions-setup-forgejo-replacement into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/36
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2024-12-10 05:51:36 +00:00
Renovate Bot
410b453871
Replace actions/setup-forgejo action with actions/setup-forgejo v1.0.1 2024-12-10 00:02:00 +00:00
Crown0815
4d26949b75 Add support for files with spaces in their names (#24)
So far when uploading files containing spaces, such as `file 3.txt`, the `tea` command will be broken due to incorrectly formatted `tea` arguments.
I have been receiving `Remote repository required: Specify ID via --repo or execute from a local git repo.` which was not helpful until I turned on `verbose` and saw the whole command.

This fix should resolve this issue and thereby add active support for files with spaces.

Co-authored-by: Felix Kröner <felix.kroener@dynamic-biosensors.com>
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/24
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
Co-authored-by: Crown0815 <crown0815@noreply.code.forgejo.org>
Co-committed-by: Crown0815 <crown0815@noreply.code.forgejo.org>
2024-12-09 05:38:35 +00:00
earl-warren
c2742f30c0 Merge pull request 'Update actions/setup-forgejo action to v2.0.4' (#35) from renovate/actions-setup-forgejo-2.x into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/35
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2024-12-08 07:44:30 +00:00
Renovate Bot
4e4edf0d8c
Update actions/setup-forgejo action to v2.0.4 2024-12-08 00:02:10 +00:00
earl-warren
2eb5091236 Merge pull request 'Add hide archive link option' (#34) from natct/forgejo-release:add_hide_archive_link_option into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/34
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2024-12-03 08:57:21 +00:00
natct
5069284121 feat: add an option to hide archive link 2024-12-03 09:48:47 +01:00
natct
e31d55ec37 Merge pull request 'Update actions/setup-forgejo action to v2.0.3' (#33) from renovate/actions-setup-forgejo-2.x into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/33
Reviewed-by: natct <natct@noreply.code.forgejo.org>
2024-12-03 08:29:13 +00:00
Renovate Bot
cdc4d28dc0
Update actions/setup-forgejo action to v2.0.3 2024-11-28 00:02:39 +00:00
Michael Kriese
799c07b6e7 Merge pull request 'Configure Renovate' (#31) from renovate/configure into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/31
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2024-11-20 15:18:27 +00:00
Renovate Bot
d62b558623
Add renovate.json 2024-11-20 14:01:08 +00:00
earl-warren
4f1c5dce43 Merge pull request 'feat: enable release-notes-assistant' (#28) from natct/forgejo-release:use_rna into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/28
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2024-11-18 15:09:23 +00:00
natct
63e4d05f9d feat(ci): update setup-forgejo version 2024-11-18 15:32:02 +01:00
natct
0ac99a8b42 feat(ci): add test for rna 2024-11-18 15:32:02 +01:00
natct
59d006123b feat(ci): use Release Notes Assistant 2024-11-18 15:32:02 +01:00
earl-warren
f20eaa0c48 Merge pull request 'add LOOP_DELAY=30' (#29) from natct/forgejo-release:slowly into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/29
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2024-11-18 13:55:34 +00:00
natct
885d020f46 wip: export var 2024-11-18 11:10:44 +01:00
natct
f194120fa7 wip: add LOOP_DELAY=30 2024-11-12 17:38:02 +01:00
earl-warren
a4252003d2 Merge pull request 'Script cleanup' (#27) from natct/forgejo-release:cleanup into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/27
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2024-11-04 10:44:36 +00:00
natct
72f5daf6a7 feat: cleaunp script 2024-11-04 11:07:42 +01:00
natct
c3c6700f17 feat: add .editorconfig 2024-11-04 11:07:42 +01:00
earl-warren
d9518fd6b1 Merge pull request 'Update README.md' (#26) from natct/forgejo-release:update_readme into main
Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/26
Reviewed-by: earl-warren <earl-warren@noreply.code.forgejo.org>
2024-10-29 16:18:06 +00:00
natct
f3b5347abf feat(doc): update inputs 2024-10-29 15:41:47 +01:00
natct
e613cff3d5 feat(doc): update action.yml 2024-10-29 15:41:47 +01:00
natct
8ebade3458 feat(doc): update README.md 2024-10-29 11:59:40 +01:00
16 changed files with 479 additions and 462 deletions

10
.editorconfig Normal file
View file

@ -0,0 +1,10 @@
root = true
[*]
indent_style = space
indent_size = 4
tab_width = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

View file

@ -3,14 +3,14 @@ jobs:
integration: integration:
runs-on: self-hosted runs-on: self-hosted
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- id: forgejo - id: forgejo
uses: https://code.forgejo.org/actions/setup-forgejo@v1 uses: https://code.forgejo.org/actions/setup-forgejo@v2.0.11
with: with:
user: testuser user: testuser
password: admin1234 password: admin1234
image-version: 1.20 image-version: 9
- name: push self - name: push self
run: | run: |
@ -18,28 +18,38 @@ jobs:
- name: testdata/upload-download - name: testdata/upload-download
run: | run: |
export LOOP_DELAY=30
export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}" export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}"
forgejo-test-helper.sh run_workflow testdata/upload-download http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser upload-download forgejo-release "${{ steps.forgejo.outputs.token }}" forgejo-test-helper.sh run_workflow testdata/upload-download http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser upload-download forgejo-release "${{ steps.forgejo.outputs.token }}"
set -ex set -ex
export FORGEJO="${{ steps.forgejo.outputs.url }}" export FORGEJO="${{ steps.forgejo.outputs.url }}"
curl --fail -sS $FORGEJO/api/v1/repos/testuser/upload-download/releases/tags/v2.0 > /tmp/release.json curl --fail -sS $FORGEJO/api/v1/repos/testuser/upload-download/releases/tags/v2.0 > /tmp/v2.json
EXPECTED='No shell expansion should on these notes: EXPECTED='No shell expansion should on these notes:
- $(some_command) - $(some_command)
- `other_commend` - `other_commend`
- "double quoted" and '\''single quoted'\'' strings - "double quoted" and '\''single quoted'\'' strings
- \backslash escape - \backslash escape
- !exclamation_mark' - !exclamation_mark'
test "$EXPECTED" = "$(jq -r .body < /tmp/release.json)" test "$EXPECTED" = "$(jq -r .body < /tmp/v2.json)"
test $(cat /tmp/v2.json | jq -r .hide_archive_links) = false
curl --fail -sS $FORGEJO/api/v1/repos/testuser/upload-download/releases/tags/v1.0 > /tmp/v1.json
cat /tmp/v1.json | jq -r .body | grep '<!--start release-notes-assistant-->'
test $(cat /tmp/v1.json | jq -r .hide_archive_links) = true
- name: testdata/upload-download-private - name: testdata/upload-download-private
run: | run: |
export LOOP_DELAY=30
export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}" export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}"
curl -X 'POST' 'http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }}/api/v1/user/repos' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"name": "upload-download-private","private": true}' curl -X 'POST' 'http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }}/api/v1/user/repos' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"name": "upload-download-private","private": true}'
forgejo-test-helper.sh run_workflow testdata/upload-download http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser upload-download-private forgejo-release "${{ steps.forgejo.outputs.token }}" forgejo-test-helper.sh run_workflow testdata/upload-download http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser upload-download-private forgejo-release "${{ steps.forgejo.outputs.token }}"
- name: testdata/nested-upload-download - name: testdata/nested-upload-download
run: | run: |
export LOOP_DELAY=30
export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}" export FORGEJO_RUNNER_LOGS="${{ steps.forgejo.outputs.runner-logs }}"
forgejo-test-helper.sh run_workflow testdata/nested-upload-download http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser nested-upload-download forgejo-release "${{ steps.forgejo.outputs.token }}" forgejo-test-helper.sh run_workflow testdata/nested-upload-download http://testuser:admin1234@${{ steps.forgejo.outputs.host-port }} testuser nested-upload-download forgejo-release "${{ steps.forgejo.outputs.token }}"

View file

@ -3,8 +3,10 @@ jobs:
integration: integration:
runs-on: docker runs-on: docker
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Unit tests of the supporting script forgejo-release.sh - name: Unit tests of the supporting script forgejo-release.sh
run: | run: |
testdata/forgejo-release-test.sh test_maybe_sign_release testdata/forgejo-release-test.sh test_system_tea_bin
testdata/forgejo-release-test.sh test_download_tea_bin
testdata/forgejo-release-test.sh test_maybe_sign_release

1
.gitignore vendored
View file

@ -1 +1,2 @@
*~ *~
.idea

View file

@ -10,39 +10,45 @@ Upload or download the assets of a release to a Forgejo instance.
| name | description | required | default | | name | description | required | default |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `url` | <p>URL of the Forgejo instance</p> | `false` | `""` | | `url` | <p>URL of the Forgejo instance</p> | `false` | `${{ env.GITHUB_SERVER_URL }}` |
| `repo` | <p>owner/project relative to the URL</p> | `false` | `""` | | `repo` | <p>owner/project relative to the URL</p> | `false` | `${{ github.repository }}` |
| `tag` | <p>Tag of the release</p> | `false` | `""` | | `tag` | <p>Tag of the release</p> | `false` | `${{ github.ref_name }}` |
| `title` | <p>Title of the release</p> | `false` | `""` | | `title` | <p>Title of the release (defaults to tag)</p> | `false` | `""` |
| `sha` | <p>SHA of the release</p> | `false` | `""` | | `sha` | <p>SHA of the release</p> | `false` | `${{ github.sha }}` |
| `token` | <p>Forgejo application token</p> | `true` | `""` | | `token` | <p>Forgejo application token</p> | `false` | `${{ secrets.GITHUB_TOKEN }}` |
| `release-dir` | <p>Directory in whichs release assets are uploaded or downloaded</p> | `true` | `""` | | `release-dir` | <p>Directory in whichs release assets are uploaded or downloaded</p> | `true` | `""` |
| `release-notes` | <p>Release notes</p> | `false` | `""` | | `release-notes` | <p>Release notes</p> | `false` | `""` |
| `direction` | <p>Can either be download or upload</p> | `true` | `""` | | `direction` | <p>Can either be <code>download</code> or <code>upload</code></p> | `true` | `""` |
| `gpg-private-key` | <p>GPG Private Key to sign the release artifacts</p> | `false` | `""` | | `gpg-private-key` | <p>GPG Private Key to sign the release artifacts</p> | `false` | `""` |
| `gpg-passphrase` | <p>Passphrase of the GPG Private Key</p> | `false` | `""` | | `gpg-passphrase` | <p>Passphrase of the GPG Private Key</p> | `false` | `""` |
| `download-retry` | <p>Number of times to retry if the release is not ready (default 1)</p> | `false` | `""` | | `download-retry` | <p>Number of times to retry if the release is not ready (default 1)</p> | `false` | `""` |
| `download-latest` | <p>Download the latest release</p> | `false` | `false` | | `download-latest` | <p>Download the latest release</p> | `false` | `false` |
| `verbose` | <p>Increase the verbosity level</p> | `false` | `false` | | `verbose` | <p>Increase the verbosity level</p> | `false` | `false` |
| `override` | <p>Override an existing release by the same {tag}</p> | `false` | `false` | | `override` | <p>Override an existing release by the same <code>{tag}</code></p> | `false` | `false` |
| `prerelease` | <p>Mark Release as Pre-Release</p> | `false` | `false` | | `prerelease` | <p>Mark Release as Pre-Release</p> | `false` | `false` |
| `release-notes-assistant` | <p>Generate release notes with Release Notes Assistant</p> | `false` | `false` |
| `hide-archive-link` | <p>Hide the archive links</p> | `false` | `false` |
<!-- action-docs-inputs source="action.yml" --> <!-- action-docs-inputs source="action.yml" -->
## Example ## Examples
### Upload ### Upload
Upload the release located in `release-dir` to the release section of a repository (`url` and `repo`):
```yaml ```yaml
on: [tag]
jobs: jobs:
upload-release: upload-release:
runs-on: ubuntu-latest runs-on: docker
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/forgejo-release@v1 - uses: actions/forgejo-release@v2.6.0
with: with:
direction: upload direction: upload
url: https://code.forgejo.org url: https://my-forgejo-instance.net
repo: myuser/myrepo
token: ${{ secrets.WRITE_TOKEN_TO_MYREPO }}
tag: v1.0.0
release-dir: dist/release release-dir: dist/release
release-notes: "MY RELEASE NOTES" release-notes: "MY RELEASE NOTES"
``` ```
@ -52,21 +58,30 @@ jobs:
Example downloading the forgejo release v1.21.4-0 into the working directory: Example downloading the forgejo release v1.21.4-0 into the working directory:
```yaml ```yaml
on: [tag]
jobs: jobs:
download-release: download-release:
runs-on: ubuntu-latest runs-on: docker
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: actions/forgejo-release@v1 - uses: actions/forgejo-release@v2.6.0
with: with:
direction: download direction: download
url: https://code.forgejo.org url: https://my-forgejo-instance.net
repo: forgejo/forgejo repo: myuser/myrepo
tag: v1.21.4-0 token: ${{ secrets.READ_TOKEN_TO_MYREPO }}
tag: v1.0.0
release-dir: ./ # by default, files are downloaded into dist/release release-dir: ./ # by default, files are downloaded into dist/release
``` ```
## Update the README ### Real world example
With https://github.com/npalm/action-docs `action-docs --update-readme` This action is used to [publish](https://code.forgejo.org/forgejo/release-notes-assistant/src/commit/09f2c22d80d5ee655783cfeb2c1d4bab4afec3e4/.forgejo/workflows/release.yml) the release notes assistant assets.
## Update the `input` section of the README
Using [action-docs](https://github.com/npalm/action-docs):
```shell
# Edit the action.yml file and run:
action-docs --update-readme
```

View file

@ -6,24 +6,28 @@ description: |
inputs: inputs:
url: url:
description: 'URL of the Forgejo instance' description: 'URL of the Forgejo instance'
default: '${{ env.GITHUB_SERVER_URL }}'
repo: repo:
description: 'owner/project relative to the URL' description: 'owner/project relative to the URL'
default: '${{ github.repository }}'
tag: tag:
description: 'Tag of the release' description: 'Tag of the release'
default: '${{ github.ref_name }}'
title: title:
description: 'Title of the release (defaults to tag)' description: 'Title of the release (defaults to tag)'
sha: sha:
description: 'SHA of the release' description: 'SHA of the release'
default: '${{ github.sha }}'
token: token:
description: 'Forgejo application token' description: 'Forgejo application token'
required: true default: '${{ secrets.GITHUB_TOKEN }}'
release-dir: release-dir:
description: 'Directory in whichs release assets are uploaded or downloaded' description: 'Directory in whichs release assets are uploaded or downloaded'
required: true required: true
release-notes: release-notes:
description: 'Release notes' description: 'Release notes'
direction: direction:
description: 'Can either be download or upload' description: 'Can either be `download` or `upload`'
required: true required: true
gpg-private-key: gpg-private-key:
description: 'GPG Private Key to sign the release artifacts' description: 'GPG Private Key to sign the release artifacts'
@ -33,16 +37,22 @@ inputs:
description: 'Number of times to retry if the release is not ready (default 1)' description: 'Number of times to retry if the release is not ready (default 1)'
download-latest: download-latest:
description: 'Download the latest release' description: 'Download the latest release'
default: 'false' default: false
verbose: verbose:
description: 'Increase the verbosity level' description: 'Increase the verbosity level'
default: 'false' default: false
override: override:
description: 'Override an existing release by the same {tag}' description: 'Override an existing release by the same `{tag}`'
default: 'false' default: false
prerelease: prerelease:
description: 'Mark Release as Pre-Release' description: 'Mark Release as Pre-Release'
default: 'false' default: false
release-notes-assistant:
description: 'Generate release notes with Release Notes Assistant'
default: false
hide-archive-link:
description: 'Hide the archive links'
default: false
runs: runs:
using: "composite" using: "composite"
@ -51,25 +61,15 @@ runs:
shell: bash shell: bash
- run: | - run: |
export FORGEJO="${{ inputs.url }}" export FORGEJO="${{ inputs.url }}"
if test -z "$FORGEJO"; then
export FORGEJO="${{ env.GITHUB_SERVER_URL }}"
fi
# A trailing / will mean http://forgejo//api/v1 is used # A trailing / will mean http://forgejo//api/v1 is used
# and it always 401 as of v1.19, because of the double slash # and it always 401 as of v1.19, because of the double slash
FORGEJO=${FORGEJO%%/} FORGEJO=${FORGEJO%%/}
export SCHEME=${FORGEJO%://*}
export HOST=${FORGEJO#*://}
export REPO="${{ inputs.repo }}" export REPO="${{ inputs.repo }}"
if test -z "$REPO"; then
export REPO="${{ github.repository }}"
fi
export TAG="${{ inputs.tag }}" export TAG="${{ inputs.tag }}"
if test -z "$TAG"; then
export TAG="${{ github.ref_name }}"
# until https://code.forgejo.org/forgejo/runner/issues/9 is fixed
# trim refs/tags/
TAG=${TAG##refs/tags/}
fi
export TITLE="${{ inputs.title }}" export TITLE="${{ inputs.title }}"
@ -77,6 +77,10 @@ runs:
export PRERELEASE="${{ inputs.prerelease }}" export PRERELEASE="${{ inputs.prerelease }}"
export RELEASE_NOTES_ASSISTANT="${{ inputs.release-notes-assistant }}"
export HIDE_ARCHIVE_LINK="${{ inputs.hide-archive-link }}"
export TOKEN="${{ inputs.token }}" export TOKEN="${{ inputs.token }}"
export RELEASE_DIR="${{ inputs.release-dir }}" export RELEASE_DIR="${{ inputs.release-dir }}"
@ -87,9 +91,6 @@ runs:
) )
export SHA="${{ inputs.sha }}" export SHA="${{ inputs.sha }}"
if test -z "$SHA"; then
export SHA="${{ github.sha }}"
fi
export OVERRIDE="${{ inputs.override }}" export OVERRIDE="${{ inputs.override }}"

View file

@ -12,104 +12,159 @@ if ${VERBOSE:-false}; then set -x; fi
: ${DOWNLOAD_LATEST:=false} : ${DOWNLOAD_LATEST:=false}
: ${TMP_DIR:=$(mktemp -d)} : ${TMP_DIR:=$(mktemp -d)}
: ${GNUPGHOME:=$TMP_DIR} : ${GNUPGHOME:=$TMP_DIR}
: ${BIN_DIR:=$TMP_DIR} : ${TEA_BIN:=$TMP_DIR/tea}
: ${TEA_VERSION:=0.9.0} : ${TEA_VERSION:=0.9.0}
: ${OVERRIDE:=false} : ${OVERRIDE:=false}
: ${HIDE_ARCHIVE_LINK:=false}
: ${RETRY:=1} : ${RETRY:=1}
: ${DELAY:=10} : ${DELAY:=10}
TAG_FILE="$TMP_DIR/tag$$.json"
export GNUPGHOME export GNUPGHOME
setup_tea() { setup_tea() {
if ! test -f $BIN_DIR/tea ; then if which tea 2>/dev/null; then
ARCH=$(dpkg --print-architecture) TEA_BIN=$(which tea)
curl -sL https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-$ARCH > $BIN_DIR/tea else ! test -f $TEA_BIN;
chmod +x $BIN_DIR/tea ARCH=$(dpkg --print-architecture)
curl -sL https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-"$ARCH" >$TEA_BIN
chmod +x $TEA_BIN
fi
}
get_tag() {
if ! test -f "$TAG_FILE"; then
if api GET repos/$REPO/tags/"$TAG" >"$TAG_FILE"; then
echo "tag $TAG exists"
else
echo "tag $TAG does not exists"
fi
fi
test -s "$TAG_FILE"
}
matched_tag() {
if get_tag; then
local sha=$(jq --raw-output .commit.sha <"$TAG_FILE")
test "$sha" = "$SHA"
else
return 1
fi fi
} }
ensure_tag() { ensure_tag() {
if api GET repos/$REPO/tags/$TAG > $TMP_DIR/tag.json ; then if get_tag; then
local sha=$(jq --raw-output .commit.sha < $TMP_DIR/tag.json) if ! matched_tag; then
if test "$sha" != "$SHA" ; then cat "$TAG_FILE"
cat $TMP_DIR/tag.json echo "the tag SHA in the $REPO repository does not match the tag SHA that triggered the build: $SHA"
echo "the tag SHA in the $REPO repository does not match the tag SHA that triggered the build: $SHA" return 1
false fi
fi
else else
api POST repos/$REPO/tags --data-raw '{"tag_name": "'$TAG'", "target": "'$SHA'"}' create_tag
fi
}
create_tag() {
api POST repos/$REPO/tags --data-raw '{"tag_name": "'"$TAG"'", "target": "'"$SHA"'"}' >"$TAG_FILE"
}
delete_tag() {
if get_tag; then
api DELETE repos/$REPO/tags/$TAG
rm -f "$TAG_FILE"
fi fi
} }
upload_release() { upload_release() {
local assets=$(ls $RELEASE_DIR/* | sed -e 's/^/-a /') # assets is defined as a list of arguments, where values may contain whitespace and need to be quoted like this -a "my file.txt" -a "file.txt".
local releasetype # It is expanded using "${assets[@]}" which preserves the separation of arguments and not split whitespace containing values.
( $PRERELEASE || echo "${TAG}" | grep -qi '\-rc' ) && export releasetype="--prerelease" && echo "Uploading as Pre-Release" # For reference, see https://github.com/koalaman/shellcheck/wiki/SC2086#exceptions
test ${releasetype+false} || echo "Uploading as Stable" local assets=()
ensure_tag for file in "$RELEASE_DIR"/*; do
anchor=$(echo $TAG | sed -e 's/^v//' -e 's/[^a-zA-Z0-9]/-/g') assets=("${assets[@]}" -a "$file")
if ! $BIN_DIR/tea release create $assets --repo $REPO --note "$RELEASENOTES" --tag $TAG --title "$TITLE" --draft ${releasetype} >& $TMP_DIR/tea.log ; then done
if grep --quiet 'Unknown API Error: 500' $TMP_DIR/tea.log && grep --quiet services/release/release.go:194 $TMP_DIR/tea.log ; then if $PRERELEASE || echo "${TAG}" | grep -qi '\-rc'; then
echo "workaround v1.20 race condition https://codeberg.org/forgejo/forgejo/issues/1370" releaseType="--prerelease"
sleep 10 echo "Uploading as Pre-Release"
$BIN_DIR/tea release create $assets --repo $REPO --note "$RELEASENOTES" --tag $TAG --title "$TITLE" --draft ${releasetype} else
else echo "Uploading as Stable"
cat $TMP_DIR/tea.log
return 1
fi
fi fi
ensure_tag
if ! $TEA_BIN release create "${assets[@]}" --repo $REPO --note "$RELEASENOTES" --tag "$TAG" --title "$TITLE" --draft ${releaseType} >&"$TMP_DIR"/tea.log; then
if grep --quiet 'Unknown API Error: 500' "$TMP_DIR"/tea.log && grep --quiet services/release/release.go:194 "$TMP_DIR"/tea.log; then
echo "workaround v1.20 race condition https://codeberg.org/forgejo/forgejo/issues/1370"
sleep 10
$TEA_BIN release create "${assets[@]}" --repo $REPO --note "$RELEASENOTES" --tag "$TAG" --title "$TITLE" --draft ${releaseType}
else
cat "$TMP_DIR"/tea.log
return 1
fi
fi
maybe_use_release_note_assistant
release_draft false release_draft false
} }
release_draft() { release_draft() {
local state="$1" local state="$1"
local id=$(api GET repos/$REPO/releases/tags/$TAG | jq --raw-output .id) local id=$(api GET repos/$REPO/releases/tags/"$TAG" | jq --raw-output .id)
api PATCH repos/$REPO/releases/$id --data-raw '{"draft": '$state'}'
api PATCH repos/$REPO/releases/"$id" --data-raw '{"draft": '"$state"', "hide_archive_links": '$HIDE_ARCHIVE_LINK'}'
}
maybe_use_release_note_assistant() {
if "$RELEASE_NOTES_ASSISTANT"; then
curl --fail -s -S -o rna https://code.forgejo.org/forgejo/release-notes-assistant/releases/download/v1.2.3/release-notes-assistant
chmod +x ./rna
./rna --storage release --storage-location "$TAG" --forgejo-url "$SCHEME"://placeholder:"$TOKEN"@"$HOST" --repository $REPO --token "$TOKEN" release "$TAG"
fi
} }
sign_release() { sign_release() {
local passphrase local passphrase
if test -s "$GPG_PASSPHRASE"; then if test -s "$GPG_PASSPHRASE"; then
passphrase="--passphrase-file $GPG_PASSPHRASE" passphrase="--passphrase-file $GPG_PASSPHRASE"
fi fi
gpg --import --no-tty --pinentry-mode loopback $passphrase "$GPG_PRIVATE_KEY" gpg --import --no-tty --pinentry-mode loopback $passphrase "$GPG_PRIVATE_KEY"
for asset in $RELEASE_DIR/* ; do for asset in "$RELEASE_DIR"/*; do
if [[ $asset =~ .sha256$ ]] ; then if [[ $asset =~ .sha256$ ]]; then
continue continue
fi fi
gpg --armor --detach-sign --no-tty --pinentry-mode loopback $passphrase < $asset > $asset.asc gpg --armor --detach-sign --no-tty --pinentry-mode loopback $passphrase <"$asset" >"$asset".asc
done done
} }
maybe_sign_release() { maybe_sign_release() {
if test -s "$GPG_PRIVATE_KEY"; then if test -s "$GPG_PRIVATE_KEY"; then
sign_release sign_release
fi fi
} }
maybe_override() { maybe_override() {
if test "$OVERRIDE" = "false"; then if test "$OVERRIDE" = "false"; then
return return
fi
api DELETE repos/$REPO/releases/tags/"$TAG" >&/dev/null || true
if get_tag && ! matched_tag; then
delete_tag
fi fi
api DELETE repos/$REPO/releases/tags/$TAG >& /dev/null || true
api DELETE repos/$REPO/tags/$TAG >& /dev/null || true
} }
upload() { upload() {
setup_api setup_api
setup_tea setup_tea
rm -f ~/.config/tea/config.yml rm -f ~/.config/tea/config.yml
GITEA_SERVER_TOKEN=$TOKEN $BIN_DIR/tea login add --url $FORGEJO GITEA_SERVER_TOKEN=$TOKEN $TEA_BIN login add --url $FORGEJO
maybe_sign_release maybe_sign_release
maybe_override maybe_override
upload_release upload_release
} }
setup_api() { setup_api() {
if ! which jq curl ; then if ! which jq curl; then
apt-get -qq update apt-get -qq update
apt-get install -y -qq jq curl apt-get install -y -qq jq curl
fi fi
} }
@ -119,46 +174,46 @@ api() {
path=$1 path=$1
shift shift
curl --fail -X $method -sS -H "Content-Type: application/json" -H "Authorization: token $TOKEN" "$@" $FORGEJO/api/v1/$path curl --fail -X "$method" -sS -H "Content-Type: application/json" -H "Authorization: token $TOKEN" "$@" $FORGEJO/api/v1/"$path"
} }
wait_release() { wait_release() {
local ready=false local ready=false
for i in $(seq $RETRY); do for i in $(seq $RETRY); do
if api GET repos/$REPO/releases/tags/$TAG | jq --raw-output .draft > $TMP_DIR/draft; then if api GET repos/$REPO/releases/tags/"$TAG" | jq --raw-output .draft >"$TMP_DIR"/draft; then
if test "$(cat $TMP_DIR/draft)" = "false"; then if test "$(cat "$TMP_DIR"/draft)" = "false"; then
ready=true ready=true
break break
fi fi
echo "release $TAG is still a draft" echo "release $TAG is still a draft"
else else
echo "release $TAG does not exist yet" echo "release $TAG does not exist yet"
fi fi
echo "waiting $DELAY seconds" echo "waiting $DELAY seconds"
sleep $DELAY sleep $DELAY
done done
if ! $ready ; then if ! $ready; then
echo "no release for $TAG" echo "no release for $TAG"
return 1 return 1
fi fi
} }
download() { download() {
setup_api setup_api
( (
mkdir -p $RELEASE_DIR mkdir -p $RELEASE_DIR
cd $RELEASE_DIR cd $RELEASE_DIR
if [[ ${DOWNLOAD_LATEST} == "true" ]] ; then if [[ ${DOWNLOAD_LATEST} == "true" ]]; then
echo "Downloading the latest release" echo "Downloading the latest release"
api GET repos/$REPO/releases/latest > $TMP_DIR/assets.json api GET repos/$REPO/releases/latest >"$TMP_DIR"/assets.json
elif [[ ${DOWNLOAD_LATEST} == "false" ]] ; then elif [[ ${DOWNLOAD_LATEST} == "false" ]]; then
wait_release wait_release
echo "Downloading tagged release ${TAG}" echo "Downloading tagged release ${TAG}"
api GET repos/$REPO/releases/tags/$TAG > $TMP_DIR/assets.json api GET repos/$REPO/releases/tags/"$TAG" >"$TMP_DIR"/assets.json
fi fi
jq --raw-output '.assets[] | "\(.name) \(.browser_download_url)"' < $TMP_DIR/assets.json | while read name url ; do jq --raw-output '.assets[] | "\(.browser_download_url) \(.name)"' <"$TMP_DIR"/assets.json | while read url name; do # `name` may contain whitespace, therefore, it must be last
curl --fail -H "Authorization: token $TOKEN" -o $name -L $url curl --fail -H "Authorization: token $TOKEN" -o "$name" -L "$url"
done done
) )
} }

22
renovate.json Normal file
View file

@ -0,0 +1,22 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"local>actions/renovate-config"
],
"customManagers": [
{
"customType": "regex",
"description": "update example in README.md",
"managerFilePatterns": [
"/^README.md$/"
],
"matchStrings": [
"uses: actions/forgejo-release@(?<currentValue>v\\d+\\.\\d+\\.\\d+)"
],
"datasourceTemplate": "gitea-tags",
"depNameTemplate": "actions/forgejo-release",
"versioningTemplate": "semver",
"registryUrlTemplate": "https://code.forgejo.org"
}
]
}

View file

@ -2,6 +2,21 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
set -ex set -ex
PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: '
test_system_tea_bin() {
SYSTEM_TEA_BIN=$TMP_DIR/tea
touch $SYSTEM_TEA_BIN && chmod +x $SYSTEM_TEA_BIN
export PATH=$TMP_DIR:$PATH
setup_tea
test $TEA_BIN == $SYSTEM_TEA_BIN
}
test_download_tea_bin() {
# assume tea is not installed on system
setup_tea
test $TEA_BIN == $TMP_DIR/tea
}
test_teardown() { test_teardown() {
setup_api setup_api
@ -9,7 +24,7 @@ test_teardown() {
api DELETE repos/$REPO/tags/$TAG || true api DELETE repos/$REPO/tags/$TAG || true
rm -fr dist/release rm -fr dist/release
setup_tea setup_tea
$BIN_DIR/tea login delete $DOER || true $TEA_BIN login delete $DOER || true
} }
test_reset_repo() { test_reset_repo() {
@ -38,24 +53,37 @@ test_wait_release() {
! wait_release ! wait_release
} }
test_create_delete_tag() {
delete_tag
! get_tag
create_tag
get_tag
delete_tag
! get_tag
}
test_ensure_tag() { test_ensure_tag() {
api DELETE repos/$REPO/tags/$TAG || true delete_tag
# #
# idempotent # idempotent
# #
ensure_tag ensure_tag
api GET repos/$REPO/tags/$TAG > $TMP_DIR/tag1.json mv $TAG_FILE $TMP_DIR/tag1.json
ensure_tag ensure_tag
api GET repos/$REPO/tags/$TAG > $TMP_DIR/tag2.json mv $TAG_FILE $TMP_DIR/tag2.json
diff -u $TMP_DIR/tag[12].json diff -u $TMP_DIR/tag[12].json
# #
# sanity check on the SHA of an existing tag # sanity check on the SHA of an existing tag
# #
( (
SHA=12345 SHA=12345
! ensure_tag ! matched_tag
! ensure_tag
) )
api DELETE repos/$REPO/tags/$TAG delete_tag
} }
test_maybe_sign_release_no_gpg() { test_maybe_sign_release_no_gpg() {
@ -94,8 +122,8 @@ test_maybe_sign_release_skipped() {
} }
test_maybe_sign_release_verify() { test_maybe_sign_release_verify() {
for file in $RELEASE_DIR/file-one.txt $RELEASE_DIR/file-two.txt; do for file in $RELEASE_DIR/file-one.txt $RELEASE_DIR/file-two.txt; do
gpg --verify $file.asc $file gpg --verify $file.asc $file
done done
} }
@ -129,6 +157,7 @@ test_run() {
REPO=$user/$project REPO=$user/$project
test_setup $project test_setup $project
test_ensure_tag test_ensure_tag
test_create_delete_tag
DELAY=0 DELAY=0
test_wait_release_fail test_wait_release_fail
echo "================================ TEST BEGIN" echo "================================ TEST BEGIN"

View file

@ -1,81 +1,81 @@
-----BEGIN PGP PRIVATE KEY BLOCK----- -----BEGIN PGP PRIVATE KEY BLOCK-----
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
=5CPG =t+01
-----END PGP PRIVATE KEY BLOCK----- -----END PGP PRIVATE KEY BLOCK-----

View file

@ -1,83 +1,17 @@
-----BEGIN PGP PRIVATE KEY BLOCK----- -----BEGIN PGP PRIVATE KEY BLOCK-----
lQWGBGRwcUEBDACzKYvl19Gqzdu2rwLx+Me+GvJkSemnvxdPvZhg+94uLmn+9oZp lIYEaF6UehYJKwYBBAHaRw8BAQdAPKJ2JvwUyE7dy8bjVgBCjdRXSTw2BPl6wayP
jmaLA8Kbjb73zfitKOdJojRKuBwyNtP7iPt85nWeWwq4LKHCQUo81Uh4lzv/0N58 o0WwhvT+BwMC8CxbenuzELD/Z524BTjgiXXgPS8rnRkSqww5Swa0d4mhtTn2w0pq
PNwFdRCHtD8MnhBRNv/kwccXyriikVbbi/dj+ISdKE7ueZ7SjgMFAa8JouiFldqZ jRnHmVyLhh9n7e8GZaS9+8CFu3UWtkHgbRrzdyRg9KuFaW0ogcWA5bQmVGVzdCBV
uU7FgxaFxQ5o5NqTJF4XOdZQakW2A5PhLDmEMQ/fPJ5gFXPBzu+yCvAo0G6QkcJ5 c2VyIDx0ZXN0cGFzc3BocmFzZUBleGFtcGxlLmNvbT6IkwQTFgoAOxYhBF3PQjaj
43mEOpJQwS79I1a8oS5txGiV0jP8PtyyAdIGuPW2B3oxmaNXllttYg2pnYR0Tr96 rT/hLkdhdu9/tDIYmfSXBQJoXpR6AhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4H
5uMr8B2wcBdWAewH1wP0QKcKol5vxYuSwCOkwIjXtSLWMpYjtaS4FcWObUhvJiDI AheAAAoJEO9/tDIYmfSX0zsBAJ4Tay/2jNMqye9RfiEn6B5e5IO+QymL52q6bF1z
ypjLn1y2H6hW3oNT9W5nvaEgWqafdwBhF2BQJYcxAAmqIoIRY8k/JMLKuG6xdM4b ZNLDAP94yfwvG+7fL6W3XOTUr9unsCU9W0T0lAfFLmZY2WoeApyLBGhelHoSCisG
opCCo37syvcHU4jNvXu7vr/8w7Y5Wc/yIVQARcm65DAZ3OPmIYKp8BDUnDgweUZj AQQBl1UBBQEBB0BMy3qqyiYPkalTZNUw/VSgHEOJF0Yi6fFi+DnEWtapKAMBCAf+
WaOWdYGB7+c8rDUAEQEAAf4HAwKdrS9IwGeeff9kQReq6FHd6Pp8KB807eqDBUAj BwMCla2r1+brAiD/zuhRDXfJC1oRoEnDq/JgmsU14t6PNCPK6MPA+dmV3kCIVbjy
BnUUtIE3iK2HJ++GohBXZemzTu4zl62krIGwWcwoqfckv9dIkWioem9JMbL7q4Jm A97PMx6HBSTJZYdzGY8e2XdwzrVG4vbzH2yJ55LbawgFYIh4BBgWCgAgFiEEXc9C
6IChJ+EFvV6+I+C0lzM7L1lgKp6NZdcCnpfpSMrInVqzUqe4EbNaTDX5sN2IwdzR NqOtP+EuR2F273+0MhiZ9JcFAmhelHoCGwwACgkQ73+0MhiZ9JeinQEAip+eryNU
8rorZcQSL/ncDXg7vAhBtiKArtfyIPsWoxvEcPJ42ZMY3qM5p8zFmzoJsDwO2MWc T9X80S4YilMZg7djkmGfMJnEZiKYU8TEsFQBAN2D3PDAVNKs2ZOVp1GQMDse7sQ6
K+UFrXJYZG43NoAOR5g7A+tHdcPLdQ/FT87tamyyULrVWnS6hDser4KlBN+Ez7bt 5C3faX2ZMchuKLwF
GACWa2bYee+fn0VssWGhGxeV6coICmNENPRFtiQYMhvIbdS22Np+7ym6+7XJ6P0g =RH4D
f0iVi+3t3THXIJ84A/3uNnT2QG8BGmABsNzqK9TVMtHb4u8zLt6oG68WfnEumUo8
ycm4PPstDuhd623b/aaqvD51tDsZR4GRYruM+LeHKGi6UYMCUutoUvna1aRgnz8D
OCxz2emm+xsayz/+wo7UbD6CiTC9SPK0eAMYCghl0/wOcUFfp2hb8S7xzHg+HSEe
vSUjM0V1Qf6l2AfsaWy1Yy/0ZtRtBNyxVkSwsmbvvUif9lXZNYsOnMSOTV4rmYwo
QzKirhonkTkYv62GBRJZTYEVENrY9qUGrkYgCluGrVVNzFw2rTemvqX5IskMaaAZ
EW4tSlP0fWs4DNiQQutCmKO/0FVgl1uWy2kSDEqSTE3/kT8Y+9hlj/itM9n7J4DT
EqOhPZPit23OG5ahbGPUEODjXONmAlbwXmEUGf9KsnOaCRv2xYW9iT7fJrA7ivbV
/DVwIprkbA6ACuSg4Fia+5DibxXh/JfSU3R9o1ugspZ9wbE8ay5GPbKrqSTT1Jlu
JB0eY3HEDMEtVqbItedV2D7a/V5nfW3tZrIma0MyE7kAfJ3+ZqXWXww9ASLTUoZO
wT9VFj8ktF+4fjKIHoycR8IInl56T4xhoz9CTzaHOvk8GHZF4+FX+G2/IkFdinkb
Qbia26fGoS51o/rqzIHo4T15oBWXLSx7oHQhyyypzeRHmOKiStUI/rBnghl2Q8oJ
xE/PUtXJDPkJHwc6cSCTV81G2kRQVh4iZg9ixJsXvNdAlB1GGOJH3VDuxPPCRq3s
zJAPXOO28TwHyTipiw/wJ8Soyg4xpyoI2cp/CNpdo5f1mAruPr7XrdOHkl3obxRe
OCVCmyevgg1PX9uV4JncRtsiFje+RJFuLTjkMVZLmccnUNqi/CpA5dPmHkg+0uK1
1MVB+SJvjqr7ag+WbJuecuE84VD5Gr66CinOywfluRA+pLGdCIuxRZdTmgiVeh5S
bH3jhXBljzhFK2I9GJ0RVKDRsdu6iOrEW7QmVGVzdCBVc2VyIDx0ZXN0cGFzc3Bo
cmFzZUBleGFtcGxlLmNvbT6JAdQEEwEKAD4WIQTG5NstFF+myfSEwuHX3t0O/q5z
ogUCZHBxQQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDX3t0O
/q5zolo2C/429RV2EhFG5EYKfLCd72ANLzUX9Kezk8tq3JDOYkRuqGF2y6HzuAcx
DYytRoyxTkCpxiuwPnxnU76cSSxn5+UZD+0sa5OGZYMtrCVSd56dXQkK0drf+RUo
apFLC6ufWmHox74ZIuTyPLj4YlsbSU3mE8CqVWY4Svk5W920wZDS7lrHSkXtKqh2
QtE/7/mTXCxu1HNqfck5ROIbA0MTKX2FG+3gujjJcZBEI8nkIdvI0XouOHXLZLKq
kh8//w1XsQeielOXO/+pQyT3lSwcZry4F112S4bMO+R12uWO6Hxwe9LoQb3gDmO5
H9LsssdpHC+bhJnTURGixiMuyzjFSmfVzzgU2YeP69R+GHxLMwMAo/a89eWFxiZI
6jMOx7TgYC9fg+Z8weTBq8fy8E5tT/LJm2VrBm3vuTgC4MePdBDy+AuEPyt3J2fX
1KS2vNlASeh6ONhMk+BMVWG0KWs3GVyF2DcXUCTX1xVI9uT+eJSR7UPJ+kRnIfO0
RzxL30Qxvw6dBYYEZHBxQQEMAMDLFiDTpnqsjH9li97yBOdG3SOu9EttdQXXopdh
EPJDxDCBHqfZvfjHuA5gfIP8bghQsXYCnn5k6dHZHdkJ9LfJTj8Wyh2cumhxPO2e
wbOmhQgLC54hmi0s64tj9GxM95aZk8umkTdXt+F9a4WihHGlgeCdpq+B6EQodDCU
ysJgnlCUGgjK/ptl4PhQtsgXk/mw0oOQukoulFFkfdlLEhWYNMz0/5oAMdGLa//W
8cjK2E5UN3/1PFF1nvzsHca/fGb1JvUwgrTjeJC4H10Vo4KvmYkpb943auoGJEJU
QbM/A7cDQvzB1OD/UpG6vYmarXCjGe2ZrJs+RI+bXMXLfsdCveLo1DPhpF7hLD+t
F2NI9oM/cEXuQBwl3mLOjFOn0Q1jXDD0uyzEJN7DKlnITyBV87hv2+hMGftnQwmX
iXw8rkBeaDLl4ShG3MLCr8KpcvtgtVf9ceZxO6K0CGTj+VSfKQ34HrWEoNzNoRoM
5dSPK6YXNRL2JizVRrAkVoRCzwARAQAB/gcDAqMHMJr6Gorz/9bZTyXQGO/oXkN8
D+G3Gn0n0iAmsH1nBo1qo61JosRAhhO+Z286F33tS/TqcblQVCsgPYFN93qX1yoB
RON619o3s+mF9PtSLvbUDdUa04eLarhH3RoCkkpoh+3df0xw+Jtpx2+eZibo32vb
U0e9lIO9Kv1I11Y2xSymFTzO+hK7IKYAvP9uzYty/r0rcgotJHr4B+k5jCQHXZhW
u0/68b7Y/JOUxKSag5r3PyyDWyJibRGi2ILwKogL5D4YdAtZYUNemmK9Is31NIs/
6jWHedOuRsBlM46NwwJs8ybtqy0TLDQhfrn2jUY/U+BMWSV4u8Ra33PaOyqv/EeN
hbySg2DTVnAlxzdw/z7oDPROtW1FzdFPVvOAUYOGuzlEhVAVzdhX9EfBahMIy7/B
sSlKoFOCMOngsnFrmxAMbUW49ZoTRzAunTVFNgqQJZLHmzPiyyierNP5FzjG+wO+
lprurp8RXFQ2KQ5hoF8Mw+F4V+mP+RAtO5P05rcp/PJafwdvxS03LZZchB3hRWQi
pGBum37nxN4ztbduUwWk+DKgB1pkPthF+i2cKlBgNzL/bfbmJoiIZghUKIgCZoXp
3PRwa2DM4CoFoC5FuhFV50CpqbrVeZAAK2Q3InphbdWZb5os9YqFfteLzk316zCj
vqftiZ4C5WPqMtesLGSeXNOna8vm5AOzt8qohmrLhdoONxBqf3sbykyzU567AWtm
P02u1JWQgGJnsRO+3j441VSK5SSmolCdDP+LspfZPCRZel+pBwlTJ6IpuFxB7zj1
UpkfT6r//bVfriwe6rFZ0VI3BfefJLrCIrgI0V/IFu1rjcciNV1PXwAdJNNhN3X4
4zPktSVR8u/Nz8jNgdSgXBYMkuv+QTjvzBvCMu5tP7ufXVXG6jAEJHeUh+633HGJ
o6NTsOZFhYwLmwTh4CBplt7bclsysOQGgo3SWHO3axCWrRX9uNVq0uIKjl3CHkqW
3dbQzFlY3raWT9q19g3cuiA8BZqh/NswIQDrOFS4pGrbTQFWY0zQZqFlHEyVCgwb
TtbcpjOBy3O2fsbFvepYDbcTYbmcacZSZFtTMiQGt3Ga+TeGsO+VIUzNgmpLkyWS
1QQjvqNKZnKWT6f4A7Lbj1OZqG/v4540jmOxShcHrz2Klwdrra6Ie7yERYmyPMZJ
98r2BFk04QaYK7r9xy7hJGBDmwT0VOcJXDAVA3HJJHGltnNKke2vP95JLmyahORP
efEsi0UPsQqkCS7iWV9ucUtKEnYzoHFSeSXU64+Cme6T+7FxJ9E2f5Ep88nz7ucg
EwgSiWsdqzEjntq5MAr6rSSk8ZKPzRbR61exuf7tWRa1iQG8BBgBCgAmFiEExuTb
LRRfpsn0hMLh197dDv6uc6IFAmRwcUECGwwFCQPCZwAACgkQ197dDv6uc6K7qQv/
brSaC5ICGKIpzsIf6lIp6Wrn7smsGh9BI+dH19prXQ5lT6Iv+IFZmNiDGXtVzOOK
Y8VgqwJmf/XwjgH2dod3X61ts3krtnZ2znCgrz08NRxG4G9ok8Fa5fLCrZBWi7UU
4ZH63rS9optmqEMzwCwQ94U0glU8C9Hc44MVCSrrrD2+/H/PTFVr37iwBugZsDq4
4gUTyGBYumnzTVyi2ZbJn89Amd8fl280QWSkdebmljnk4OjlTZbXkRGiIu65ggr9
ikg11TRlPD0L9NTo8w2OtjoYXr50xL1odyNlz6RKcQlX80EjKMXvVxNE32J4JCBj
tHrqiTDCs1bdXTh2xCvF0DatJMeUn3/WDn6UYjZzlZvZCOcjQLrPgJplJowLwd96
YaUfZ11WNAgNy8vZjUroMNyD2J+GsLr+QZOqFRP362+Juj5MqANXAuKEQ4qzs2Fv
/Z6cUYKuENmsNDY8ORG7ON95AFl5i0daP7+EoHDMb7+tyG54JxE4Szxhe4skRXXr
=Ze5I
-----END PGP PRIVATE KEY BLOCK----- -----END PGP PRIVATE KEY BLOCK-----

View file

@ -10,9 +10,9 @@ jobs:
setup-forgejo: setup-forgejo:
runs-on: self-hosted runs-on: self-hosted
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- id: forgejo - id: forgejo
uses: https://code.forgejo.org/actions/setup-forgejo@v1 uses: https://code.forgejo.org/actions/setup-forgejo@v2.0.11
with: with:
user: testuser user: testuser
password: admin1234 password: admin1234

View file

@ -4,93 +4,95 @@ name: Upload/download a signed release (no GPG passphrase)
on: [push] on: [push]
env: env:
gpg_private_key: | gpg_private_key: |
-----BEGIN PGP PRIVATE KEY BLOCK----- -----BEGIN PGP PRIVATE KEY BLOCK-----
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
=5CPG =t+01
-----END PGP PRIVATE KEY BLOCK----- -----END PGP PRIVATE KEY BLOCK-----
jobs: jobs:
upload-gpg-no-passphrase: upload-gpg-no-passphrase:
runs-on: ubuntu-latest runs-on: docker
container:
image: 'data.forgejo.org/oci/node:22-bookworm'
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
id: release-upload id: release-upload
uses: SELF@vTest uses: SELF@vTest

View file

@ -5,95 +5,29 @@ on: [push]
env: env:
gpg_passphrase: admin1234 gpg_passphrase: admin1234
gpg_private_key: | gpg_private_key: |
-----BEGIN PGP PRIVATE KEY BLOCK----- -----BEGIN PGP PRIVATE KEY BLOCK-----
lQWGBGRwcUEBDACzKYvl19Gqzdu2rwLx+Me+GvJkSemnvxdPvZhg+94uLmn+9oZp lIYEaF6UehYJKwYBBAHaRw8BAQdAPKJ2JvwUyE7dy8bjVgBCjdRXSTw2BPl6wayP
jmaLA8Kbjb73zfitKOdJojRKuBwyNtP7iPt85nWeWwq4LKHCQUo81Uh4lzv/0N58 o0WwhvT+BwMC8CxbenuzELD/Z524BTjgiXXgPS8rnRkSqww5Swa0d4mhtTn2w0pq
PNwFdRCHtD8MnhBRNv/kwccXyriikVbbi/dj+ISdKE7ueZ7SjgMFAa8JouiFldqZ jRnHmVyLhh9n7e8GZaS9+8CFu3UWtkHgbRrzdyRg9KuFaW0ogcWA5bQmVGVzdCBV
uU7FgxaFxQ5o5NqTJF4XOdZQakW2A5PhLDmEMQ/fPJ5gFXPBzu+yCvAo0G6QkcJ5 c2VyIDx0ZXN0cGFzc3BocmFzZUBleGFtcGxlLmNvbT6IkwQTFgoAOxYhBF3PQjaj
43mEOpJQwS79I1a8oS5txGiV0jP8PtyyAdIGuPW2B3oxmaNXllttYg2pnYR0Tr96 rT/hLkdhdu9/tDIYmfSXBQJoXpR6AhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4H
5uMr8B2wcBdWAewH1wP0QKcKol5vxYuSwCOkwIjXtSLWMpYjtaS4FcWObUhvJiDI AheAAAoJEO9/tDIYmfSX0zsBAJ4Tay/2jNMqye9RfiEn6B5e5IO+QymL52q6bF1z
ypjLn1y2H6hW3oNT9W5nvaEgWqafdwBhF2BQJYcxAAmqIoIRY8k/JMLKuG6xdM4b ZNLDAP94yfwvG+7fL6W3XOTUr9unsCU9W0T0lAfFLmZY2WoeApyLBGhelHoSCisG
opCCo37syvcHU4jNvXu7vr/8w7Y5Wc/yIVQARcm65DAZ3OPmIYKp8BDUnDgweUZj AQQBl1UBBQEBB0BMy3qqyiYPkalTZNUw/VSgHEOJF0Yi6fFi+DnEWtapKAMBCAf+
WaOWdYGB7+c8rDUAEQEAAf4HAwKdrS9IwGeeff9kQReq6FHd6Pp8KB807eqDBUAj BwMCla2r1+brAiD/zuhRDXfJC1oRoEnDq/JgmsU14t6PNCPK6MPA+dmV3kCIVbjy
BnUUtIE3iK2HJ++GohBXZemzTu4zl62krIGwWcwoqfckv9dIkWioem9JMbL7q4Jm A97PMx6HBSTJZYdzGY8e2XdwzrVG4vbzH2yJ55LbawgFYIh4BBgWCgAgFiEEXc9C
6IChJ+EFvV6+I+C0lzM7L1lgKp6NZdcCnpfpSMrInVqzUqe4EbNaTDX5sN2IwdzR NqOtP+EuR2F273+0MhiZ9JcFAmhelHoCGwwACgkQ73+0MhiZ9JeinQEAip+eryNU
8rorZcQSL/ncDXg7vAhBtiKArtfyIPsWoxvEcPJ42ZMY3qM5p8zFmzoJsDwO2MWc T9X80S4YilMZg7djkmGfMJnEZiKYU8TEsFQBAN2D3PDAVNKs2ZOVp1GQMDse7sQ6
K+UFrXJYZG43NoAOR5g7A+tHdcPLdQ/FT87tamyyULrVWnS6hDser4KlBN+Ez7bt 5C3faX2ZMchuKLwF
GACWa2bYee+fn0VssWGhGxeV6coICmNENPRFtiQYMhvIbdS22Np+7ym6+7XJ6P0g =RH4D
f0iVi+3t3THXIJ84A/3uNnT2QG8BGmABsNzqK9TVMtHb4u8zLt6oG68WfnEumUo8 -----END PGP PRIVATE KEY BLOCK-----
ycm4PPstDuhd623b/aaqvD51tDsZR4GRYruM+LeHKGi6UYMCUutoUvna1aRgnz8D
OCxz2emm+xsayz/+wo7UbD6CiTC9SPK0eAMYCghl0/wOcUFfp2hb8S7xzHg+HSEe
vSUjM0V1Qf6l2AfsaWy1Yy/0ZtRtBNyxVkSwsmbvvUif9lXZNYsOnMSOTV4rmYwo
QzKirhonkTkYv62GBRJZTYEVENrY9qUGrkYgCluGrVVNzFw2rTemvqX5IskMaaAZ
EW4tSlP0fWs4DNiQQutCmKO/0FVgl1uWy2kSDEqSTE3/kT8Y+9hlj/itM9n7J4DT
EqOhPZPit23OG5ahbGPUEODjXONmAlbwXmEUGf9KsnOaCRv2xYW9iT7fJrA7ivbV
/DVwIprkbA6ACuSg4Fia+5DibxXh/JfSU3R9o1ugspZ9wbE8ay5GPbKrqSTT1Jlu
JB0eY3HEDMEtVqbItedV2D7a/V5nfW3tZrIma0MyE7kAfJ3+ZqXWXww9ASLTUoZO
wT9VFj8ktF+4fjKIHoycR8IInl56T4xhoz9CTzaHOvk8GHZF4+FX+G2/IkFdinkb
Qbia26fGoS51o/rqzIHo4T15oBWXLSx7oHQhyyypzeRHmOKiStUI/rBnghl2Q8oJ
xE/PUtXJDPkJHwc6cSCTV81G2kRQVh4iZg9ixJsXvNdAlB1GGOJH3VDuxPPCRq3s
zJAPXOO28TwHyTipiw/wJ8Soyg4xpyoI2cp/CNpdo5f1mAruPr7XrdOHkl3obxRe
OCVCmyevgg1PX9uV4JncRtsiFje+RJFuLTjkMVZLmccnUNqi/CpA5dPmHkg+0uK1
1MVB+SJvjqr7ag+WbJuecuE84VD5Gr66CinOywfluRA+pLGdCIuxRZdTmgiVeh5S
bH3jhXBljzhFK2I9GJ0RVKDRsdu6iOrEW7QmVGVzdCBVc2VyIDx0ZXN0cGFzc3Bo
cmFzZUBleGFtcGxlLmNvbT6JAdQEEwEKAD4WIQTG5NstFF+myfSEwuHX3t0O/q5z
ogUCZHBxQQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDX3t0O
/q5zolo2C/429RV2EhFG5EYKfLCd72ANLzUX9Kezk8tq3JDOYkRuqGF2y6HzuAcx
DYytRoyxTkCpxiuwPnxnU76cSSxn5+UZD+0sa5OGZYMtrCVSd56dXQkK0drf+RUo
apFLC6ufWmHox74ZIuTyPLj4YlsbSU3mE8CqVWY4Svk5W920wZDS7lrHSkXtKqh2
QtE/7/mTXCxu1HNqfck5ROIbA0MTKX2FG+3gujjJcZBEI8nkIdvI0XouOHXLZLKq
kh8//w1XsQeielOXO/+pQyT3lSwcZry4F112S4bMO+R12uWO6Hxwe9LoQb3gDmO5
H9LsssdpHC+bhJnTURGixiMuyzjFSmfVzzgU2YeP69R+GHxLMwMAo/a89eWFxiZI
6jMOx7TgYC9fg+Z8weTBq8fy8E5tT/LJm2VrBm3vuTgC4MePdBDy+AuEPyt3J2fX
1KS2vNlASeh6ONhMk+BMVWG0KWs3GVyF2DcXUCTX1xVI9uT+eJSR7UPJ+kRnIfO0
RzxL30Qxvw6dBYYEZHBxQQEMAMDLFiDTpnqsjH9li97yBOdG3SOu9EttdQXXopdh
EPJDxDCBHqfZvfjHuA5gfIP8bghQsXYCnn5k6dHZHdkJ9LfJTj8Wyh2cumhxPO2e
wbOmhQgLC54hmi0s64tj9GxM95aZk8umkTdXt+F9a4WihHGlgeCdpq+B6EQodDCU
ysJgnlCUGgjK/ptl4PhQtsgXk/mw0oOQukoulFFkfdlLEhWYNMz0/5oAMdGLa//W
8cjK2E5UN3/1PFF1nvzsHca/fGb1JvUwgrTjeJC4H10Vo4KvmYkpb943auoGJEJU
QbM/A7cDQvzB1OD/UpG6vYmarXCjGe2ZrJs+RI+bXMXLfsdCveLo1DPhpF7hLD+t
F2NI9oM/cEXuQBwl3mLOjFOn0Q1jXDD0uyzEJN7DKlnITyBV87hv2+hMGftnQwmX
iXw8rkBeaDLl4ShG3MLCr8KpcvtgtVf9ceZxO6K0CGTj+VSfKQ34HrWEoNzNoRoM
5dSPK6YXNRL2JizVRrAkVoRCzwARAQAB/gcDAqMHMJr6Gorz/9bZTyXQGO/oXkN8
D+G3Gn0n0iAmsH1nBo1qo61JosRAhhO+Z286F33tS/TqcblQVCsgPYFN93qX1yoB
RON619o3s+mF9PtSLvbUDdUa04eLarhH3RoCkkpoh+3df0xw+Jtpx2+eZibo32vb
U0e9lIO9Kv1I11Y2xSymFTzO+hK7IKYAvP9uzYty/r0rcgotJHr4B+k5jCQHXZhW
u0/68b7Y/JOUxKSag5r3PyyDWyJibRGi2ILwKogL5D4YdAtZYUNemmK9Is31NIs/
6jWHedOuRsBlM46NwwJs8ybtqy0TLDQhfrn2jUY/U+BMWSV4u8Ra33PaOyqv/EeN
hbySg2DTVnAlxzdw/z7oDPROtW1FzdFPVvOAUYOGuzlEhVAVzdhX9EfBahMIy7/B
sSlKoFOCMOngsnFrmxAMbUW49ZoTRzAunTVFNgqQJZLHmzPiyyierNP5FzjG+wO+
lprurp8RXFQ2KQ5hoF8Mw+F4V+mP+RAtO5P05rcp/PJafwdvxS03LZZchB3hRWQi
pGBum37nxN4ztbduUwWk+DKgB1pkPthF+i2cKlBgNzL/bfbmJoiIZghUKIgCZoXp
3PRwa2DM4CoFoC5FuhFV50CpqbrVeZAAK2Q3InphbdWZb5os9YqFfteLzk316zCj
vqftiZ4C5WPqMtesLGSeXNOna8vm5AOzt8qohmrLhdoONxBqf3sbykyzU567AWtm
P02u1JWQgGJnsRO+3j441VSK5SSmolCdDP+LspfZPCRZel+pBwlTJ6IpuFxB7zj1
UpkfT6r//bVfriwe6rFZ0VI3BfefJLrCIrgI0V/IFu1rjcciNV1PXwAdJNNhN3X4
4zPktSVR8u/Nz8jNgdSgXBYMkuv+QTjvzBvCMu5tP7ufXVXG6jAEJHeUh+633HGJ
o6NTsOZFhYwLmwTh4CBplt7bclsysOQGgo3SWHO3axCWrRX9uNVq0uIKjl3CHkqW
3dbQzFlY3raWT9q19g3cuiA8BZqh/NswIQDrOFS4pGrbTQFWY0zQZqFlHEyVCgwb
TtbcpjOBy3O2fsbFvepYDbcTYbmcacZSZFtTMiQGt3Ga+TeGsO+VIUzNgmpLkyWS
1QQjvqNKZnKWT6f4A7Lbj1OZqG/v4540jmOxShcHrz2Klwdrra6Ie7yERYmyPMZJ
98r2BFk04QaYK7r9xy7hJGBDmwT0VOcJXDAVA3HJJHGltnNKke2vP95JLmyahORP
efEsi0UPsQqkCS7iWV9ucUtKEnYzoHFSeSXU64+Cme6T+7FxJ9E2f5Ep88nz7ucg
EwgSiWsdqzEjntq5MAr6rSSk8ZKPzRbR61exuf7tWRa1iQG8BBgBCgAmFiEExuTb
LRRfpsn0hMLh197dDv6uc6IFAmRwcUECGwwFCQPCZwAACgkQ197dDv6uc6K7qQv/
brSaC5ICGKIpzsIf6lIp6Wrn7smsGh9BI+dH19prXQ5lT6Iv+IFZmNiDGXtVzOOK
Y8VgqwJmf/XwjgH2dod3X61ts3krtnZ2znCgrz08NRxG4G9ok8Fa5fLCrZBWi7UU
4ZH63rS9optmqEMzwCwQ94U0glU8C9Hc44MVCSrrrD2+/H/PTFVr37iwBugZsDq4
4gUTyGBYumnzTVyi2ZbJn89Amd8fl280QWSkdebmljnk4OjlTZbXkRGiIu65ggr9
ikg11TRlPD0L9NTo8w2OtjoYXr50xL1odyNlz6RKcQlX80EjKMXvVxNE32J4JCBj
tHrqiTDCs1bdXTh2xCvF0DatJMeUn3/WDn6UYjZzlZvZCOcjQLrPgJplJowLwd96
YaUfZ11WNAgNy8vZjUroMNyD2J+GsLr+QZOqFRP362+Juj5MqANXAuKEQ4qzs2Fv
/Z6cUYKuENmsNDY8ORG7ON95AFl5i0daP7+EoHDMb7+tyG54JxE4Szxhe4skRXXr
=Ze5I
-----END PGP PRIVATE KEY BLOCK-----
jobs: jobs:
upload-gpg: upload-gpg:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
id: release-upload id: release-upload
uses: SELF@vTest uses: SELF@vTest

View file

@ -6,7 +6,7 @@ jobs:
upload-download: upload-download:
runs-on: self-hosted runs-on: self-hosted
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
id: release-upload id: release-upload
uses: SELF@vTest uses: SELF@vTest
@ -25,7 +25,8 @@ jobs:
tag: v1.0 tag: v1.0
token: FORGEJO_TOKEN token: FORGEJO_TOKEN
release-dir: upload-dir release-dir: upload-dir
release-notes: "RELEASE NOTES" release-notes-assistant: true
hide-archive-link: true
override: true override: true
verbose: true verbose: true
- if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - if: ${{ !startsWith(github.ref, 'refs/tags/v') }}

View file

@ -0,0 +1 @@
FILE3