-
Notifications
You must be signed in to change notification settings - Fork 1
184 lines (158 loc) · 6.58 KB
/
build.yml
File metadata and controls
184 lines (158 loc) · 6.58 KB
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
name: Build
on:
push:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:
inputs:
version:
description: "Version to release, e.g. 1.0.0. Leave empty for no release."
required: false
notes:
description: "Release notes"
required: false
prerelease:
description: "Is this a pre-release (beta, RC, etc.)?"
required: false
type: boolean
draft:
description: "Is this a draft release (not public; you can publish it later)?"
required: false
type: boolean
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
# Main build job. Builds Nit binaries for every supported platform.
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
include:
- os: ubuntu-latest
cargo_extra_flags: --target x86_64-unknown-linux-musl
output_executable: target/x86_64-unknown-linux-musl/release/nit
output_executable_upload_as: nit-linux
- os: macos-latest
output_executable: target/release/nit
output_executable_upload_as: nit-mac
- os: windows-latest
output_executable: target/release/nit.exe
output_executable_upload_as: nit-windows.exe
steps:
- name: Install Musl target
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
sudo apt-get install musl-tools
rustup target add x86_64-unknown-linux-musl
musl-gcc --version
# By default the Windows runner has autocrlf set which causes CRLF
# line endings and the whitespace linter removes them so linting fails.
# IMO autocrlf is an abomination and you should set it to `input` on Windows
# which will not convert on checkout, and will automatically convert
# CRLF to LF on commit so you don't accidentally add CRLF line endings.
- name: Disable autocrlf
run : git config --global core.autocrlf input
- uses: actions/checkout@v4
- name: Versions
run: |
git version
cargo version
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Build
run: cargo build --verbose --release --locked ${{ matrix.cargo_extra_flags }}
- name: Test
run: cargo test --verbose --release --locked ${{ matrix.cargo_extra_flags }}
- name: Lint this repo
run: cargo run --release --locked -- run
- name: Rename Output
shell: pwsh
run: Move-Item -Path "${{ matrix.output_executable }}" -Destination "target/${{ matrix.output_executable_upload_as }}"
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.os }}
path: "target/${{ matrix.output_executable_upload_as }}"
if-no-files-found: error
# Build first party linters as WASI binaries.
build_lints:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Versions
run: |
git version
cargo version
- name: Install WASI target
run: rustup target add wasm32-wasip2
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Build and test
run: |
cargo test --package lint_case_conflict
cargo test --package lint_deny
cargo test --package lint_executable_shebang
cargo test --package lint_json_format
cargo test --package lint_merge_conflicts
cargo test --package lint_regex
cargo test --package lint_tabs
cargo test --package lint_whitespace
- name: Build release WASI
run: |
cargo build --release --target wasm32-wasip2 --package lint_case_conflict
cargo build --release --target wasm32-wasip2 --package lint_deny
cargo build --release --target wasm32-wasip2 --package lint_executable_shebang
cargo build --release --target wasm32-wasip2 --package lint_json_format
cargo build --release --target wasm32-wasip2 --package lint_merge_conflicts
cargo build --release --target wasm32-wasip2 --package lint_regex
cargo build --release --target wasm32-wasip2 --package lint_tabs
cargo build --release --target wasm32-wasip2 --package lint_whitespace
- name: Set metadata
run: |
# cargo run -- set-metadata --metadata lints/lint_case_conflict/metadata.json target/wasm32-wasip2/release/lint_case_conflict.wasm
cargo run -- set-metadata --metadata lints/lint_deny/metadata.json target/wasm32-wasip2/release/lint_deny.wasm
# cargo run -- set-metadata --metadata lints/lint_executable_shebang/metadata.json target/wasm32-wasip2/release/lint_executable_shebang.wasm
cargo run -- set-metadata --metadata lints/lint_json_format/metadata.json target/wasm32-wasip2/release/lint_json_format.wasm
# cargo run -- set-metadata --metadata lints/lint_merge_conflicts/metadata.json target/wasm32-wasip2/release/lint_merge_conflicts.wasm
cargo run -- set-metadata --metadata lints/lint_regex/metadata.json target/wasm32-wasip2/release/lint_regex.wasm
# cargo run -- set-metadata --metadata lints/lint_tabs/metadata.json target/wasm32-wasip2/release/lint_tabs.wasm
cargo run -- set-metadata --metadata lints/lint_whitespace/metadata.json target/wasm32-wasip2/release/lint_whitespace.wasm
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: release-lints
path: |
target/wasm32-wasip2/release/lint_*.wasm
if-no-files-found: error
release:
# Only run this job fork workflow_dispatch, and only if a version is provided.
if: ${{ inputs && inputs.version != '' }}
needs: [build, build_lints]
runs-on: ubuntu-latest
permissions:
# Required to create a release.
contents: write
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
- name: List artifacts
run: |
ls -R
- name: Create release
uses: softprops/action-gh-release@v2
with:
# The common prefixes of the artifacts get stripped, and then they
# get extracted into directories with the same name as the artifact.
files: |
release-ubuntu-latest/nit-linux
release-macos-latest/nit-mac
release-windows-latest/nit-windows.exe
release-lints/lint_*.wasm
fail_on_unmatched_files: true
tag_name: ${{ inputs.version }}
body: ${{ inputs.notes }}
prerelease: ${{ inputs.prerelease }}
draft: ${{ inputs.draft }}