diff --git a/.github/build-for-linux/Dockerfile b/.github/build-for-linux/Dockerfile new file mode 100644 index 00000000..326ba69b --- /dev/null +++ b/.github/build-for-linux/Dockerfile @@ -0,0 +1,4 @@ +FROM rust:buster +COPY entrypoint.sh /entrypoint.sh +RUN chmod a+x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/.github/build-for-linux/action.yml b/.github/build-for-linux/action.yml new file mode 100644 index 00000000..17c171a0 --- /dev/null +++ b/.github/build-for-linux/action.yml @@ -0,0 +1,14 @@ +name: "Build for Linux" +branding: + icon: user-check + color: gray-dark +inputs: + target: + required: true + description: "Rust Target" + +runs: + using: "docker" + image: "Dockerfile" + args: + - ${{ inputs.target }} diff --git a/.github/build-for-linux/build.sh b/.github/build-for-linux/build.sh new file mode 100644 index 00000000..dc1844cc --- /dev/null +++ b/.github/build-for-linux/build.sh @@ -0,0 +1,9 @@ +# pnpm install --resolution-only +pnpm install +pnpm check $INPUT_TARGET +sed -i "s/#openssl/openssl={version=\"0.10\",features=[\"vendored\"]}/g" src-tauri/Cargo.toml +if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then + pnpm build --target $INPUT_TARGET +else + pnpm build --target $INPUT_TARGET -b deb +fi diff --git a/.github/build-for-linux/entrypoint.sh b/.github/build-for-linux/entrypoint.sh new file mode 100644 index 00000000..26a5b8ed --- /dev/null +++ b/.github/build-for-linux/entrypoint.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +wget https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz +tar -Jxvf ./node-v20.10.0-linux-x64.tar.xz +export PATH=$(pwd)/node-v20.10.0-linux-x64/bin:$PATH +npm install pnpm -g + +rustup target add "$INPUT_TARGET" + +if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then + apt-get update + apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev patchelf +elif [ "$INPUT_TARGET" = "i686-unknown-linux-gnu" ]; then + dpkg --add-architecture i386 + apt-get update + apt-get install -y libstdc++6:i386 libgdk-pixbuf2.0-dev:i386 libatomic1:i386 gcc-multilib g++-multilib libwebkit2gtk-4.0-dev:i386 libssl-dev:i386 libgtk-3-dev:i386 librsvg2-dev:i386 patchelf:i386 libayatana-appindicator3-dev:i386 + export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH + export PKG_CONFIG_SYSROOT_DIR=/ +elif [ "$INPUT_TARGET" = "aarch64-unknown-linux-gnu" ]; then + sed 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch-=amd64,i386] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | tee /etc/apt/sources.list.d/ports.list + sed -i 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch=amd64,i386] http:\/\/\1.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list + dpkg --add-architecture arm64 + apt-get update + apt-get install -y libncurses6:arm64 libtinfo6:arm64 linux-libc-dev:arm64 libncursesw6:arm64 libssl3:arm64 libcups2:arm64 + apt-get install -y --no-install-recommends g++-aarch64-linux-gnu libc6-dev-arm64-cross libssl-dev:arm64 libwebkit2gtk-4.0-dev:arm64 libgtk-3-dev:arm64 patchelf:arm64 librsvg2-dev:arm64 libayatana-appindicator3-dev:arm64 + export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc + export CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc + export CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++ + export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig + export PKG_CONFIG_ALLOW_CROSS=1 +elif [ "$INPUT_TARGET" = "armv7-unknown-linux-gnueabihf" ]; then + sed 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch-=amd64,i386] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | tee /etc/apt/sources.list.d/ports.list + sed -i 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch=amd64,i386] http:\/\/\1.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list + dpkg --add-architecture armhf + apt-get update + apt-get install -y libncurses6:armhf libtinfo6:armhf linux-libc-dev:armhf libncursesw6:armhf libssl3:armhf libcups2:armhf + apt-get install -y --no-install-recommends g++-arm-linux-gnueabihf libc6-dev-armhf-cross libssl-dev:armhf libwebkit2gtk-4.0-dev:armhf libgtk-3-dev:armhf patchelf:armhf librsvg2-dev:armhf libayatana-appindicator3-dev:armhf + export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc + export CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc + export CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++ + export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig + export PKG_CONFIG_ALLOW_CROSS=1 +else + echo "Unknown target: $INPUT_TARGET" && exit 1 +fi + +bash .github/build-for-linux/build.sh \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 561631be..93ea2fc8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,12 +26,6 @@ jobs: target: aarch64-apple-darwin - os: macos-latest target: x86_64-apple-darwin - - os: ubuntu-latest - target: x86_64-unknown-linux-gnu - - os: ubuntu-latest - target: aarch64-unknown-linux-gnu - # - os: ubuntu-latest - # target: armv7-unknown-linux-gnueabihf runs-on: ${{ matrix.os }} steps: @@ -61,36 +55,6 @@ jobs: version: 8 run_install: false - - name: Install Dependencies (Ubuntu Only) - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'x86_64') - run: | - sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libayatana-appindicator3-dev librsvg2-dev patchelf openssl - - - name: Install Dependencies (Ubuntu Only) - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'aarch64') - run: | - sed 's/mirror+file:\/etc\/apt\/apt-mirrors.txt/[arch-=amd64] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/ports.list - sudo sed -i 's/mirror+file/[arch=amd64] mirror+file/g' /etc/apt/sources.list - cat /etc/apt/sources.list - cat /etc/apt/sources.list.d/ports.list - sudo dpkg --add-architecture arm64 - sudo apt-get update - sudo apt-get install -y libncurses6:arm64 libtinfo6:arm64 linux-libc-dev:arm64 libncursesw6:arm64 libssl3:arm64 libcups2:arm64 - sudo apt-get install -y --no-install-recommends g++-aarch64-linux-gnu libc6-dev-arm64-cross libssl-dev:arm64 libwebkit2gtk-4.0-dev:arm64 libgtk-3-dev:arm64 patchelf:arm64 librsvg2-dev:arm64 libayatana-appindicator3-dev:arm64 - - - name: Install Dependencies (Ubuntu Only) - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'armv7') - run: | - sed 's/mirror+file:\/etc\/apt\/apt-mirrors.txt/[arch-=amd64] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/ports.list - sudo sed -i 's/mirror+file/[arch=amd64] mirror+file/g' /etc/apt/sources.list - cat /etc/apt/sources.list - cat /etc/apt/sources.list.d/ports.list - sudo dpkg --add-architecture armhf - sudo apt-get update - sudo apt-get install -y libncurses6:armhf libtinfo6:armhf linux-libc-dev:armhf libncursesw6:armhf libssl3:armhf libcups2:armhf - sudo apt-get install -y --no-install-recommends g++-arm-linux-gnueabihf libc6-dev-armhf-cross libssl-dev:armhf libwebkit2gtk-4.0-dev:armhf libgtk-3-dev:armhf patchelf:armhf librsvg2-dev:armhf libayatana-appindicator3-dev:armhf - - name: Pnpm install and check run: | pnpm i @@ -112,48 +76,6 @@ jobs: tauriScript: pnpm args: --target ${{ matrix.target }} - - name: Tauri build (Ubuntu Arm64) - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'aarch64') - uses: tauri-apps/tauri-action@v0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc - CC_aarch64_unknown_linux_gnu: aarch64-linux-gnu-gcc - CXX_aarch64_unknown_linux_gnu: aarch64-linux-gnu-g++ - PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig - PKG_CONFIG_ALLOW_CROSS: 1 - with: - tagName: v__VERSION__ - releaseName: "Clash Verge v__VERSION__" - releaseBody: "More new features are now supported." - releaseDraft: false - prerelease: false - tauriScript: pnpm - args: --target ${{ matrix.target }} -b deb,updater - - - name: Tauri build (Ubuntu Armv7) - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'armv7') - uses: tauri-apps/tauri-action@v0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc - CC_armv7_unknown_linux_gnueabihf: arm-linux-gnueabihf-gcc - CXX_armv7_unknown_linux_gnueabihf: arm-linux-gnueabihf-g++ - PKG_CONFIG_PATH: /usr/lib/arm-linux-gnueabihf/pkgconfig - PKG_CONFIG_ALLOW_CROSS: 1 - with: - tagName: v__VERSION__ - releaseName: "Clash Verge v__VERSION__" - releaseBody: "More new features are now supported." - releaseDraft: false - prerelease: false - tauriScript: pnpm - args: --target ${{ matrix.target }} -b deb,updater - - name: Portable Bundle if: matrix.os == 'windows-latest' run: | @@ -164,6 +86,54 @@ jobs: TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} VITE_WIN_PORTABLE: 1 + release-for-linux: + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: ubuntu-latest + target: i686-unknown-linux-gnu + - os: ubuntu-latest + target: aarch64-unknown-linux-gnu + # - os: ubuntu-latest + # target: armv7-unknown-linux-gnueabihf + runs-on: ${{ matrix.os }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Build for Linux + uses: ./.github/build-for-linux + env: + TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + with: + target: ${{ matrix.target }} + - name: Get Version + run: | + sudo apt-get update + sudo apt-get install jq + echo "VERSION=$(cat package.json | jq '.version')" >> $GITHUB_ENV + - name: Upload Release + if: startsWith(matrix.target, 'x86_64') + uses: softprops/action-gh-release@v1 + with: + tag_name: v${{env.VERSION}} + name: "Clash Verge v${{env.VERSION}}" + body: "More new features are now supported." + token: ${{ secrets.GITHUB_TOKEN }} + files: src-tauri/target/${{ matrix.target }}/release/bundle/appimage/*.AppImage* + - name: Upload Release + uses: softprops/action-gh-release@v1 + with: + tag_name: v${{env.VERSION}} + name: "Clash Verge v${{env.VERSION}}" + body: "More new features are now supported." + token: ${{ secrets.GITHUB_TOKEN }} + files: src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb + release-update: needs: [release] runs-on: ubuntu-latest