From 7c87a963c5f4d64266384fca8a21c7f18571ceed Mon Sep 17 00:00:00 2001 From: Kalvin C Date: Fri, 31 Jan 2025 11:44:55 -0800 Subject: [PATCH] ci: update release processes using Justfile, make reusable workflows have optional version param (#972) --- .github/workflows/build-cli.yml | 6 +- .github/workflows/bundle-desktop.yml | 4 +- .github/workflows/canary.yml | 13 ++-- .github/workflows/ci.yml | 7 +- .../workflows/pr-comment-bundle-desktop.yml | 7 +- .github/workflows/release.yml | 33 ++------- Justfile | 67 +++++++++++++++++-- 7 files changed, 89 insertions(+), 48 deletions(-) diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 8c9b7fe0..77cd29c2 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -6,7 +6,8 @@ on: workflow_call: inputs: version: - required: true + required: false + default: "" type: string # Let's allow overriding the OSes and architectures in JSON array form: # e.g. '["ubuntu-latest","macos-latest"]' @@ -42,6 +43,7 @@ jobs: uses: actions/checkout@v4 - name: Update version in Cargo.toml + if: ${{ inputs.version != '' }} run: | sed -i.bak 's/^version = ".*"/version = "'${{ inputs.version }}'"/' Cargo.toml rm -f Cargo.toml.bak @@ -74,4 +76,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: goose-${{ matrix.architecture }}-${{ matrix.target-suffix }} - path: ${{ env.ARTIFACT }} \ No newline at end of file + path: ${{ env.ARTIFACT }} diff --git a/.github/workflows/bundle-desktop.yml b/.github/workflows/bundle-desktop.yml index 1e952615..18b23401 100644 --- a/.github/workflows/bundle-desktop.yml +++ b/.github/workflows/bundle-desktop.yml @@ -8,7 +8,8 @@ on: inputs: version: description: 'Version to set for the build' - required: true + required: false + default: "" type: string signing: description: 'Whether to perform signing and notarization' @@ -75,6 +76,7 @@ jobs: # Update versions before build - name: Update versions + if: ${{ inputs.version != '' }} run: | # Update version in Cargo.toml sed -i.bak 's/^version = ".*"/version = "'${{ inputs.version }}'"/' Cargo.toml diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index e14889a5..56903a01 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -5,7 +5,7 @@ on: push: paths-ignore: - - 'documentation/**' + - "documentation/**" branches: - main @@ -28,9 +28,10 @@ jobs: - name: Generate a canary version id: set-version run: | - # TODO: fix this to be dynamic - extract version from repo + # Extract the version from Cargo.toml SHORT_SHA=$(echo "${GITHUB_SHA}" | cut -c1-7) - VERSION="1.0.3-canary+${SHORT_SHA}" + VERSION=$(grep '^version\s*=' Cargo.toml | head -n 1 | cut -d\" -f2) + VERSION="${VERSION}-canary+${SHORT_SHA}" echo "version=$VERSION" >> $GITHUB_OUTPUT # ------------------------------------ @@ -48,7 +49,7 @@ jobs: install-script: name: Upload Install Script runs-on: ubuntu-latest - needs: [ build-cli ] + needs: [build-cli] steps: - uses: actions/checkout@v4 - uses: actions/upload-artifact@v4 @@ -71,14 +72,14 @@ jobs: APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - + # ------------------------------------ # 5) Create/Update GitHub Release # ------------------------------------ release: name: Release runs-on: ubuntu-latest - needs: [ build-cli, install-script, bundle-desktop ] + needs: [build-cli, install-script, bundle-desktop] permissions: contents: write diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d7c9dcb8..34e5f7ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,12 @@ on: push: paths-ignore: - - 'documentation/**' + - "documentation/**" branches: - main pull_request: paths-ignore: - - 'documentation/**' + - "documentation/**" branches: - main workflow_dispatch: @@ -89,7 +89,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v2 with: - node-version: 'lts/*' + node-version: "lts/*" - name: Install Dependencies run: npm ci @@ -104,5 +104,4 @@ jobs: uses: ./.github/workflows/bundle-desktop.yml if: github.event_name == 'pull_request' with: - version: 1.0.3 # TODO: fix this to be dynamic signing: false diff --git a/.github/workflows/pr-comment-bundle-desktop.yml b/.github/workflows/pr-comment-bundle-desktop.yml index 1140070b..dd5de570 100644 --- a/.github/workflows/pr-comment-bundle-desktop.yml +++ b/.github/workflows/pr-comment-bundle-desktop.yml @@ -43,7 +43,6 @@ jobs: if: ${{ needs.trigger-on-command.outputs.continue == 'true' }} uses: ./.github/workflows/bundle-desktop.yml with: - version: 1.0.3 # TODO: fix this to be dynamic signing: true secrets: CERTIFICATE_OSX_APPLICATION: ${{ secrets.CERTIFICATE_OSX_APPLICATION }} @@ -71,11 +70,11 @@ jobs: issue-number: ${{ needs.trigger-on-command.outputs.pr_number }} body: | ### Desktop App for this PR - + The following build is available for testing: - + - [📱 macOS Desktop App (arm64, signed)](https://nightly.link/${{ github.repository }}/actions/runs/${{ github.run_id }}/Goose-darwin-arm64.zip) After downloading, unzip the file and drag the Goose.app to your Applications folder. The app is signed and notarized for macOS. - + This link is provided by nightly.link and will work even if you're not logged into GitHub. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e37ed690..5d97c7a3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ on: push: paths-ignore: - - 'documentation/**' + - "documentation/**" tags: - "v1.*" @@ -13,31 +13,13 @@ concurrency: jobs: # ------------------------------------ - # 1) Set version variables first - # ------------------------------------ - prepare-version: - name: Prepare Version - runs-on: ubuntu-latest - outputs: - version: ${{ steps.set-version.outputs.version }} - steps: - - name: Extract version - id: set-version - run: | - VERSION=${GITHUB_REF#refs/tags/v} - echo "version=$VERSION" >> $GITHUB_OUTPUT - - # ------------------------------------ - # 3) Build CLI for multiple OS/Arch + # 1) Build CLI for multiple OS/Arch # ------------------------------------ build-cli: - needs: [prepare-version] uses: ./.github/workflows/build-cli.yml - with: - version: ${{ needs.prepare-version.outputs.version }} # ------------------------------------ - # 4) Upload Install CLI Script + # 2) Upload Install CLI Script # ------------------------------------ install-script: name: Upload Install Script @@ -51,13 +33,11 @@ jobs: path: download_cli.sh # ------------------------------------------------------------ - # 5) Bundle Desktop App (macOS only) + # 3) Bundle Desktop App (macOS only) # ------------------------------------------------------------ bundle-desktop: - needs: [prepare-version] uses: ./.github/workflows/bundle-desktop.yml with: - version: ${{ needs.prepare-version.outputs.version }} signing: true secrets: CERTIFICATE_OSX_APPLICATION: ${{ secrets.CERTIFICATE_OSX_APPLICATION }} @@ -67,7 +47,7 @@ jobs: APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} # ------------------------------------ - # 6) Create/Update GitHub Release + # 4) Create/Update GitHub Release # ------------------------------------ release: name: Release @@ -80,7 +60,7 @@ jobs: uses: actions/download-artifact@v4 with: merge-multiple: true - + # Create/update the versioned release - name: Release versioned uses: ncipollo/release-action@v1 @@ -108,4 +88,3 @@ jobs: allowUpdates: true omitBody: true omitPrereleaseDuringUpdate: true - \ No newline at end of file diff --git a/Justfile b/Justfile index 932c4d7d..d257fe59 100644 --- a/Justfile +++ b/Justfile @@ -1,7 +1,11 @@ # Justfile +# list all tasks +default: + @just --list + # Default release command -release: +release-binary: @echo "Building release version..." cargo build --release @just copy-binary @@ -18,7 +22,7 @@ copy-binary: # Run UI with latest run-ui: - @just release + @just release-binary @echo "Running UI..." cd ui/desktop && npm install && npm run start-gui @@ -34,10 +38,65 @@ run-server: # make GUI with latest binary make-ui: - @just release + @just release-binary cd ui/desktop && npm run bundle:default # Setup langfuse server langfuse-server: #!/usr/bin/env bash - ./scripts/setup_langfuse.sh \ No newline at end of file + ./scripts/setup_langfuse.sh + +# ensure the current branch is "main" or error +ensure-main: + #!/usr/bin/env bash + branch=$(git rev-parse --abbrev-ref HEAD); \ + if [ "$branch" != "main" ]; then \ + echo "Error: You are not on the main branch (current: $branch)"; \ + exit 1; \ + fi + +# validate the version is semver, and not the current version +validate version: + #!/usr/bin/env bash + if [[ ! "{{ version }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-.*)?$ ]]; then + echo "[error]: invalid version '{{ version }}'." + echo " expected: semver format major.minor.patch or major.minor.patch-" + exit 1 + fi + + current_version=$(just get-tag-version) + if [[ "{{ version }}" == "$current_version" ]]; then + echo "[error]: current_version '$current_version' is the same as target version '{{ version }}'" + echo " expected: new version in semver format" + exit 1 + fi + +# set cargo and app versions, must be semver +release version: ensure-main + @just validate {{ version }} || exit 1 + + @git switch -c "release/{{ version }}" + @uvx --from=toml-cli toml set --toml-path=Cargo.toml "workspace.package.version" {{ version }} + + @cd ui/desktop && npm version {{ version }} --no-git-tag-version --allow-same-version + + @git add Cargo.toml ui/desktop/package.json ui/desktop/package-lock.json + @git commit --message "chore(release): release version {{ version }}" + +# extract version from Cargo.toml +get-tag-version: + @uvx --from=toml-cli toml get --toml-path=Cargo.toml "workspace.package.version" + +# create the git tag from Cargo.toml, must be on main +tag: ensure-main + echo git tag v$(just get-tag-version) + +# create tag and push to origin (use this when release branch is merged to main) +tag-push: tag + # this will kick of ci for release + echo git push origin tag v$(just get-tag-version) + +# generate release notes from git commits +release-notes: + #!/usr/bin/env bash + git log --pretty=format:"- %s" v$(just get-tag-version)..HEAD