name: Release on: push: branches: - master paths: - ".github/workflows/release.yml" - "scripts/build.ps1" - "scripts/build.sh" - "scripts/docker/Dockerfile.release" tags: - "*" env: GITEA_SERVER_URL: https://git.pchuan.top RUST_IMAGE: docker.m.daocloud.io/library/rust:1-bookworm APT_MIRROR: https://mirrors.ustc.edu.cn/debian CARGO_TERM_COLOR: always jobs: prepare-release: name: Prepare release runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Create or update Gitea release shell: bash env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | set -euo pipefail if [[ "${GITHUB_REF:-}" == refs/tags/* ]]; then current_tag="${GITHUB_REF_NAME}" else current_tag="$(git describe --tags --abbrev=0)" fi version="${current_tag#v}" tag_target="$(git rev-list -n 1 "${current_tag}^{}")" previous_tag="$(git describe --tags --abbrev=0 "${current_tag}^{}^" 2>/dev/null || true)" api_base="${GITEA_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}" { echo "## Changes" echo echo "Built from commit: \`${GITHUB_SHA}\`" echo if [[ -n "${previous_tag}" ]]; then echo "Changes since \`${previous_tag}\`:" echo git log --no-merges --pretty=format:'- %s (%h)' "${previous_tag}..${current_tag}" else echo "Initial release changes:" echo git log --no-merges --pretty=format:'- %s (%h)' "${current_tag}^{}" fi echo echo echo "## Artifacts" echo echo "- \`cdxs-${version}-windows-x64.exe\`" echo "- \`cdxs-${version}-linux-x64\`" echo "- \`cdxs-${version}-linux-arm64\`" } > RELEASE_NOTES.md body="$(python3 -c 'import json, pathlib; print(json.dumps(pathlib.Path("RELEASE_NOTES.md").read_text()))')" payload="$(printf '{"tag_name":"%s","target_commitish":"%s","name":"%s","body":%s,"draft":false,"prerelease":false}' \ "${current_tag}" "${tag_target}" "${current_tag}" "${body}")" status="$(curl -sS -o release.json -w '%{http_code}' \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ "${api_base}/releases/tags/${current_tag}")" if [[ "${status}" == "200" ]]; then release_id="$(python3 -c 'import json; print(json.load(open("release.json"))["id"])')" curl -sS -X PATCH \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "${payload}" \ "${api_base}/releases/${release_id}" >/dev/null elif [[ "${status}" == "404" ]]; then curl -sS -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "${payload}" \ "${api_base}/releases" >/dev/null else cat release.json echo "Unexpected Gitea release lookup status: ${status}" >&2 exit 1 fi build-release-assets: name: Build release assets runs-on: ubuntu-latest needs: prepare-release steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Resolve release tag shell: bash run: | set -euo pipefail if [[ "${GITHUB_REF:-}" == refs/tags/* ]]; then release_tag="${GITHUB_REF_NAME}" else release_tag="$(git describe --tags --abbrev=0)" fi echo "RELEASE_TAG=${release_tag}" >> "${GITHUB_ENV}" echo "VERSION=${release_tag#v}" >> "${GITHUB_ENV}" - name: Build release assets shell: bash run: bash scripts/build.sh --version "${VERSION}" --rust-image "${RUST_IMAGE}" --apt-mirror "${APT_MIRROR}" --clean - name: Upload release assets shell: bash env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | set -euo pipefail api_base="${GITEA_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}" curl -sS -H "Authorization: token ${GITEA_TOKEN}" "${api_base}/releases/tags/${RELEASE_TAG}" > release.json release_id="$(python3 -c 'import json; print(json.load(open("release.json"))["id"])')" curl -sS -H "Authorization: token ${GITEA_TOKEN}" "${api_base}/releases/${release_id}/assets" > assets.json for file in dist/*; do name="$(basename "${file}")" existing_asset_id="$(python3 -c 'import json, sys; target = sys.argv[1]; print(next((str(asset["id"]) for asset in json.load(open("assets.json")) if asset.get("name") == target), ""))' "${name}")" if [[ -n "${existing_asset_id}" ]]; then curl -fsS -X DELETE \ -H "Authorization: token ${GITEA_TOKEN}" \ "${api_base}/releases/${release_id}/assets/${existing_asset_id}" fi curl -fsS -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -F "attachment=@${file}" \ "${api_base}/releases/${release_id}/assets?name=${name}" done