Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.

Commit df49ea8

Browse files
committed
ci: automatic release workflow
1 parent 0f5d10f commit df49ea8

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

.github/workflows/release.yaml

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
name: Trigger a release
2+
on:
3+
workflow_dispatch:
4+
secrets:
5+
BOT_GITHUB_TOKEN:
6+
required: true
7+
inputs:
8+
bump:
9+
type: choice
10+
description: "What semver bump to use for the release"
11+
required: true
12+
options:
13+
- "major"
14+
- "minor"
15+
- "patch"
16+
default: "minor"
17+
18+
19+
jobs:
20+
set-version:
21+
name: Bump version and push a tag
22+
runs-on: ubuntu-22.04
23+
permissions:
24+
contents: write
25+
26+
steps:
27+
- name: Checkout the code
28+
uses: actions/[email protected]
29+
30+
- name: Install Rust toolchain
31+
run: |
32+
rustup toolchain install stable
33+
rustup default stable
34+
35+
- name: Install cargo-edit
36+
run: cargo install cargo-edit
37+
38+
- name: Bump version
39+
run: cargo set-version --workspace --bump=${{ github.event.inputs.bump }}
40+
41+
- name: Extract version
42+
id: version
43+
run: echo "version=v$(cargo metadata --format-version 1 | jq -r '.packages[] | select(.name == "mas-cli") | .version')" >> "$GITHUB_OUTPUT"
44+
45+
- name: Commit and tag using the GitHub API
46+
uses: actions/[email protected]
47+
id: commit
48+
env:
49+
VERSION: ${{ steps.version.outputs.version }}
50+
with:
51+
result-encoding: string
52+
# Commit & tag with the actions token, so that they get signed
53+
script: |
54+
const fs = require("fs/promises");
55+
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
56+
const version = process.env.VERSION;
57+
const parent = context.sha;
58+
const cargoToml = await fs.readFile("Cargo.toml");
59+
const cargoTomlBlob = await octokit.rest.git.createBlob({
60+
owner,
61+
repo,
62+
content: cargoToml.toString("base64"),
63+
encoding: "base64",
64+
});
65+
66+
const cargoLock = await fs.readFile("Cargo.lock");
67+
const cargoLockBlob = await octokit.rest.git.createBlob({
68+
owner,
69+
repo,
70+
content: cargoLock.toString("base64"),
71+
encoding: "base64",
72+
});
73+
74+
const tree = await octokit.rest.git.createTree({
75+
owner,
76+
repo,
77+
tree: [{
78+
path: "Cargo.toml",
79+
mode: "100644",
80+
type: "blob",
81+
sha: cargoTomlBlob.data.sha,
82+
}, {
83+
path: "Cargo.lock",
84+
mode: "100644",
85+
type: "blob",
86+
sha: cargoLockBlob.data.sha,
87+
}],
88+
base_tree: parent,
89+
});
90+
91+
const commit = await octokit.rest.git.createCommit({
92+
owner,
93+
repo,
94+
message: version,
95+
parents: [parent],
96+
tree: tree.data.sha,
97+
});
98+
99+
await octokit.rest.git.createTag({
100+
owner,
101+
repo,
102+
tag: version,
103+
message: version,
104+
type: "commit",
105+
object: commit.data.sha,
106+
});
107+
108+
return commit.data.sha;
109+
110+
- name: Update the refs
111+
uses: actions/[email protected]
112+
env:
113+
VERSION: ${{ steps.version.outputs.version }}
114+
COMMIT: ${{ steps.commit.outputs.result }}
115+
with:
116+
# Update the refs with the bot
117+
github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
118+
script: |
119+
const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");
120+
const version = process.env.VERSION;
121+
const commit = process.env.COMMIT;
122+
await octokit.rest.git.createRef({
123+
owner,
124+
repo,
125+
ref: `refs/tags/${version}`,
126+
sha: commit,
127+
});
128+
129+
await octokit.rest.git.updateRef({
130+
owner,
131+
repo,
132+
ref: "heads/main",
133+
sha: commit,
134+
});

0 commit comments

Comments
 (0)