notcrawl/.github/workflows/release.yml
2026-04-22 23:18:21 -07:00

156 lines
4.9 KiB
YAML

name: Release
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
tag_name:
description: "Existing release tag to publish (for example: v0.1.0)"
required: true
type: string
permissions:
actions: write
contents: write
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
with:
fetch-depth: 0
ref: ${{ inputs.tag_name || github.ref }}
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
cache: true
- name: Run tests
run: go test ./...
- name: Resolve release metadata
env:
TAG: ${{ inputs.tag_name || github.ref_name }}
run: |
set -euo pipefail
if [[ ! "${TAG}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z]+)*$ ]]; then
echo "Invalid release tag: ${TAG}"
exit 1
fi
echo "RELEASE_TAG=${TAG}" >> "$GITHUB_ENV"
echo "RELEASE_VERSION=${TAG#v}" >> "$GITHUB_ENV"
- name: Build release artifacts
uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
version: "~> v2"
args: release --clean --skip=publish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish release from Release Drafter
uses: release-drafter/release-drafter@v7
with:
publish: true
tag: ${{ env.RELEASE_TAG }}
version: ${{ env.RELEASE_VERSION }}
name: "notcrawl ${{ env.RELEASE_TAG }}"
prerelease: ${{ contains(env.RELEASE_TAG, 'beta') || contains(env.RELEASE_TAG, 'alpha') || contains(env.RELEASE_TAG, 'rc') }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload release assets
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
gh release upload "${RELEASE_TAG}" \
dist/*.tar.gz \
dist/*.deb \
dist/*.rpm \
dist/sha256sums.txt \
--clobber
- name: Evaluate Cloudsmith configuration
env:
CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }}
run: |
set -euo pipefail
REPO="vincentkoc/notcrawl"
if [ -n "${CLOUDSMITH_API_KEY}" ]; then
echo "CLOUDSMITH_ENABLED=1" >> "$GITHUB_ENV"
echo "CLOUDSMITH_REPO_EFFECTIVE=${REPO}" >> "$GITHUB_ENV"
else
echo "CLOUDSMITH_ENABLED=0" >> "$GITHUB_ENV"
echo "Cloudsmith publish disabled (missing CLOUDSMITH_API_KEY)."
fi
- name: Install Cloudsmith CLI
if: ${{ env.CLOUDSMITH_ENABLED == '1' }}
run: |
set -euo pipefail
python3 -m pip install --upgrade pip
python3 -m pip install cloudsmith-cli
- name: Publish APT packages to Cloudsmith
if: ${{ env.CLOUDSMITH_ENABLED == '1' }}
env:
CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }}
CLOUDSMITH_REPO: ${{ env.CLOUDSMITH_REPO_EFFECTIVE }}
CLOUDSMITH_APT_TARGETS: ${{ vars.CLOUDSMITH_APT_TARGETS }}
CLOUDSMITH_DISTRIBUTION: ${{ vars.CLOUDSMITH_DISTRIBUTION }}
CLOUDSMITH_RELEASE: ${{ vars.CLOUDSMITH_RELEASE }}
run: |
set -euo pipefail
APT_TARGETS="${CLOUDSMITH_APT_TARGETS:-}"
if [ -z "${APT_TARGETS}" ]; then
if [ -n "${CLOUDSMITH_DISTRIBUTION:-}" ] && [ -n "${CLOUDSMITH_RELEASE:-}" ]; then
APT_TARGETS="${CLOUDSMITH_DISTRIBUTION}/${CLOUDSMITH_RELEASE}"
else
APT_TARGETS="ubuntu/jammy,debian/trixie"
fi
fi
for target_path in $(printf '%s' "${APT_TARGETS}" | tr ',' ' '); do
[ -z "${target_path}" ] && continue
TARGET="${CLOUDSMITH_REPO}/${target_path}"
for pkg in dist/*.deb; do
cloudsmith push deb "${TARGET}" "${pkg}" --no-wait-for-sync
done
done
- name: Publish RPM packages to Cloudsmith
if: ${{ env.CLOUDSMITH_ENABLED == '1' }}
env:
CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }}
CLOUDSMITH_REPO: ${{ env.CLOUDSMITH_REPO_EFFECTIVE }}
CLOUDSMITH_RPM_DISTRIBUTION: ${{ vars.CLOUDSMITH_RPM_DISTRIBUTION }}
CLOUDSMITH_RPM_RELEASE: ${{ vars.CLOUDSMITH_RPM_RELEASE }}
run: |
set -euo pipefail
DISTRO="${CLOUDSMITH_RPM_DISTRIBUTION:-el}"
RELEASE="${CLOUDSMITH_RPM_RELEASE:-9}"
TARGET="${CLOUDSMITH_REPO}/${DISTRO}/${RELEASE}"
for pkg in dist/*.rpm; do
cloudsmith push rpm "${TARGET}" "${pkg}" --no-wait-for-sync
done
update-homebrew-tap:
needs: release
uses: ./.github/workflows/homebrew-tap.yml
with:
tag_name: ${{ inputs.tag_name || github.ref_name }}
secrets: inherit