diff --git a/.gitea/workflows/test.yaml b/.gitea/workflows/test.yaml new file mode 100644 index 0000000..c99af0f --- /dev/null +++ b/.gitea/workflows/test.yaml @@ -0,0 +1,20 @@ +name: Core Build (push) +on: + push: + branches-ignore: + - master + +env: + ACTI_BOT_TOKEN: ${{ secrets.ACTI_BOT_TOKEN }} + +jobs: + self-test: + runs-on: ubuntu-latest + steps: + - run: touch text.txt + - uses: https://source.vague.tech/open-vague/ci-actions/publish@feature/1-publish + with: + file: text.txt + package: a-proper-test-package + version: master + force: true \ No newline at end of file diff --git a/README.md b/README.md index 68d6d12..a7132b6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ # gitea-actions +## Setup + +For these actions to work properly one needs a bot account for the token. So, once the bot account is created, generate a token for it with `repository:write` and `package:write` permissions. However that's not enough, even making the bot a repository collaborator is not enough. The bot needs to have permissions on the organization level. + +The recommended way is to create a team in the organization that has access to all repositories and set `Releases:Write` and `Packages:Write` permissions and `Read` for all the rest (yet, strictly speaking that's not necessary) and add the bot to the team. + +The workflow (or jobs individually) needs to define an env variable `ACTI_BOT_TOKEN` with the bots token (as secrets do not automatically propagate into composite action context, at least it didn't work while testing). + +## Publish + +Publishes a `generic` package to current Gitea instance. Example: + +```yaml + - uses: https://source.vague.tech/open-vague/ci-actions/publish@feature/1-publish + with: + file: some-content.json + package: the-package + version: master + force: true +``` + +* `file` - path to the file to upload (used as uploaded file name within the package) +* `package` - the package name +* `version` - the package version, need to be unique (unless force flag is set) +* `force` - false by default; if set **deletes the whole version** of the package (all files) and then publishes instead with the same version \ No newline at end of file diff --git a/publish/action.yaml b/publish/action.yaml new file mode 100644 index 0000000..5fd5685 --- /dev/null +++ b/publish/action.yaml @@ -0,0 +1,44 @@ +name: publish generic package +description: publish generic package into gitea packages + +inputs: + file: + description: file to upload as package + required: true + package: + description: gitea package name + required: true + version: + description: gitea package version + required: true + force: + description: force package replacement keeping the same version + required: false + default: "false" + +runs: + using: composite + steps: + - shell: bash + run: | + set -euo pipefail + if [[ "${{ inputs.force }}" == "true" ]]; then + status="$( + curl --silent --show-error --output /dev/null --write-out '%{http_code}' \ + --user "acti-bot:${ACTI_BOT_TOKEN}" \ + --request DELETE \ + "${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/generic/${{ inputs.package }}/${{ inputs.version }}" + )" + + case "$status" in + 204|404) ;; + *) + echo "Failed to delete existing package version (HTTP ${status})" >&2 + exit 1 + ;; + esac + fi + curl --fail-with-body \ + --user "acti-bot:${ACTI_BOT_TOKEN}" \ + --upload-file ${{ inputs.file }} \ + "${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/generic/${{ inputs.package }}/${{ inputs.version }}/${{ inputs.file }}"