Skip to content

Commit 05f0283

Browse files
committed
ci: Build statically linked bpf-linker in CI
Build LLVM and bpf-linker with statically linked libLLVM for multiple architectures. Include the resulting build artifacts on the release pages, so they can be installed with `cargo binstall`
1 parent 6e688f3 commit 05f0283

File tree

9 files changed

+524
-116
lines changed

9 files changed

+524
-116
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
name: Free disk space
2+
description: Clean up the runner from unnecessary files and packages
3+
4+
runs:
5+
using: composite
6+
steps:
7+
- name: Free disk space
8+
shell: bash
9+
run: |
10+
set -euxo pipefail
11+
sudo apt -y remove \
12+
azure-cli \
13+
'^aspnetcore-.*' \
14+
'^dotnet-.*' \
15+
firefox \
16+
'^google-cloud-.*' \
17+
'^google-chrome-*' \
18+
'^imagemagick.*' \
19+
java-common \
20+
kubectl \
21+
'^libmagick.*' \
22+
'^libmono.*' \
23+
'^libnginx.*' \
24+
'^microsoft-edge.*' \
25+
'^mongodb-.*' \
26+
mono-devel \
27+
'^mysql-.*' \
28+
'^php.*' \
29+
powershell \
30+
'^r-.*'
31+
sudo rm -rf \
32+
/opt/ghc \
33+
/opt/hostedtoolcache \
34+
/usr/lib/jvm \
35+
/usr/local/.ghcup \
36+
/usr/local/aws* \
37+
/usr/local/bin/{aliyun,azcopy,bicep,helm,minikube,oc,occopy,packer,pulumi*,stack,terraform} \
38+
/usr/local/julia* \
39+
/usr/local/lib/android \
40+
/usr/local/share/{chromium,powershell,vcpkg} \
41+
/usr/share/dotnet || true
42+
sudo docker image prune --all --force || true

.github/workflows/ci.yml

Lines changed: 113 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,32 @@ jobs:
4848
run: cargo fmt --all -- --check
4949

5050
build:
51-
# We don't use ubuntu-latest because we care about the apt packages available.
52-
runs-on: ubuntu-22.04
51+
runs-on: ${{ matrix.target.os }}
5352
strategy:
5453
fail-fast: false
5554
matrix:
5655
rust:
5756
- stable
5857
- beta
5958
- nightly
60-
llvm:
61-
- 20
62-
- source
63-
name: rustc=${{ matrix.rust }} llvm=${{ matrix.llvm }}
59+
# We don't use ubuntu-latest because we care about the apt packages available.
60+
target:
61+
- os: macos-14
62+
target: aarch64-apple-darwin
63+
build-type: native
64+
- os: macos-13
65+
target: x86_64-apple-darwin
66+
build-type: native
67+
- os: ubuntu-22.04
68+
target: aarch64-unknown-linux-musl
69+
build-type: cross
70+
- os: ubuntu-22.04
71+
target: x86_64-unknown-linux-gnu
72+
build-type: native
73+
- os: ubuntu-22.04
74+
target: x86_64-unknown-linux-musl
75+
build-type: cross
76+
name: rustc=${{ matrix.rust }} target=${{ matrix.target.target }}
6477
needs: llvm
6578

6679
env:
@@ -69,6 +82,10 @@ jobs:
6982
steps:
7083
- uses: actions/checkout@v4
7184

85+
- name: Free disk space
86+
if: runner.os == 'Linux'
87+
uses: ./.github/actions/free-disk-space
88+
7289
- name: Install Rust ${{ matrix.rust }}
7390
if: matrix.rust != 'nightly'
7491
uses: dtolnay/rust-toolchain@master
@@ -85,65 +102,60 @@ jobs:
85102
- uses: Swatinem/rust-cache@v2
86103

87104
- name: Check (default features, no system LLVM)
105+
if: matrix.target.build-type == 'native'
88106
run: cargo check
89107

90108
- name: Build (default features, no system LLVM)
109+
if: matrix.target.build-type == 'native'
91110
run: cargo build
92111

93112
- name: Install btfdump
94-
if: matrix.rust == 'nightly'
113+
if: matrix.rust == 'nightly' && matrix.target.build-type == 'native'
95114
run: cargo install btfdump
96115

116+
- name: Install icedragon
117+
if: runner.os == 'Linux'
118+
run: cargo install --git https://github.com/exein-io/icedragon --branch persistent-rustup
119+
120+
- name: Install btfdump
121+
if: matrix.rust == 'nightly' && matrix.target.build-type == 'cross'
122+
run: icedragon cargo -- install btfdump
123+
97124
- name: Install prerequisites
98-
if: matrix.rust == 'nightly'
125+
if: matrix.rust == 'nightly' && runner.os == 'Linux' && startsWith(matrix.target.target, 'x86_64')
99126
# ubuntu-22.04 comes with clang 13-15[0]; support for signed and 64bit
100127
# enum values was added in clang 15[1] which isn't in `$PATH`.
101128
#
102129
# gcc-multilib provides at least <asm/types.h> which is referenced by libbpf.
103130
#
131+
# libelf is a dependency of libbpf.
132+
#
104133
# [0] https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Readme.md
105134
#
106135
# [1] https://github.com/llvm/llvm-project/commit/dc1c43d
107136
run: |
108137
set -euxo pipefail
109138
sudo apt update
110-
sudo apt -y install gcc-multilib
139+
sudo apt -y install gcc-multilib libelf-dev
111140
echo /usr/lib/llvm-15/bin >> $GITHUB_PATH
112141
113-
- name: Install LLVM
114-
if: matrix.llvm != 'source'
142+
- name: Install prerequisites
143+
if: runner.os == 'macOS'
144+
# We need system-wide LLVM only for FileCheck.
115145
run: |
116146
set -euxo pipefail
117-
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
118-
echo -e deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-${{ matrix.llvm }} main | sudo tee /etc/apt/sources.list.d/llvm.list
119-
120-
sudo apt update
121-
# TODO(vadorovsky): Remove the requirement of libpolly.
122-
#
123-
# Packages from apt.llvm.org are being built all at once, with one
124-
# cmake build with superset of options, then different binaries and
125-
# libraries are being included in different packages.
126-
#
127-
# That results in `llvm-config --libname --link-static` mentioning
128-
# libpolly, even if it's not installed. The output of that command is
129-
# being used in build.rs of llvm-sys, so building llvm-sys on such
130-
# system is complaining about lack of libpolly.
131-
#
132-
# Hopefully that nightmare goes away once we switch to binstalls and
133-
# ditch the system LLVM option.
134-
sudo apt -y install llvm-${{ matrix.llvm }}-dev libpolly-${{ matrix.llvm }}-dev
135-
echo /usr/lib/llvm-${{ matrix.llvm }}/bin >> $GITHUB_PATH
147+
brew install llvm
148+
echo $(brew --prefix)/opt/llvm/bin >> $GITHUB_PATH
136149
137150
- name: Restore LLVM
138-
if: matrix.llvm == 'source'
139151
uses: actions/cache/restore@v4
140152
with:
141153
path: llvm-install
142-
key: ${{ needs.llvm.outputs.cache-key }}
154+
key: ${{ needs.llvm.outputs[format('cache-key-{0}', matrix.target.target)] }}
143155
fail-on-cache-miss: true
144156

145157
- name: Add LLVM to PATH && LD_LIBRARY_PATH
146-
if: matrix.llvm == 'source'
158+
if: matrix.target.build-type == 'native'
147159
run: |
148160
set -euxo pipefail
149161
echo "${{ github.workspace }}/llvm-install/bin" >> $GITHUB_PATH
@@ -160,17 +172,63 @@ jobs:
160172
cargo clean -p llvm-sys --release
161173
162174
- uses: taiki-e/install-action@cargo-hack
175+
if: matrix.target.build-type == 'native'
176+
177+
# Run cargo commands with `cargo hack` for native targets.
178+
# Run cargo commands with `icedragon cargo` for cross targets. Running
179+
# `cargo hack` wouldn't work, because cross builds need a custom LLVM
180+
# build and can't use the rustc proxy, therefore `--feature-powerset`
181+
# won't work.
163182

164183
- name: Check
184+
if: matrix.target.build-type == 'native'
165185
run: cargo hack check --feature-powerset
166186

187+
- name: Check
188+
if: matrix.target.build-type == 'cross'
189+
env:
190+
BPF_LINKER_LLVM_PREFIX: "/llvm-install"
191+
run: |
192+
icedragon cargo \
193+
--target ${{ matrix.target.target }} \
194+
--volume "${{ github.workspace }}/llvm-install:/llvm-install" \
195+
-- \
196+
check \
197+
--no-default-features --features llvm-sys/no-llvm-linking
198+
167199
- name: Build
200+
if: matrix.target.build-type == 'native'
168201
run: cargo hack build --feature-powerset
169202

203+
- name: Build
204+
if: matrix.target.build-type == 'cross'
205+
env:
206+
BPF_LINKER_LLVM_PREFIX: "/llvm-install"
207+
run: |
208+
icedragon cargo \
209+
--target ${{ matrix.target.target }} \
210+
--volume "${{ github.workspace }}/llvm-install:/llvm-install" \
211+
-- \
212+
build \
213+
--no-default-features --features llvm-sys/no-llvm-linking
214+
170215
- name: Test
171-
if: matrix.rust == 'nightly'
216+
if: matrix.rust == 'nightly' && matrix.target.build-type == 'native'
172217
run: cargo hack test --feature-powerset
173218

219+
- name: Test
220+
# We can run tests only for the x86_64-unknown-linux-musl cross target.
221+
if: matrix.rust == 'nightly' && matrix.target.build-type == 'cross' && startsWith(matrix.target.target, 'x86_64')
222+
env:
223+
BPF_LINKER_LLVM_PREFIX: "/llvm-install"
224+
run: |
225+
icedragon cargo \
226+
--target ${{ matrix.target.target }} \
227+
--volume "${{ github.workspace }}/llvm-install:/llvm-install" \
228+
-- \
229+
test \
230+
--no-default-features --features llvm-sys/no-llvm-linking
231+
174232
- uses: actions/checkout@v4
175233
if: matrix.rust == 'nightly'
176234
with:
@@ -179,10 +237,28 @@ jobs:
179237
submodules: recursive
180238

181239
- name: Install
182-
if: matrix.rust == 'nightly'
183-
run: cargo install --path . --no-default-features
240+
if: matrix.rust == 'nightly' && runner.os == 'Linux' && matrix.target.build-type == 'native' && startsWith(matrix.target.target, 'x86_64')
241+
run: |
242+
cargo install
243+
244+
- name: Install
245+
if: matrix.rust == 'nightly' && runner.os == 'Linux' && matrix.target.build-type == 'cross' && startsWith(matrix.target.target, 'x86_64')
246+
env:
247+
BPF_LINKER_LLVM_PREFIX: "/llvm-install"
248+
run: |
249+
icedragon cargo \
250+
--target ${{ matrix.target.target }} \
251+
--volume "${{ github.workspace }}/llvm-install:/llvm-install" \
252+
--volume ~/cargo:/install \
253+
-- \
254+
install --path . --root /install \
255+
--no-default-features --features llvm-sys/no-llvm-linking
184256
185257
- name: Run aya integration tests
186-
if: matrix.rust == 'nightly'
258+
if: matrix.rust == 'nightly' && runner.os == 'Linux' && startsWith(matrix.target.target, 'x86_64')
187259
working-directory: aya
188260
run: cargo xtask integration-test local
261+
262+
- name: Setup tmate session
263+
if: ${{ failure() }}
264+
uses: mxschmitt/action-tmate@v3

0 commit comments

Comments
 (0)