-
Notifications
You must be signed in to change notification settings - Fork 26
214 lines (203 loc) · 8.5 KB
/
release.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# Copyright 2022-2023, axodotdev
# SPDX-License-Identifier: MIT or Apache-2.0
#
# CI that:
#
# * checks for a Git Tag that looks like a release
# * creates a Github Release™ and fills in its text
# * builds artifacts with cargo-dist (executable-zips, installers)
# * uploads those artifacts to the Github Release™
#
# Note that the Github Release™ will be created before the artifacts,
# so there will be a few minutes where the release has no artifacts
# and then they will slowly trickle in, possibly failing. To make
# this more pleasant we mark the release as a "draft" until all
# artifacts have been successfully uploaded. This allows you to
# choose what to do with partial successes and avoids spamming
# anyone with notifications before the release is actually ready.
name: Release
permissions:
contents: write
# This task will run whenever you push a git tag that looks like a version
# like "v1", "v1.2.0", "v0.1.0-prerelease01", "my-app-v1.0.0", etc.
# The version will be roughly parsed as ({PACKAGE_NAME}-)?v{VERSION}, where
# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION
# must be a Cargo-style SemVer Version.
#
# If PACKAGE_NAME is specified, then we will create a Github Release™ for that
# package (erroring out if it doesn't have the given version or isn't cargo-dist-able).
#
# If PACKAGE_NAME isn't specified, then we will create a Github Release™ for all
# (cargo-dist-able) packages in the workspace with that version (this is mode is
# intended for workspaces with only one dist-able package, or with all dist-able
# packages versioned/released in lockstep).
#
# If you push multiple tags at once, separate instances of this workflow will
# spin up, creating an independent Github Release™ for each one.
#
# If there's a prerelease-style suffix to the version then the Github Release™
# will be marked as a prerelease.
on:
push:
tags:
- "*-?v[0-9]+*"
jobs:
# Create the Github Release™ so the packages have something to be uploaded to
create-release:
if: github.repository == 'bottlerocket-os/twoliter'
environment: release
runs-on:
group: bottlerocket
labels: bottlerocket_ubuntu-latest_16-core
outputs:
has-releases: ${{ steps.create-release.outputs.has-releases }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REF_NAME: ${{ github.ref_name }}
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-go@v5
with:
go-version: "^1.18"
- name: Install cargo-dist
run: |
cargo install --locked \
--git "https://github.com/webern/cargo-dist" \
--rev "3dcbe823db0c4068f38db790d996a4af54e68b3e"
- id: create-release
run: |
export PATH=$CARGO_HOME/bin:$PATH
cargo dist plan --tag="${GITHUB_REF_NAME}" --output-format=json > dist-manifest.json
echo "dist plan ran successfully"
cat dist-manifest.json
# Create the Github Release™ based on what cargo-dist thinks it should be
ANNOUNCEMENT_TITLE=$(jq --raw-output ".announcement_title" dist-manifest.json)
IS_PRERELEASE=$(jq --raw-output ".announcement_is_prerelease" dist-manifest.json)
jq --raw-output ".announcement_github_body" dist-manifest.json > new_dist_announcement.md
gh release create "${GITHUB_REF_NAME}" --draft --prerelease="$IS_PRERELEASE" --title="$ANNOUNCEMENT_TITLE" --notes-file=new_dist_announcement.md
echo "created announcement!"
# Upload the manifest to the Github Release™
gh release upload "${GITHUB_REF_NAME}" dist-manifest.json
echo "uploaded manifest!"
# Disable all the upload-artifacts tasks if we have no actual releases
HAS_RELEASES=$(jq --raw-output ".releases != null" dist-manifest.json)
echo "has-releases=$HAS_RELEASES" >> "$GITHUB_OUTPUT"
# Build and packages all the things
upload-artifacts:
# Let the initial task tell us to not run (currently very blunt)
needs: create-release
if: >-
${{ needs.create-release.outputs.has-releases == 'true'
&& github.repository == 'bottlerocket-os/twoliter'
}}
strategy:
fail-fast: false
matrix:
# For these target platforms
include:
- dist-args: "--artifacts=local --target=x86_64-unknown-linux-musl"
install-dist: |
cargo install --locked \
--git "https://github.com/webern/cargo-dist" \
--rev "3dcbe823db0c4068f38db790d996a4af54e68b3e"
- dist-args: "--artifacts=local --target=aarch64-unknown-linux-musl"
install-dist: |
cargo install --locked \
--git "https://github.com/webern/cargo-dist" \
--rev "3dcbe823db0c4068f38db790d996a4af54e68b3e"
runs-on:
group: bottlerocket
labels: bottlerocket_ubuntu-latest_16-core
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MATRIX_DIST_ARGS: ${{ matrix.dist-args }}
GITHUB_REF_NAME: ${{ github.ref_name }}
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-go@v5
with:
go-version: "^1.18"
- name: Install cargo-dist
run: ${{ matrix.install-dist }}
- name: Install Cross
# Pin cargo cross to a version that we know is working for us.
run: |
cargo install cross --git https://github.com/cross-rs/cross/ --rev 7b79041 --locked
- name: Run cargo-dist
# This logic is a bit janky because it's trying to be a polyglot between
# powershell and bash since this will run on windows, macos, and linux!
# The two platforms don't agree on how to talk about env vars but they
# do agree on 'cat' and '$()' so we use that to marshal values between commands.
run: |
export PATH=$CARGO_HOME/bin:$PATH
# cargo-cross warns us that multiple cross configurations are present in our
# workspace (ie dependencies have configurations), but it picks the appropriate one from
# the twoliter workspace.
#
# These warnings cause the tool to fail, so we disable them.
export CROSS_NO_WARNINGS=0
# Actually do builds and make zips and whatnot
cargo dist build --tag="${GITHUB_REF_NAME}" --output-format=json ${MATRIX_DIST_ARGS} > dist-manifest.json
echo "dist ran successfully"
cat dist-manifest.json
# Parse out what we just built and upload it to the Github Release™
jq --raw-output ".artifacts[]?.path | select( . != null )" dist-manifest.json > uploads.txt
echo "uploading..."
cat uploads.txt
gh release upload "${GITHUB_REF_NAME}" $(cat uploads.txt)
echo "uploaded!"
# Upload dependency attributions
upload-attributions:
needs: [create-release, upload-artifacts]
if: >-
${{ needs.create-release.outputs.has-releases == 'true'
&& github.repository == 'bottlerocket-os/twoliter'
}}
runs-on:
group: bottlerocket
labels: bottlerocket_ubuntu-latest_8-core
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REF_NAME: ${{ github.ref_name }}
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-go@v5
with:
go-version: "^1.18"
- name: Upload attributions
run: |
make attributions
gh release upload "${GITHUB_REF_NAME}" twoliter-attributions.tar.gz
# Mark the Github Release™ as a non-draft now that everything has succeeded!
publish-release:
# Only run after all the other tasks, but it's ok if upload-artifacts was skipped
needs: [create-release, upload-artifacts, upload-attributions]
if: >-
${{ github.repository == 'bottlerocket-os/twoliter'
&& always()
&& needs.create-release.result == 'success'
&& (needs.upload-artifacts.result == 'skipped'
|| needs.upload-artifacts.result == 'success')
}}
runs-on:
group: bottlerocket
labels: bottlerocket_ubuntu-latest_8-core
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REF_NAME: ${{ github.ref_name }}
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-go@v5
with:
go-version: "^1.18"
- name: mark release as non-draft
run: |
gh release edit "${GITHUB_REF_NAME}" --draft=false