ci: Use `zed-zippy` identity for `bump_patch_version.yml` (#46099)

Finn Evers created

This PR updates the `bump_patch_version.yml` to also be generated by
`cargo xtask workflows` and updates this to use the `zed-zippy` identity
instead of the `ConradIrwin` identity.

Release Notes:

- N/A

Change summary

.github/workflows/bump_patch_version.yml                | 89 +++++-----
tooling/xtask/src/tasks/workflows.rs                    | 24 +-
tooling/xtask/src/tasks/workflows/bump_patch_version.rs | 77 +++++++++
tooling/xtask/src/tasks/workflows/vars.rs               | 13 +
4 files changed, 150 insertions(+), 53 deletions(-)

Detailed changes

.github/workflows/bump_patch_version.yml 🔗

@@ -1,51 +1,58 @@
+# Generated from xtask::workflows::bump_patch_version
+# Rebuild with `cargo xtask workflows`.
 name: bump_patch_version
-
 on:
   workflow_dispatch:
     inputs:
       branch:
-        description: "Branch name to run on"
+        description: Branch name to run on
         required: true
-
-concurrency:
-  # Allow only one workflow per any non-`main` branch.
-  group: ${{ github.workflow }}-${{ inputs.branch }}
-  cancel-in-progress: true
-
+        type: string
 jobs:
-  bump_patch_version:
+  run_bump_patch_version:
     if: github.repository_owner == 'zed-industries'
-    runs-on:
-      - namespace-profile-16x32-ubuntu-2204
+    runs-on: namespace-profile-16x32-ubuntu-2204
     steps:
-      - name: Checkout code
-        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
-        with:
-          ref: ${{ github.event.inputs.branch }}
-          ssh-key: ${{ secrets.ZED_BOT_DEPLOY_KEY }}
+    - id: get-app-token
+      name: steps::authenticate_as_zippy
+      uses: actions/create-github-app-token@bef1eaf1c0ac2b148ee2a0a74c65fbe6db0631f1
+      with:
+        app-id: ${{ secrets.ZED_ZIPPY_APP_ID }}
+        private-key: ${{ secrets.ZED_ZIPPY_APP_PRIVATE_KEY }}
+    - name: steps::checkout_repo_with_token
+      uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
+      with:
+        clean: false
+        token: ${{ steps.get-app-token.outputs.token }}
+        ref: ${{ inputs.branch }}
+    - name: bump_patch_version::run_bump_patch_version::bump_patch_version
+      run: |
+        channel="$(cat crates/zed/RELEASE_CHANNEL)"
 
-      - name: Bump Patch Version
-        run: |
-          set -eux
-
-          channel="$(cat crates/zed/RELEASE_CHANNEL)"
-
-          tag_suffix=""
-          case $channel in
-            stable)
-              ;;
-            preview)
-              tag_suffix="-pre"
-              ;;
-            *)
-              echo "this must be run on either of stable|preview release branches" >&2
-              exit 1
-              ;;
-          esac
-          which cargo-set-version > /dev/null || cargo install cargo-edit -f --no-default-features --features "set-version"
-          output="$(cargo set-version -p zed --bump patch 2>&1 | sed 's/.* //')"
-          export GIT_COMMITTER_NAME="Zed Bot"
-          export GIT_COMMITTER_EMAIL="hi@zed.dev"
-          git commit -am "Bump to $output for @$GITHUB_ACTOR" --author "Zed Bot <hi@zed.dev>"
-          git tag "v${output}${tag_suffix}"
-          git push origin HEAD "v${output}${tag_suffix}"
+        tag_suffix=""
+        case $channel in
+          stable)
+            ;;
+          preview)
+            tag_suffix="-pre"
+            ;;
+          *)
+            echo "this must be run on either of stable|preview release branches" >&2
+            exit 1
+            ;;
+        esac
+        which cargo-set-version > /dev/null || cargo install cargo-edit -f --no-default-features --features "set-version"
+        output="$(cargo set-version -p zed --bump patch 2>&1 | sed 's/.* //')"
+        git commit -am "Bump to $output for @$GITHUB_ACTOR"
+        git tag "v${output}${tag_suffix}"
+        git push origin HEAD "v${output}${tag_suffix}"
+      shell: bash -euxo pipefail {0}
+      env:
+        GIT_COMMITTER_NAME: Zed Zippy
+        GIT_COMMITTER_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
+        GIT_AUTHOR_NAME: Zed Zippy
+        GIT_AUTHOR_EMAIL: 234243425+zed-zippy[bot]@users.noreply.github.com
+        GITHUB_TOKEN: ${{ steps.get-app-token.outputs.token }}
+concurrency:
+  group: ${{ github.workflow }}-${{ inputs.branch }}
+  cancel-in-progress: true

tooling/xtask/src/tasks/workflows.rs 🔗

@@ -6,6 +6,7 @@ use std::path::{Path, PathBuf};
 
 mod after_release;
 mod autofix_pr;
+mod bump_patch_version;
 mod cherry_pick;
 mod compare_perf;
 mod danger;
@@ -126,22 +127,23 @@ pub fn run_workflows(_: GenerateWorkflowArgs) -> Result<()> {
     }
 
     let workflows = [
-        WorkflowFile::zed(danger::danger),
-        WorkflowFile::zed(run_bundling::run_bundling),
-        WorkflowFile::zed(release_nightly::release_nightly),
-        WorkflowFile::zed(run_tests::run_tests),
-        WorkflowFile::zed(release::release),
-        WorkflowFile::zed(cherry_pick::cherry_pick),
+        WorkflowFile::zed(after_release::after_release),
         WorkflowFile::zed(autofix_pr::autofix_pr),
+        WorkflowFile::zed(bump_patch_version::bump_patch_version),
+        WorkflowFile::zed(cherry_pick::cherry_pick),
         WorkflowFile::zed(compare_perf::compare_perf),
-        WorkflowFile::zed(run_agent_evals::run_unit_evals),
-        WorkflowFile::zed(run_agent_evals::run_cron_unit_evals),
-        WorkflowFile::zed(run_agent_evals::run_agent_evals),
-        WorkflowFile::zed(after_release::after_release),
-        WorkflowFile::zed(extension_tests::extension_tests),
+        WorkflowFile::zed(danger::danger),
         WorkflowFile::zed(extension_bump::extension_bump),
         WorkflowFile::zed(extension_release::extension_release),
+        WorkflowFile::zed(extension_tests::extension_tests),
         WorkflowFile::zed(extension_workflow_rollout::extension_workflow_rollout),
+        WorkflowFile::zed(release::release),
+        WorkflowFile::zed(release_nightly::release_nightly),
+        WorkflowFile::zed(run_agent_evals::run_agent_evals),
+        WorkflowFile::zed(run_agent_evals::run_cron_unit_evals),
+        WorkflowFile::zed(run_agent_evals::run_unit_evals),
+        WorkflowFile::zed(run_bundling::run_bundling),
+        WorkflowFile::zed(run_tests::run_tests),
         /* workflows used for CI/CD in extension repositories */
         WorkflowFile::extension(extensions::run_tests::run_tests),
         WorkflowFile::extension_shared(extensions::bump_version::bump_version),

tooling/xtask/src/tasks/workflows/bump_patch_version.rs 🔗

@@ -0,0 +1,77 @@
+use gh_workflow::*;
+
+use crate::tasks::workflows::{
+    runners,
+    steps::{self, named},
+    vars::{StepOutput, WorkflowInput},
+};
+
+pub fn bump_patch_version() -> Workflow {
+    let branch = WorkflowInput::string("branch", None).description("Branch name to run on");
+    let bump_patch_version_job = run_bump_patch_version(&branch);
+    named::workflow()
+        .on(Event::default()
+            .workflow_dispatch(WorkflowDispatch::default().add_input(branch.name, branch.input())))
+        .concurrency(
+            Concurrency::new(Expression::new(format!(
+                "${{{{ github.workflow }}}}-{branch}"
+            )))
+            .cancel_in_progress(true),
+        )
+        .add_job(bump_patch_version_job.name, bump_patch_version_job.job)
+}
+
+fn run_bump_patch_version(branch: &WorkflowInput) -> steps::NamedJob {
+    fn checkout_branch(branch: &WorkflowInput, token: &StepOutput) -> Step<Use> {
+        steps::checkout_repo_with_token(token).add_with(("ref", branch.to_string()))
+    }
+
+    fn bump_patch_version(token: &StepOutput) -> Step<Run> {
+        named::bash(indoc::indoc! {r#"
+            channel="$(cat crates/zed/RELEASE_CHANNEL)"
+
+            tag_suffix=""
+            case $channel in
+              stable)
+                ;;
+              preview)
+                tag_suffix="-pre"
+                ;;
+              *)
+                echo "this must be run on either of stable|preview release branches" >&2
+                exit 1
+                ;;
+            esac
+            which cargo-set-version > /dev/null || cargo install cargo-edit -f --no-default-features --features "set-version"
+            output="$(cargo set-version -p zed --bump patch 2>&1 | sed 's/.* //')"
+            git commit -am "Bump to $output for @$GITHUB_ACTOR"
+            git tag "v${output}${tag_suffix}"
+            git push origin HEAD "v${output}${tag_suffix}"
+        "#})
+        .shell(steps::BASH_SHELL)
+        .add_env(("GIT_COMMITTER_NAME", "Zed Zippy"))
+        .add_env((
+            "GIT_COMMITTER_EMAIL",
+            "234243425+zed-zippy[bot]@users.noreply.github.com",
+        ))
+        .add_env(("GIT_AUTHOR_NAME", "Zed Zippy"))
+        .add_env((
+            "GIT_AUTHOR_EMAIL",
+            "234243425+zed-zippy[bot]@users.noreply.github.com",
+        ))
+        .add_env(("GITHUB_TOKEN", token))
+    }
+
+    let (authenticate, token) = steps::authenticate_as_zippy();
+
+    named::job(
+        Job::default()
+            .cond(Expression::new(
+                "github.repository_owner == 'zed-industries'",
+            ))
+            .runs_on(runners::LINUX_XL)
+            .add_step(authenticate)
+            .add_step(checkout_branch(branch, &token))
+            .add_step(bump_patch_version(&token)),
+    )
+}

tooling/xtask/src/tasks/workflows/vars.rs 🔗

@@ -218,6 +218,7 @@ pub struct WorkflowInput {
     pub input_type: &'static str,
     pub name: &'static str,
     pub default: Option<String>,
+    pub description: Option<String>,
 }
 
 impl WorkflowInput {
@@ -226,6 +227,7 @@ impl WorkflowInput {
             input_type: "string",
             name,
             default,
+            description: None,
         }
     }
 
@@ -234,12 +236,21 @@ impl WorkflowInput {
             input_type: "boolean",
             name,
             default: default.as_ref().map(ToString::to_string),
+            description: None,
         }
     }
 
+    pub fn description(mut self, description: impl ToString) -> Self {
+        self.description = Some(description.to_string());
+        self
+    }
+
     pub fn input(&self) -> WorkflowDispatchInput {
         WorkflowDispatchInput {
-            description: self.name.to_owned(),
+            description: self
+                .description
+                .clone()
+                .unwrap_or_else(|| self.name.to_owned()),
             required: self.default.is_none(),
             input_type: self.input_type.to_owned(),
             default: self.default.clone(),