67d2ba9f91
- Release step now authenticates with the RELEASE_TOKEN Actions secret (repo write) instead of the automatic token; drop the now-unneeded permissions block. - Add a step that publishes the skill zip to the Gitea generic packages registry (cycling-training-skill@<tag>) using the REGISTRY_TOKEN secret, handling 200/201/409 responses. - README: document the registry download URL and both secrets. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TqrhBhC3GEcKyaw8RTk8G6
115 lines
4.5 KiB
YAML
115 lines
4.5 KiB
YAML
name: Package skill
|
|
|
|
# Builds the installable Claude-skill zip (dist/cycling-training-<version>.zip).
|
|
#
|
|
# - Push a tag v* -> builds the zip AND attaches it to a Gitea release.
|
|
# - Run manually -> builds the zip and uploads it as a run artifact.
|
|
#
|
|
# Requirements on the Gitea side (already provisioned):
|
|
# * A registered Actions runner (image with bash/zip/curl, e.g. catthehacker/ubuntu).
|
|
# * Actions enabled for this repo (Settings > Actions).
|
|
# * Actions secrets:
|
|
# - RELEASE_TOKEN : token with repo write, used to create the release + upload the asset.
|
|
# - REGISTRY_TOKEN : token with package write, used to publish the zip to the
|
|
# Gitea generic packages registry.
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
workflow_dispatch:
|
|
inputs:
|
|
version:
|
|
description: 'Version label for the zip (e.g. v1.0.0)'
|
|
required: false
|
|
default: 'manual'
|
|
|
|
jobs:
|
|
package:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Determine version
|
|
id: ver
|
|
run: |
|
|
if [ "${{ github.ref_type }}" = "tag" ]; then
|
|
echo "version=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "version=${{ github.event.inputs.version }}" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
- name: Build skill zip
|
|
run: bash scripts/build-skill-zip.sh "${{ steps.ver.outputs.version }}"
|
|
|
|
- name: Upload run artifact
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: cycling-training-skill-${{ steps.ver.outputs.version }}
|
|
path: dist/*.zip
|
|
if-no-files-found: error
|
|
|
|
- name: Attach zip to release
|
|
if: github.ref_type == 'tag'
|
|
env:
|
|
TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
SERVER: ${{ github.server_url }}
|
|
REPO: ${{ github.repository }}
|
|
VERSION: ${{ steps.ver.outputs.version }}
|
|
run: |
|
|
set -euo pipefail
|
|
ZIP="$(ls dist/*.zip | head -1)"
|
|
echo "Publishing ${ZIP} to ${SERVER}/${REPO} release ${VERSION}"
|
|
|
|
# Create the release for this tag; if it already exists, look up its id.
|
|
REL_ID="$(curl -sS -X POST \
|
|
-H "Authorization: token ${TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
"${SERVER}/api/v1/repos/${REPO}/releases" \
|
|
-d "{\"tag_name\":\"${VERSION}\",\"name\":\"${VERSION}\",\"body\":\"Installable Claude-skill package for cycling-training. Download the .zip below and import it in Claude Desktop / claude.ai (Settings > Skills) or unzip into your Claude Code skills directory.\"}" \
|
|
| grep -o '"id":[0-9]*' | head -1 | cut -d: -f2 || true)"
|
|
|
|
if [ -z "${REL_ID}" ]; then
|
|
REL_ID="$(curl -sS \
|
|
-H "Authorization: token ${TOKEN}" \
|
|
"${SERVER}/api/v1/repos/${REPO}/releases/tags/${VERSION}" \
|
|
| grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)"
|
|
fi
|
|
|
|
if [ -z "${REL_ID}" ]; then
|
|
echo "ERROR: could not create or find a release for tag ${VERSION}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
curl -sS -X POST \
|
|
-H "Authorization: token ${TOKEN}" \
|
|
-F "attachment=@${ZIP}" \
|
|
"${SERVER}/api/v1/repos/${REPO}/releases/${REL_ID}/assets?name=$(basename "${ZIP}")"
|
|
echo "Attached $(basename "${ZIP}") to release ${VERSION} (id ${REL_ID})."
|
|
|
|
- name: Publish zip to Gitea packages registry
|
|
if: github.ref_type == 'tag'
|
|
env:
|
|
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
|
|
SERVER: ${{ github.server_url }}
|
|
OWNER: ${{ github.repository_owner }}
|
|
VERSION: ${{ steps.ver.outputs.version }}
|
|
run: |
|
|
set -euo pipefail
|
|
ZIP="$(ls dist/*.zip | head -1)"
|
|
FILE="$(basename "${ZIP}")"
|
|
PACKAGE="cycling-training-skill"
|
|
URL="${SERVER}/api/packages/${OWNER}/generic/${PACKAGE}/${VERSION}/${FILE}"
|
|
echo "Uploading ${FILE} to generic package ${PACKAGE}@${VERSION}"
|
|
CODE="$(curl -sS -o /tmp/reg_resp.txt -w '%{http_code}' -X PUT \
|
|
-H "Authorization: token ${REGISTRY_TOKEN}" \
|
|
--upload-file "${ZIP}" \
|
|
"${URL}")"
|
|
echo "HTTP ${CODE}"; cat /tmp/reg_resp.txt 2>/dev/null || true; echo
|
|
case "${CODE}" in
|
|
200|201) echo "Published ${FILE} to packages registry." ;;
|
|
409) echo "Version ${VERSION} already present in registry — skipping." ;;
|
|
*) echo "ERROR: registry upload failed (HTTP ${CODE})" >&2; exit 1 ;;
|
|
esac
|