diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml new file mode 100644 index 0000000..678c742 --- /dev/null +++ b/.github/workflows/core.yml @@ -0,0 +1,175 @@ +name: EasyTier Core + +on: + push: + branches: ["develop", "main"] + paths: + - "easytier.toml" + - "easytier/**" + - ".github/workflows/core.yml" + pull_request: + branches: ["develop", "main"] + paths: + - "easytier.toml" + - "easytier/**" + - ".github/workflows/core.yml" + +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: mips-unknown-linux-musl + OS: ubuntu-latest + - TARGET: mipsel-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 }} + OSS_BUCKET: ${{ secrets.ALIYUN_OSS_BUCKET }} + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v4 + with: + node-version: 21 + + - name: Cargo cache + uses: actions/cache@v4 + with: + path: | + ~/.cargo + ./target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - 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-muslsf + ;; + aarch64-unknown-linux-musl) + MUSL_URI=aarch64-linux-musl + ;; + armv7-unknown-linux-musleabihf) + MUSL_URI=armv7l-linux-musleabihf + ;; + arm-unknown-linux-musleabihf) + MUSL_URI=arm-linux-musleabihf + ;; + mips-unknown-linux-musl) + MUSL_URI=mips-linux-muslsf + ;; + esac + + if [ -n "$MUSL_URI" ]; then + mkdir -p ./musl_gcc + wget -c https://musl.cc/${MUSL_URI}-cross.tgz -P ./musl_gcc/ + tar zxf ./musl_gcc/${MUSL_URI}-cross.tgz -C ./musl_gcc/ + sudo ln -s $(pwd)/musl_gcc/${MUSL_URI}-cross/bin/*gcc /usr/bin/ + fi + fi + + # see https://github.com/rust-lang/rustup/issues/3709 + rustup set auto-self-update disable + rustup install 1.75 + rustup default 1.75 + + # mips/mipsel cannot add target from rustup, need compile by ourselves + if [[ $OS =~ ^ubuntu.*$ && $TARGET =~ ^mips.*$ ]]; then + cd "$PWD/musl_gcc/${MUSL_URI}-cross/lib/gcc/${MUSL_URI}/11.2.1" || exit 255 + # for panic-abort + cp libgcc_eh.a libunwind.a + + # for mimalloc + ar x libgcc.a _ctzsi2.o _clz.o _bswapsi2.o + ar rcs libctz.a _ctzsi2.o _clz.o _bswapsi2.o + + rustup toolchain install nightly-x86_64-unknown-linux-gnu + rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu + cd - + else + rustup target add $TARGET + fi + + - name: Setup protoc + uses: arduino/setup-protoc@v2 + with: + # GitHub repo token to use to avoid rate limiter + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Build Core & Cli + run: | + if [[ $OS =~ ^ubuntu.*$ && $TARGET =~ ^mips.*$ ]]; then + cargo +nightly build -r --verbose --target $TARGET -Z build-std --no-default-features --features mips + else + cargo build --release --verbose --target $TARGET + fi + + - 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 easytier/third_party/Packet.dll ./artifacts/objects/ + cp easytier/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 + if: ${{ env.OSS_BUCKET != '' }} + 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 diff --git a/.github/workflows/rust.yml b/.github/workflows/gui.yml similarity index 83% rename from .github/workflows/rust.yml rename to .github/workflows/gui.yml index 21ee9a0..f5b5dd3 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/gui.yml @@ -1,11 +1,21 @@ -name: Rust +name: EasyTier GUI on: push: branches: ["develop", "main"] + paths: + - "easytier.toml" + - "easytier/**" + - "easytier-gui/**" + - ".github/workflows/gui.yml" pull_request: branches: ["develop", "main"] - + paths: + - "easytier.toml" + - "easytier/**" + - "easytier-gui/**" + - ".github/workflows/gui.yml" + env: CARGO_TERM_COLOR: always @@ -26,12 +36,6 @@ jobs: - TARGET: x86_64-unknown-linux-musl OS: ubuntu-latest GUI_TARGET: x86_64-unknown-linux-gnu - - TARGET: mips-unknown-linux-musl - OS: ubuntu-latest - GUI_TARGET: - - TARGET: mipsel-unknown-linux-musl - OS: ubuntu-latest - GUI_TARGET: - TARGET: x86_64-apple-darwin OS: macos-latest @@ -164,14 +168,6 @@ jobs: # GitHub repo token to use to avoid rate limiter repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Build Core & Cli - run: | - if [[ $OS =~ ^ubuntu.*$ && $TARGET =~ ^mips.*$ ]]; then - cargo +nightly build -r --verbose --target $TARGET -Z build-std --no-default-features --features mips - else - cargo build --release --verbose --target $TARGET - fi - - name: Install GUI cross compile (aarch64 only) if: ${{ matrix.TARGET == 'aarch64-unknown-linux-musl' }} run: | @@ -215,20 +211,12 @@ jobs: - 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 easytier/third_party/Packet.dll ./artifacts/objects/ - cp easytier/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/ - # copy gui bundle, gui is built without specific target if [[ $OS =~ ^windows.*$ ]]; then mv ./target/$GUI_TARGET/release/bundle/nsis/*.exe ./artifacts/objects/ @@ -263,38 +251,4 @@ jobs: local-path: ./artifacts/ remote-path: /easytier-releases/${{ github.sha }}/ no-delete-remote-files: true - retry: 5 - 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 - sudo sysctl net.ipv6.conf.lo.disable_ipv6=0 - sudo ip addr add 2001:db8::2/64 dev lo - - - name: Cargo cache - uses: actions/cache@v4 - with: - path: | - ~/.cargo - ./target - key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock') }} - - - name: Run tests - run: | - sudo -E env "PATH=$PATH" cargo test --verbose - sudo chown -R $USER:$USER ./target - sudo chown -R $USER:$USER ~/.cargo + retry: 5 \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..cff4b52 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,61 @@ +name: EasyTier Test + +on: + push: + branches: ["develop", "main"] + paths: + - "easytier.toml" + - "easytier/**" + - "easytier-gui/**" + - ".github/workflows/test.yml" + pull_request: + branches: ["develop", "main"] + paths: + - "easytier.toml" + - "easytier/**" + - "easytier-gui/**" + - ".github/workflows/test.yml" + +env: + CARGO_TERM_COLOR: always + +defaults: + run: + # necessary for windows + shell: bash + +jobs: + 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 + sudo sysctl net.ipv6.conf.lo.disable_ipv6=0 + sudo ip addr add 2001:db8::2/64 dev lo + + - name: Cargo cache + uses: actions/cache@v4 + with: + path: | + ~/.cargo + ./target + key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock') }} + + - name: Run tests + run: | + sudo -E env "PATH=$PATH" cargo test --verbose + sudo chown -R $USER:$USER ./target + sudo chown -R $USER:$USER ~/.cargo