-
-
Notifications
You must be signed in to change notification settings - Fork 34
200 lines (181 loc) · 6.45 KB
/
ci.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
name: Continuous integration
on: [push, pull_request]
defaults:
run:
shell: bash
jobs:
ci-linux:
name: Build for Linux
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- if: ${{ github.event_name == 'push' }}
uses: azure/docker-login@v1
with:
username: stephanmisc
password: ${{ secrets.DOCKER_PASSWORD }}
- uses: stepchowfun/toast/.github/actions/toast@main
with:
tasks: build test lint release validate_release run
docker_repo: stephanmisc/toast
write_remote_cache: ${{ github.event_name == 'push' }}
- run: |
# Make Bash not silently ignore errors.
set -euo pipefail
# The artifact name will contain the target triple, so the file name doesn't need to.
mv artifacts/docuum-x86_64-unknown-linux-gnu artifacts/docuum
- uses: actions/upload-artifact@v2
with:
name: x86_64-unknown-linux-gnu
path: artifacts/docuum
if-no-files-found: error
- run: |
# Make Bash not silently ignore errors.
set -euo pipefail
# The artifact name will contain the target triple, so the file name doesn't need to.
mv artifacts/docuum-x86_64-unknown-linux-musl artifacts/docuum
- uses: actions/upload-artifact@v2
with:
name: x86_64-unknown-linux-musl
path: artifacts/docuum
if-no-files-found: error
ci-windows:
name: Build for Windows
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- run: |
# Make Bash not silently ignore errors.
set -euo pipefail
# Install the appropriate version of Rust.
rustup toolchain install 1.56.0 # [ref:rust_1_56_0]
rustup default 1.56.0 # [ref:rust_1_56_0]
# Build and test.
RUSTFLAGS='--codegen target-feature=+crt-static' cargo build \
--locked \
--release \
--target x86_64-pc-windows-msvc
NO_COLOR=true cargo test --locked # [ref:colorless_tests]
- uses: actions/upload-artifact@v2
with:
name: x86_64-pc-windows-msvc
path: target/x86_64-pc-windows-msvc/release/docuum.exe
if-no-files-found: error
ci-macos:
name: Build for macOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- run: |
# Make Bash not silently ignore errors.
set -euo pipefail
# Install the appropriate version of Rust.
rustup toolchain install 1.56.0 # [ref:rust_1_56_0]
rustup default 1.56.0 # [ref:rust_1_56_0]
# Build and test.
cargo build --locked --release --target x86_64-apple-darwin
NO_COLOR=true cargo test --locked # [ref:colorless_tests]
- uses: actions/upload-artifact@v2
with:
name: x86_64-apple-darwin
path: target/x86_64-apple-darwin/release/docuum
if-no-files-found: error
install-macos:
name: Install on macOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- run: |
# Make Bash not silently ignore errors.
set -euo pipefail
# Run the installer script.
PREFIX=/tmp ./install.sh
# Run the installed binary.
/tmp/docuum --help
install-ubuntu:
name: Install on Ubuntu
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: |
# Make Bash not silently ignore errors.
set -euo pipefail
# Run the installer script.
PREFIX=/tmp ./install.sh
# Run the installed binary.
/tmp/docuum --help
publish-release:
name: Publish a release if applicable
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
runs-on: ubuntu-latest
needs: [ci-linux, ci-macos, ci-windows, install-macos, install-ubuntu]
steps:
- uses: actions/checkout@v2
- uses: azure/docker-login@v1
with:
username: stephanmisc
password: ${{ secrets.DOCKER_PASSWORD }}
- uses: actions/download-artifact@v2
with:
path: artifacts/
- env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Make Bash not silently ignore errors.
set -euo pipefail
# Install the appropriate version of Rust.
rustup toolchain install 1.56.0 # [ref:rust_1_56_0]
rustup default 1.56.0 # [ref:rust_1_56_0]
# Fetch the program version.
VERSION="$(cargo pkgid | cut -d# -f2 | cut -d: -f2)"
# If the release already exists, exit early.
if hub release show "v$VERSION" &> /dev/null; then
echo "Release v$VERSION already exists."
exit
fi
# Give the artifacts unique names.
mv \
artifacts/x86_64-unknown-linux-gnu/docuum \
artifacts/docuum-x86_64-unknown-linux-gnu
mv \
artifacts/x86_64-unknown-linux-musl/docuum \
artifacts/docuum-x86_64-unknown-linux-musl
mv \
artifacts/x86_64-apple-darwin/docuum \
artifacts/docuum-x86_64-apple-darwin
mv \
artifacts/x86_64-pc-windows-msvc/docuum.exe \
artifacts/docuum-x86_64-pc-windows-msvc.exe
# Make the x86_64-unknown-linux-musl artifact executable again before building the Docker
# image with it below. See https://github.com/actions/upload-artifact/issues/38.
chmod a+x artifacts/docuum-x86_64-unknown-linux-musl
# Build the Docker image.
docker build --tag stephanmisc/docuum --tag "stephanmisc/docuum:$VERSION" .
# Run the Docker image to validate it.
docker run \
--init \
--rm \
--tty \
--name docuum \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume docuum:/root \
stephanmisc/docuum --help
# Push the Docker image.
docker push stephanmisc/docuum
docker push "stephanmisc/docuum:$VERSION"
# Create the release.
hub release create \
--commitish '${{ github.sha }}' \
--message "v$VERSION" \
--attach 'artifacts/docuum-x86_64-unknown-linux-gnu' \
--attach 'artifacts/docuum-x86_64-unknown-linux-musl' \
--attach 'artifacts/docuum-x86_64-apple-darwin' \
--attach 'artifacts/docuum-x86_64-pc-windows-msvc.exe' \
"v$VERSION"
echo "Created release v$VERSION."
- uses: stepchowfun/toast/.github/actions/toast@main
with:
tasks: publish
docker_repo: stephanmisc/toast
env:
CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}