feat(arm): support windows arm #2276
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build/Test/Release | |
on: | |
push: | |
tags: [ "v*" ] | |
branches: [ "master" ] | |
pull_request: | |
branches: [ "master" ] | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha || github.ref }} | |
cancel-in-progress: true | |
env: | |
PACKAGE: "clash" | |
REGISTRY: "ghcr.io" | |
IMAGE_NAME: "clash-rs" | |
# Arm builder https://github.blog/changelog/2024-09-03-github-actions-arm64-linux-and-windows-runners-are-now-generally-available/ | |
jobs: | |
compile: | |
name: ${{ matrix.release-name || matrix.target || 'Unknown' }} | |
permissions: | |
contents: write | |
runs-on: ${{ matrix.os || 'ubuntu-latest' }} | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
# Example | |
# when not set, default will be used (except target, cross) | |
# - os: ubuntu-latest | |
# target: x86_64-unknown-linux-gnu | |
# release-name: x86_64-linux | |
# toolchain: stable | |
# cross: true | |
# postfix: "" | |
# extra-args: "" | |
# components: "" | |
# rustflags: "" | |
# Linux x86 | |
- os: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
cross: true | |
extra-args: "--all-features" | |
- os: ubuntu-latest | |
target: i686-unknown-linux-gnu | |
cross: true | |
extra-args: "--all-features" | |
# Linux x86 static-crt | |
- os: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
release-name: x86_64-unknown-linux-gnu-static-crt | |
cross: true | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
# Linux x86_64-unknown-linux-musl | |
- os: ubuntu-latest | |
target: x86_64-unknown-linux-musl | |
release-name: x86_64-unknown-linux-musl | |
cross: true | |
extra-args: "--all-features" | |
- os: ubuntu-latest | |
target: i686-unknown-linux-gnu | |
release-name: i686-unknown-linux-gnu-static-crt | |
cross: true | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
# Linux arm | |
- os: ubuntu-latest | |
target: aarch64-unknown-linux-gnu | |
cross: true | |
extra-args: "--all-features" | |
- os: ubuntu-latest | |
target: armv7-unknown-linux-gnueabi | |
cross: true | |
extra-args: "--all-features" | |
- os: ubuntu-latest | |
target: armv7-unknown-linux-gnueabihf | |
cross: true | |
extra-args: "--all-features" | |
# Linux arm static-crt | |
- os: ubuntu-latest | |
target: aarch64-unknown-linux-gnu | |
release-name: aarch64-unknown-linux-gnu-static-crt | |
cross: true | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
- os: ubuntu-latest | |
target: aarch64-unknown-linux-musl | |
release-name: aarch64-unknown-linux-musl | |
cross: true | |
extra-args: "--all-features" | |
- os: ubuntu-latest | |
target: armv7-unknown-linux-gnueabi | |
release-name: armv7-unknown-linux-gnueabi-static-crt | |
cross: true | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
- os: ubuntu-latest | |
target: armv7-unknown-linux-musleabihf | |
cross: true | |
extra-args: "--all-features" | |
rustflags: "--cfg tokio_unstable" | |
# Windows | |
- os: windows-latest | |
target: x86_64-pc-windows-msvc | |
cross: false | |
postfix: ".exe" | |
extra-args: "--all-features" | |
- os: windows-latest | |
target: i686-pc-windows-msvc | |
cross: false | |
postfix: ".exe" | |
extra-args: "--all-features" | |
- os: windows-latest | |
target: aarch64-pc-windows-msvc | |
cross: false | |
postfix: ".exe" | |
extra-args: --features "shadowsocks tuic" | |
# Windows static-crt | |
- os: windows-latest | |
target: x86_64-pc-windows-msvc | |
release-name: x86_64-pc-windows-msvc-static-crt | |
cross: false | |
postfix: ".exe" | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
- os: windows-latest | |
target: i686-pc-windows-msvc | |
release-name: i686-pc-windows-msvc-static-crt | |
cross: false | |
postfix: ".exe" | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
- os: windows-latest | |
target: aarch64-pc-windows-msvc | |
release-name: aarch64-pc-windows-msvc-static-crt | |
cross: false | |
postfix: ".exe" | |
extra-args: --features "shadowsocks tuic" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
# MacOSX | |
- os: macos-12 | |
target: x86_64-apple-darwin | |
cross: false | |
extra-args: "--all-features" | |
- os: macos-14 | |
target: aarch64-apple-darwin | |
cross: false | |
extra-args: "--all-features" | |
# MacOSX static-crt | |
- os: macos-12 | |
target: x86_64-apple-darwin | |
release-name: x86_64-apple-darwin-static-crt | |
cross: false | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
- os: macos-14 | |
target: aarch64-apple-darwin | |
release-name: aarch64-apple-darwin-static-crt | |
cross: false | |
extra-args: "--all-features" | |
rustflags: "-Ctarget-feature=+crt-static --cfg tokio_unstable" | |
# Linux mips: tier-3, pity | |
# Linux risc-v: needs update rustls | |
# Windows gnu: tokio dont work | |
# Windows aarch: todo | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- uses: actions/cache@v4 | |
with: | |
path: | | |
~/.cargo/registry | |
~/.cargo/git | |
key: ${{ matrix.release-name || matrix.target }}-${{ hashFiles('**/Cargo.toml') }} | |
restore-keys: | | |
${{ matrix.release-name || matrix.target }} | |
- uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ matrix.toolchain || 'nightly' }} | |
target: ${{ matrix.target }} | |
components: ${{ matrix.components || 'rustfmt, clippy' }} | |
- name: Install Protoc | |
uses: arduino/setup-protoc@v3 | |
with: | |
version: "23.x" | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Cargo fmt | |
uses: clechasseur/rs-cargo@v2 | |
with: | |
use-cross: ${{ matrix.cross }} | |
command: fmt | |
args: --all -- --check | |
- name: Cargo clippy | |
uses: clechasseur/rs-cargo@v2 | |
with: | |
use-cross: ${{ matrix.cross }} | |
command: clippy | |
args: --all --target ${{ matrix.target }} ${{ matrix.extra-args }} -- -D warnings | |
env: | |
RUSTFLAGS: ${{ matrix.rustflags || '--cfg tokio_unstable' }} | |
- name: Cargo test (docker test on linux) | |
uses: clechasseur/rs-cargo@v2 | |
if: startsWith(matrix.os, 'ubuntu') | |
with: | |
use-cross: ${{ matrix.cross }} | |
command: test | |
args: --all --target ${{ matrix.target }} ${{ matrix.extra-args }} | |
env: | |
CROSS_CONTAINER_OPTS: "--network host" | |
RUSTFLAGS: ${{ matrix.rustflags || '--cfg tokio_unstable' }} | |
- name: Cargo test (no docker test on windows-non-arm and macos) | |
uses: clechasseur/rs-cargo@v2 | |
if: ${{ !startsWith(matrix.os, 'ubuntu') && matrix.target != 'aarch64-pc-windows-msvc' }} | |
with: | |
use-cross: ${{ matrix.cross }} | |
command: test | |
args: --all --target ${{ matrix.target }} ${{ matrix.extra-args }} | |
env: | |
CLASH_RS_CI: "true" | |
RUSTFLAGS: ${{ matrix.rustflags || '--cfg tokio_unstable' }} | |
- name: Cargo build | |
uses: clechasseur/rs-cargo@v2 | |
with: | |
use-cross: ${{ matrix.cross }} | |
command: build | |
args: --release --target ${{ matrix.target }} ${{ matrix.extra-args }} | |
env: | |
RUSTFLAGS: ${{ matrix.rustflags || '--cfg tokio_unstable' }} | |
- name: Rename binary | |
run: mv target/${{ matrix.target }}/release/clash-rs${{ matrix.postfix }} ${{ env.PACKAGE }}-${{ matrix.release-name || matrix.target }}${{ matrix.postfix }} | |
- name: Upload binaries | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.release-name || matrix.target }} | |
path: ${{ env.PACKAGE }}-${{ matrix.release-name || matrix.target }}${{ matrix.postfix }} | |
- name: Setup tmate session | |
if: ${{ failure() }} | |
uses: mxschmitt/action-tmate@v3 | |
with: | |
detached: true | |
timeout-minutes: 15 | |
limit-access-to-actor: true | |
release: | |
name: Release | |
if: github.event_name != 'pull_request' | |
needs: [ compile ] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
fetch-tags: true | |
- name: Merge binaries | |
uses: actions/upload-artifact/merge@v4 | |
with: | |
name: binaries | |
pattern: '*' | |
retention-days: 1 | |
- name: Download binaries | |
uses: actions/download-artifact@v4 | |
with: | |
name: binaries | |
path: ./packages | |
- name: Delete previous latest tag | |
run: | | |
git tag -d latest || true | |
git push origin :refs/tags/latest || true | |
gh release list | grep Draft | awk '{print $1 " \t"}' | while read -r line; do gh release delete -y "$line"; done | |
env: | |
GH_TOKEN: ${{ github.token }} | |
- name: Create new latest tag | |
if: startsWith(github.ref, 'refs/heads/master') | |
run: | | |
git tag latest | |
git push origin latest | |
- name: Generate a changelog | |
uses: orhun/git-cliff-action@main | |
id: git-cliff | |
with: | |
config: .github/cliff.toml | |
args: --latest --strip header | |
env: | |
GITHUB_REPO: ${{ github.repository }} | |
- name: Github stable release | |
uses: softprops/action-gh-release@v2 | |
if: startsWith(github.ref, 'refs/tags/v') | |
with: | |
token: "${{ secrets.GITHUB_TOKEN }}" | |
prerelease: false | |
generate_release_notes: false | |
body: "${{ steps.git-cliff.outputs.content }}" | |
files: | | |
packages/* | |
LICENSE* | |
- name: Github nightly release | |
uses: softprops/action-gh-release@v2 | |
if: startsWith(github.ref, 'refs/heads/master') | |
with: | |
token: "${{ secrets.GITHUB_TOKEN }}" | |
prerelease: true | |
tag_name: "latest" | |
generate_release_notes: false | |
body: "${{ steps.git-cliff.outputs.content }}" | |
files: | | |
packages/* | |
LICENSE* | |
docker-image: | |
needs: [ compile ] | |
name: Docker Image | |
runs-on: ubuntu-latest | |
if: startsWith(github.ref, 'refs/tags/v') | |
permissions: | |
contents: read | |
packages: write | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Get the current Git commit hash | |
id: get-info | |
run: | | |
echo "OWNER=${GITHUB_REPOSITORY_OWNER@L}" >> $GITHUB_OUTPUT | |
echo "TAG_VERSION=${REGISTRY}/${GITHUB_REPOSITORY_OWNER@L}/${IMAGE_NAME}:${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV | |
echo "TAG_LATEST=${REGISTRY}/${GITHUB_REPOSITORY_OWNER@L}/${IMAGE_NAME}:latest" >> $GITHUB_ENV | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Log in to Container Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ steps.get-info.outputs.OWNER }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Download binaries amd64 | |
uses: actions/download-artifact@v4 | |
with: | |
name: x86_64-unknown-linux-musl | |
path: ./clash-rs | |
- name: Download binaries arm64 | |
uses: actions/download-artifact@v4 | |
with: | |
name: aarch64-unknown-linux-musl | |
path: ./clash-rs | |
- name: Rename binary | |
run: | | |
mv ./clash-rs/clash-x86_64-unknown-linux-musl ./clash-rs/clash-amd64 | |
mv ./clash-rs/clash-aarch64-unknown-linux-musl ./clash-rs/clash-arm64 | |
- name: Build and push release | |
uses: docker/build-push-action@v6 | |
with: | |
context: . | |
file: .github/Dockerfile | |
platforms: linux/amd64,linux/arm64 | |
push: true | |
tags: ${{ env.TAG_VERSION }},${{ env.TAG_LATEST }} | |