From 7f68687bd3ed37be2d6ade18b8c864ae867cfe3e Mon Sep 17 00:00:00 2001 From: niahussain Date: Tue, 30 Jul 2024 16:07:27 +0200 Subject: [PATCH 1/2] ci: release add --- .github/workflows/release.yml | 24 ++++++ bin/github-release.sh | 142 ++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 bin/github-release.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a7dfc67 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,24 @@ +name: Release +on: + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: | + npm ci + bash bin/github-release.sh --verbose + env: + GH_TOKEN: ${{ github.token }} diff --git a/bin/github-release.sh b/bin/github-release.sh new file mode 100644 index 0000000..02ac375 --- /dev/null +++ b/bin/github-release.sh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + cat <&2 + if [[ "$dryrun" == "n" ]]; then + exit 1 + fi +fi +if ! command -v gh &> /dev/null; then + echo "ERROR: Please install the 'gh' GitHub CLI" 1>&2 + exit 1 +fi + +name="$(jq -r '.name' package.json)" +current="$(jq -r '.version' package.json)" +latest="$(npm view "$name" version)" + +log "current: v$current" +log "latest: v$latest" + +if ! printf "%s\n" "$latest" "$current" | sort -C -V; then + echo "ERROR: Latest NPM version is newer than current version" 1>&2 + exit 1 +fi + +tag="v$current" +commit="$(git rev-parse HEAD)" +draft="$(gh release view "$tag" --json isDraft,targetCommitish --jq 'if(.isDraft) then .targetCommitish else "" end' 2>/dev/null || true)" + +log "commit: ${commit}" +log "draft: ${draft:-none}" + +if [[ -z "$draft" ]] && [[ "$current" == "$latest" ]]; then + # In this case, we have no existing draft, and the current version is + # the same as the latest release, so we need to create a new PR to bump + # the package version. + log "==> Bumping Version" + + git fetch --tags --force --quiet + if [[ -n "$(git tag -l --points-at HEAD | awk '$1 == "'$tag'"')" ]]; then + log "no changes since latest release" + exit 0 + fi + + newtag="$(npm version patch --no-git-tag-version)" + log "bumping to $newtag" + + branch="bump/$newtag" + if git ls-remote --heads origin | grep "refs/heads/$branch\$" >/dev/null; then + log "version bump PR already exists" + exit 0 + fi + if [[ "$dryrun" == "n" ]]; then + log "creating PR bumping version" + git checkout -b "$branch" + git commit -am "Bump Version to $newtag" + git push -u origin "$branch" + gh pr create --fill + fi +elif [[ "$current" != "$latest" ]]; then + # In this case, the current version is newer that the latest released + # version on NPM, so we create or update the draft release to ensure it + # includes the latest version. + log "==> Drafting Release" + + if [[ "$commit" == "$draft" ]]; then + log "draft is already at latest commit" + exit 0 + fi + + log "generating NPM package" + npm pack + package="${name#@}-$current.tgz" + package="${package//\//-}" + + if [[ "$dryrun" == "n" ]]; then + log "drafting release with NPM tarball" + if [[ -n "$draft" ]]; then + log "cleaning up existing draft" + gh release delete "$tag" --yes + fi + gh release create "$tag" --draft --generate-notes --target "$commit" --title "$tag" "$package" + fi +else # if [[ -n "$draft" ]] && [[ "$current" == "$latest" ]]; then + # In this case, there is an existing draft, and the latest version is + # equal to it. Publish the draft release! + log "==> Publishing Release" + + tag="v$current" + if [[ "$dryrun" == "n" ]]; then + log "publishing draft release" + gh release edit "$tag" --draft=false + fi +fi From b647447fe87f110ae667b42ad915cdf0cd56ba7c Mon Sep 17 00:00:00 2001 From: niahussain Date: Tue, 30 Jul 2024 16:10:22 +0200 Subject: [PATCH 2/2] add: trigger github action --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a7dfc67..a8bc779 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,7 @@ name: Release on: + pull_request: + types: [opened, edited, synchronize, reopened] workflow_dispatch: permissions: