Trigger a release #3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Trigger a release | |
on: | |
workflow_dispatch: | |
secrets: | |
BOT_GITHUB_TOKEN: | |
required: true | |
inputs: | |
bump: | |
type: choice | |
description: "What semver bump to use for the release" | |
required: true | |
options: | |
- "prerelease" | |
- "premajor" | |
- "preminor" | |
- "major" | |
- "minor" | |
- "patch" | |
default: "minor" | |
jobs: | |
set-version: | |
name: Bump version and push a tag | |
runs-on: ubuntu-22.04 | |
permissions: | |
contents: write | |
steps: | |
- name: Checkout the code | |
uses: actions/[email protected] | |
- name: Install Rust toolchain | |
run: | | |
rustup toolchain install stable | |
rustup default stable | |
- name: Extract the current version | |
id: current | |
run: echo "version=$(cargo metadata --format-version 1 | jq -r '.packages[] | select(.name == "mas-cli") | .version')" >> "$GITHUB_OUTPUT" | |
- name: Compute the new version | |
id: next | |
run: echo "version=$(npx --yes [email protected] -i "${{ github.event.inputs.bump }}" --preid rc "${{ steps.current.outputs.version }}")" >> "$GITHUB_OUTPUT" | |
- name: Set the crates version | |
run: | | |
sed -i "s/^package.version = .*/package.version = \"${{ steps.next.outputs.version }}\"/" Cargo.toml | |
sed -i "/path = \".\/crates\//s/version = \".*\"/version = \"=${{ steps.next.outputs.version }}\"/" Cargo.toml | |
- name: Run `cargo metadata` to make sure the lockfile is up to date | |
run: cargo metadata --format-version 1 | |
- name: Set the tools/syn2mas version | |
working-directory: tools/syn2mas | |
run: npm version "${{ steps.next.outputs.version }}" --no-git-tag-version | |
- name: Commit and tag using the GitHub API | |
uses: actions/[email protected] | |
id: commit | |
env: | |
VERSION: ${{ steps.next.outputs.version }} | |
with: | |
result-encoding: string | |
# Commit & tag with the actions token, so that they get signed | |
script: | | |
const fs = require("fs/promises"); | |
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); | |
const version = process.env.VERSION; | |
const parent = context.sha; | |
const files = [ | |
"Cargo.toml", | |
"Cargo.lock", | |
"tools/syn2mas/package.json", | |
"tools/syn2mas/package-lock.json", | |
]; | |
const tree = []; | |
for (const file of files) { | |
const content = await fs.readFile(file); | |
const blob = await github.rest.git.createBlob({ | |
owner, | |
repo, | |
content: content.toString("base64"), | |
encoding: "base64", | |
}); | |
console.log(`Created blob for ${file}:`, blob.data.url); | |
tree.push({ | |
path: file, | |
mode: "100644", | |
type: "blob", | |
sha: blob.data.sha, | |
}); | |
} | |
const treeObject = await github.rest.git.createTree({ | |
owner, | |
repo, | |
tree, | |
base_tree: parent, | |
}); | |
console.log("Created tree:", treeObject.data.url); | |
const commit = await github.rest.git.createCommit({ | |
owner, | |
repo, | |
message: version, | |
parents: [parent], | |
tree: treeObject.data.sha, | |
}); | |
console.log("Created commit:", commit.data.url); | |
const tag = await github.rest.git.createTag({ | |
owner, | |
repo, | |
tag: `v${version}`, | |
message: version, | |
type: "commit", | |
object: commit.data.sha, | |
}); | |
console.log("Created tag:", tag.data.url); | |
return commit.data.sha; | |
- name: Update the refs | |
uses: actions/[email protected] | |
env: | |
VERSION: ${{ steps.next.outputs.version }} | |
COMMIT: ${{ steps.commit.outputs.result }} | |
with: | |
# Update the refs with the bot token, so that workflows are triggered | |
github-token: ${{ secrets.BOT_GITHUB_TOKEN }} | |
script: | | |
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); | |
const version = process.env.VERSION; | |
const commit = process.env.COMMIT; | |
const branch = process.env.GITHUB_REF_NAME; | |
const tag = await github.rest.git.createRef({ | |
owner, | |
repo, | |
ref: `refs/tags/v${version}`, | |
sha: commit, | |
}); | |
console.log("Created tag ref:", tag.data.url); | |
const ref = await github.rest.git.updateRef({ | |
owner, | |
repo, | |
ref: `heads/${branch}`, | |
sha: commit, | |
}); | |
console.log("Updated branch ref:", ref.data.url); |