name: Rust on: push: branches: [ "develop", "main" ] pull_request: branches: [ "develop", "main" ] env: CARGO_TERM_COLOR: always defaults: run: # necessary for windows shell: bash jobs: build: strategy: fail-fast: false matrix: include: - TARGET: aarch64-unknown-linux-musl OS: ubuntu-latest - TARGET: x86_64-unknown-linux-musl OS: ubuntu-latest - TARGET: x86_64-apple-darwin OS: macos-latest - TARGET: aarch64-apple-darwin OS: macos-latest - TARGET: x86_64-pc-windows-msvc OS: windows-latest runs-on: ${{ matrix.OS }} env: NAME: easytier TARGET: ${{ matrix.TARGET }} OS: ${{ matrix.OS }} steps: - uses: actions/checkout@v3 - name: Setup protoc uses: arduino/setup-protoc@v2 with: # GitHub repo token to use to avoid rate limiter repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Cargo cache uses: actions/cache@v4.0.0 with: path: | ~/.cargo ./target key: build-cargo-registry-${{matrix.TARGET}} - name: Install rust target run: | # dependencies are only needed on ubuntu as that's the only place where # we make cross-compilation if [[ $OS =~ ^ubuntu.*$ ]]; then sudo apt-get update && sudo apt-get install -qq crossbuild-essential-arm64 crossbuild-essential-armhf musl-tools # curl -s musl.cc | grep mipsel case $TARGET in mipsel-unknown-linux-musl) MUSL_URI=mipsel-linux-musl-cross ;; aarch64-unknown-linux-musl) MUSL_URI=aarch64-linux-musl-cross ;; armv7-unknown-linux-musleabihf) MUSL_URI=armv7l-linux-musleabihf-cross ;; arm-unknown-linux-musleabihf) MUSL_URI=arm-linux-musleabihf-cross ;; mips-unknown-linux-musl) MUSL_URI=mips-linux-musl-cross ;; esac if [ -n "$MUSL_URI" ]; then mkdir -p ./musl_gcc wget -c https://musl.cc/$MUSL_URI.tgz -P ./musl_gcc/ tar zxf ./musl_gcc/$MUSL_URI.tgz -C ./musl_gcc/ sudo ln -s $(pwd)/musl_gcc/$MUSL_URI/bin/*gcc /usr/bin/ fi fi rustup install 1.75 rustup default 1.75 rustup target add $TARGET - name: Run build run: cargo build --release --verbose --target $TARGET - name: Compress run: | mkdir -p ./artifacts/objects/ # windows is the only OS using a different convention for executable file name if [[ $OS =~ ^windows.*$ ]]; then SUFFIX=.exe cp third_party/Packet.dll ./artifacts/objects/ cp third_party/wintun.dll ./artifacts/objects/ fi if [[ $GITHUB_REF_TYPE =~ ^tag$ ]]; then TAG=$GITHUB_REF_NAME else TAG=$GITHUB_SHA fi mv ./target/$TARGET/release/easytier-core"$SUFFIX" ./artifacts/objects/ mv ./target/$TARGET/release/easytier-cli"$SUFFIX" ./artifacts/objects/ tar -cvf ./artifacts/$NAME-$TARGET-$TAG.tar -C ./artifacts/objects/ . rm -rf ./artifacts/objects/ - name: Archive artifact uses: actions/upload-artifact@v4 with: name: easytier-${{ matrix.OS }}-${{ matrix.TARGET }} path: | ./artifacts/* - name: Upload OSS uses: Menci/upload-to-oss@main with: access-key-id: ${{ secrets.ALIYUN_OSS_ACCESS_ID }} access-key-secret: ${{ secrets.ALIYUN_OSS_ACCESS_KEY }} endpoint: ${{ secrets.ALIYUN_OSS_ENDPOINT }} bucket: ${{ secrets.ALIYUN_OSS_BUCKET }} local-path: ./artifacts/ remote-path: /easytier-releases/${{ github.sha }}/ no-delete-remote-files: true retry: 5 increment: true test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup protoc uses: arduino/setup-protoc@v2 with: # GitHub repo token to use to avoid rate limiter repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Setup tools for test run: sudo apt install bridge-utils - name: Setup system for test run: | sudo sysctl net.bridge.bridge-nf-call-iptables=0 sudo sysctl net.bridge.bridge-nf-call-ip6tables=0 - name: Cargo cache uses: actions/cache@v4.0.0 with: path: | ~/.cargo ./target key: build-cargo-registry-test - name: Run tests run: sudo -E env "PATH=$PATH" cargo test --verbose