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@v7 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