众所周知,Github Actions可以执行工作流任务,而且免费版本还具备三种系统和两种架构可选,这就非常适合拿来编译代码。

花了一些时间研究出了个编译Rust代码Github Actions Workflow文件模版,可以把简单的Rust项目分别编译成3个平台2种架构的可执行程序。

Github:Github_Actions_Rust_Workflows: 简单的Github Actions编译Rust工作流文件

工作流文件如下:

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
name: Build Rust Project

on:
workflow_dispatch:

jobs:
build:
env:
program_name: rust_program
strategy:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
arch: [amd64, arm64]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable

- name: Build for rust
shell: bash
run: |
#处理环境变量
arch=${{ matrix.arch }}
os=$RUNNER_OS
program_name=${{ env.program_name }}

#处理不同系统架构差异
if [ "$os" == "Linux" ]; then
if [ "$arch" == "amd64" ]; then
target=x86_64-unknown-linux-gnu
linker=gcc
elif [ "$arch" == "arm64" ]; then
target=aarch64-unknown-linux-gnu
linker=aarch64-linux-gnu-gcc
sudo apt-get update && sudo apt-get install -y gcc-aarch64-linux-gnu
fi
suffix=""
elif [ "$os" == "Windows" ]; then
if [ "$arch" == "amd64" ]; then
target=x86_64-pc-windows-msvc
linker=link.exe
elif [ "$arch" == "arm64" ]; then
target=aarch64-pc-windows-msvc
linker=link.exe
fi
suffix=".exe"
elif [ "$os" == "macOS" ]; then
if [ "$arch" == "amd64" ]; then
target=x86_64-apple-darwin
linker=clang
elif [ "$arch" == "arm64" ]; then
target=aarch64-apple-darwin
linker=clang
fi
suffix=""
fi
echo "当前环境:$os/$arch"
echo "当前rust工具链版本"
rustc --version

#添加目标架构配置
rustup target add ${target}
mkdir -p .cargo
cat <<EOL > "./.cargo/config.toml"
[target.${target}]
linker = "${linker}"
EOL

#开始编译
echo "开始编译"
echo "目标:${target}"
cargo build --release --target=${target}

- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ env.program_name }}_${{ matrix.os }}_${{ matrix.arch }}
path: target/*

使用说明

1. 把 .github/workflows/rust.yml 复制到你的 rust 项目仓库根目录中

2. 在 GitHub 仓库页面的 Actions 选项卡中手动点击 Run workflow 开始构建。

3. 根据rust.yml文件中matrix选择的平台架构矩阵,工作流会自动执行并构建对应平台架构的可执行文件。

4. 构建完成后,指定目录构建产物(target/)会被上传至对应的构建产物列表中,便于下载和后续使用。

注意事项

这个工作流只会把Cargo的编译产物(target/)上传到构建产物中,如果需要上传多个文件,请自行配置rust.yml中path: output/*

依赖项目

其中使用了 dtolnay/rust-toolchain 的脚本安装 stable 版本的 Rust 工具链,感谢脚本作者的辛勤维护~