diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b1756fa..167d3f74 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,483 +1,483 @@ -name: CI - -on: - workflow_dispatch: - pull_request: - paths-ignore: - - .gitignore - - "*.md" - - ".github/screenshots/**" - push: - paths-ignore: - - .gitignore - - "*.md" - - ".github/screenshots/**" - -env: - TRUNK_VERSION: 0.16.0 - RUST_TOOLCHAIN: 1.71.1 - DART_SDK_VERSION: 3.0.7 - DART_SASS_VERSION: 1.62.1 - LLVM_VERSION: 13.0.0 - -jobs: - test: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: - - ubuntu-latest - #- macos-latest - - windows-latest - steps: - - uses: actions/checkout@v4 - - - run: mkdir crates/tanoshi-web/dist - - - name: Install deps (ubuntu/MacOS) - if: ${{ matrix.os != 'windows-latest' }} - run: | - if [ "${{ matrix.os }}" == "ubuntu-latest" ]; then - sudo apt-get update && sudo apt-get install -y \ - libssl-dev libarchive-dev build-essential cmake llvm clang libicu-dev \ - nettle-dev libacl1-dev liblzma-dev libzstd-dev liblz4-dev libbz2-dev \ - zlib1g-dev libxml2-dev lsb-release wget software-properties-common \ - libwebkit2gtk-4.0-dev curl libgtk-3-dev libappindicator3-dev patchelf \ - librsvg2-dev libpango1.0-dev - elif [ "${{ matrix.os }}" == "macos-latest" ]; then - brew install icu4c libarchive bzip2 lz4 zlib expat libiconv - fi - - - id: cache-vcpkg - name: Cache vcpkg (windows) - uses: actions/cache@v4 - if: ${{ matrix.os == 'windows-latest' }} - with: - path: "C:/vcpkg/installed" - key: vcpkg-${{ matrix.os }}- - restore-keys: | - vcpkg-${{ matrix.os }}- - - - name: Install deps (windows) - if: ${{ matrix.os == 'windows-latest' }} - run: | - vcpkg integrate install - vcpkg install --only-downloads libarchive:x64-windows-static-md - vcpkg install libarchive:x64-windows-static-md - - - name: Install LLVM and Clang - uses: KyleMayes/install-llvm-action@v2.0.3 - with: - version: ${{ env.LLVM_VERSION }} - - - uses: dtolnay/rust-toolchain@stable - with: - toolchain: ${{ env.RUST_TOOLCHAIN }} - - - uses: Swatinem/rust-cache@v2 - - - name: Run cargo test - env: - # Fix for macos - PKG_CONFIG_PATH: /usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/zlib/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig - run: | - cargo test - - build-web: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: dtolnay/rust-toolchain@stable - with: - toolchain: ${{ env.RUST_TOOLCHAIN }} - target: wasm32-unknown-unknown - - - uses: Swatinem/rust-cache@v2 - - - name: Build tanoshi-web - run: | - export DART_ARCH="linux-x64" && \ - curl -s "https://storage.googleapis.com/dart-archive/channels/stable/release/${{ env.DART_SDK_VERSION }}/sdk/dartsdk-${DART_ARCH}-release.zip" -o "dartsdk-${DART_ARCH}-release.zip" && \ - unzip "dartsdk-${DART_ARCH}-release.zip" - - export PATH="$PATH:$(pwd)/dart-sdk/bin" - - curl -sL "https://github.com/sass/dart-sass/archive/refs/tags/${{ env.DART_SASS_VERSION }}.zip" -o "${{ env.DART_SASS_VERSION }}.zip" && \ - unzip "${{ env.DART_SASS_VERSION }}.zip" && \ - cd "dart-sass-${{ env.DART_SASS_VERSION }}" && \ - dart pub get && \ - dart compile exe bin/sass.dart -o ${{ github.workspace }}/dart-sdk/bin/sass -Dversion="${{ env.DART_SASS_VERSION }}" - - cd ${{ github.workspace }} - cargo install trunk --version ${{ env.TRUNK_VERSION }} --locked - cd crates/tanoshi-web && trunk build --release - - - name: Upload tanoshi-web - uses: actions/upload-artifact@v4 - with: - name: tanoshi-web - path: crates/tanoshi-web/dist - - build-desktop: - runs-on: ${{ matrix.os }} - needs: - - build-web - strategy: - fail-fast: false - matrix: - os: - - ubuntu-latest - #- macos-latest - - windows-latest - - steps: - - uses: actions/checkout@v4 - - - name: Download dist - uses: actions/download-artifact@v4 - with: - name: tanoshi-web - path: crates/tanoshi-web/dist - - - uses: dtolnay/rust-toolchain@stable - with: - toolchain: ${{ env.RUST_TOOLCHAIN }} - - - uses: Swatinem/rust-cache@v2 - - - name: Install tauri-cli - run: cargo install tauri-cli --version ^1.0.0-rc --locked - - - name: Install deps - if: ${{ matrix.os == 'ubuntu-latest' }} - run: sudo apt update && sudo apt upgrade -y && sudo apt install -y libssl-dev libarchive-dev build-essential cmake llvm clang libicu-dev nettle-dev libacl1-dev liblzma-dev libzstd-dev liblz4-dev libbz2-dev zlib1g-dev libxml2-dev lsb-release wget software-properties-common libwebkit2gtk-4.0-dev curl libgtk-3-dev libappindicator3-dev patchelf librsvg2-dev libpango1.0-dev - - - name: Install deps - if: ${{ matrix.os == 'macos-latest' }} - run: brew install icu4c libarchive bzip2 lz4 zlib expat libiconv - - - name: Install LLVM and Clang - uses: KyleMayes/install-llvm-action@v2.0.3 - with: - version: ${{ env.LLVM_VERSION }} - - - name: Cache vcpkg - uses: actions/cache@v4 - if: ${{ matrix.os == 'windows-latest' }} - with: - path: "C:/vcpkg/installed" - key: vcpkg-${{ matrix.os }}- - restore-keys: | - vcpkg-${{ matrix.os }}- - - - name: Install deps - if: ${{ matrix.os == 'windows-latest' }} - run: | - vcpkg integrate install - vcpkg install --only-downloads libarchive:x64-windows-static-md - vcpkg install libarchive:x64-windows-static-md - - - name: Build tanoshi (ubuntu) - if: ${{ matrix.os == 'ubuntu-latest' }} - env: - RUSTFLAGS: "-Clink-arg=-Wl,--allow-multiple-definition" - run: | - cd crates/tanoshi - cargo tauri build - - - name: Build tanoshi (macos) - if: ${{ matrix.os == 'macos-latest' }} - env: - PKG_CONFIG_PATH: /usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/zlib/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig - run: | - cd crates/tanoshi - cargo tauri build - - - name: Build tanoshi (windows) - if: ${{ matrix.os == 'windows-latest' }} - run: | - cd crates/tanoshi - cargo tauri build - - - name: Move files (linux/macOS) - if: ${{ matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' }} - run: | - mkdir -p builds - find target/release/bundle/ -type f \( -name "*.deb" -o -name "*.AppImage" -o -name "*.dmg" \) -print0 | - while IFS= read -r -d '' file; do - mv "$file" ${{ github.workspace }}/builds/ - done - - - name: Move files (windows) - if: ${{ matrix.os == 'windows-latest' }} - run: | - mkdir -p builds - mv target/release/bundle/msi/*.msi ${{ github.workspace }}/builds/ - - - name: Upload dist - uses: actions/upload-artifact@v4 - with: - name: tanoshi-desktop-${{ matrix.os }} - path: ${{ github.workspace }}/builds/ - - - name: Upload binaries to GitHub Releases - if: startsWith(github.ref, 'refs/tags/') - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ${{ github.workspace }}/builds/* - tag: ${{ github.ref }} - file_glob: true - overwrite: true - - build-cli: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install deps - run: sudo apt update && sudo apt upgrade -y && sudo apt install -y libssl-dev libarchive-dev build-essential cmake libicu-dev nettle-dev libacl1-dev liblzma-dev libzstd-dev liblz4-dev libbz2-dev zlib1g-dev libxml2-dev lsb-release wget software-properties-common libwebkit2gtk-4.0-dev curl libgtk-3-dev libappindicator3-dev patchelf librsvg2-dev libpango1.0-dev - - - name: Install LLVM and Clang - uses: KyleMayes/install-llvm-action@v2.0.3 - with: - version: ${{ env.LLVM_VERSION }} - - - name: Install rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: ${{ env.RUST_TOOLCHAIN }} - - - name: Build tanoshi-cli - env: - RUSTFLAGS: "-Clink-arg=-Wl,--allow-multiple-definition" - run: | - cargo build -p tanoshi-cli --release - - - name: Copy artifact - run: | - mkdir ${{ github.workspace }}/artifact/ - cp ${{ github.workspace }}/target/release/tanoshi-cli ${{ github.workspace }}/artifact/ - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: tanoshi-cli - path: ${{ github.workspace }}/artifact/tanoshi-cli - - - name: Upload binaries to GitHub Releases - if: startsWith(github.ref, 'refs/tags/') - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: target/release/tanoshi-cli - asset_name: tanoshi-cli - tag: ${{ github.ref }} - - build-docker-amd64: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - include: - - dockerfile: Dockerfile - variant: slim - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to ghcr.io - id: docker_login - continue-on-error: true - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Docker meta - id: docker_meta_amd64 - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/${{ github.actor }}/tanoshi - tags: | - type=raw,value=latest,enable=${{ matrix.variant == 'slim' && github.ref_name == github.event.repository.default_branch }} - type=raw,value=dev,enable=${{ matrix.variant == 'slim' && github.ref_name == 'dev' }} - type=raw,value=latest,suffix=-${{ matrix.variant }},enable={{ is_default_branch }} - type=ref,event=branch,suffix=-${{ matrix.variant }} - type=ref,event=pr,suffix=-${{ matrix.variant }} - type=semver,pattern={{ version }},suffix=-${{ matrix.variant }} - type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }} - type=sha,suffix=-${{ matrix.variant }} - - - name: Build - if: "${{ steps.docker_login.outcome != 'success' }}" - uses: docker/build-push-action@v6 - with: - context: . - file: ${{ matrix.dockerfile }} - platforms: linux/amd64 - push: false - tags: ${{ steps.docker_meta_amd64.outputs.tags }} - labels: ${{ steps.docker_meta_amd64.outputs.labels }} - build-args: | - BUILD_WEB=false - cache-from: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache - cache-to: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache,mode=max - - - name: Build Push - if: "${{ steps.docker_login.outcome == 'success' && steps.docker_meta_amd64.outputs.tags != '' }}" - uses: docker/build-push-action@v6 - with: - context: . - file: ${{ matrix.dockerfile }} - platforms: linux/amd64 - push: true - tags: ${{ steps.docker_meta_amd64.outputs.tags }} - labels: ${{ steps.docker_meta_amd64.outputs.labels }} - build-args: | - BUILD_WEB=false - cache-from: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache - cache-to: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache,mode=max - - build-docker-aarch64: - runs-on: [self-hosted, arm64] - if: ${{ github.event_name == 'push' }} - strategy: - fail-fast: false - matrix: - include: - - dockerfile: Dockerfile - variant: slim - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to ghcr.io - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Docker meta - id: docker_meta_aarch64 - env: - ARCH: aarch64 - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/${{ github.actor }}/tanoshi - tags: | - type=raw,value=latest,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == 'slim' && github.ref_name == github.event.repository.default_branch }} - type=raw,value=dev,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == 'slim' && github.ref_name == 'dev' }} - type=raw,value=latest,suffix=-${{ matrix.variant }}-${{ env.ARCH }},enable={{ is_default_branch }} - type=ref,event=branch,suffix=-${{ matrix.variant }}-${{ env.ARCH }} - type=ref,event=pr,suffix=-${{ matrix.variant }}-${{ env.ARCH }} - type=semver,pattern={{ version }},suffix=-${{ matrix.variant }}-${{ env.ARCH }} - type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }}-${{ env.ARCH }} - type=sha,suffix=-${{ matrix.variant }}-${{ env.ARCH }} - - - name: Build Push - id: build_push - env: - ARCH: aarch64 - if: "${{ steps.docker_meta_aarch64.outputs.tags != '' }}" - uses: docker/build-push-action@v6 - with: - context: . - file: ${{ matrix.dockerfile }} - platforms: linux/aarch64 - push: true - tags: ${{ steps.docker_meta_aarch64.outputs.tags }} - labels: ${{ steps.docker_meta_aarch64.outputs.labels }} - build-args: | - BUILD_WEB=false - cache-from: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache-${{ env.ARCH }} - cache-to: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache-${{ env.ARCH }},mode=max - - docker-build-merge: - runs-on: ubuntu-latest - if: ${{ github.event_name == 'push' }} - needs: - - build-docker-amd64 - - build-docker-aarch64 - strategy: - fail-fast: false - matrix: - include: - - dockerfile: Dockerfile - variant: slim - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to ghcr.io - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Docker meta - id: docker_meta - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/${{ github.actor }}/tanoshi - tags: | - type=raw,value=latest,enable=${{ matrix.variant == 'slim' && github.ref_name == github.event.repository.default_branch }} - type=raw,value=dev,enable=${{ matrix.variant == 'slim' && github.ref_name == 'dev' }} - type=raw,value=latest,suffix=-${{ matrix.variant }},enable={{ is_default_branch }} - type=ref,event=branch,suffix=-${{ matrix.variant }} - type=ref,event=pr,suffix=-${{ matrix.variant }} - type=semver,pattern={{ version }},suffix=-${{ matrix.variant }} - type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }} - type=sha,suffix=-${{ matrix.variant }} - - - name: Install deps - run: | - sudo apt-get update && sudo apt-get install -y jq - - - name: Login to DockerHub - env: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - if: "${{ env.DOCKER_USERNAME != '' }}" - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - # Use the merged tags to create a single manifest tag - - name: Create Combined Manifest Tag - id: create_combined_manifest - env: - DOCKER_CLI_ACI: "1" - run: | - for TAG in $(jq -r '.tags[]' <<< "$DOCKER_METADATA_OUTPUT_JSON"); do - echo "Creating manifest tag $TAG" - # Replace ghcr.io/${{ github.actor }} with docker.io/${{ secrets.DOCKER_USERNAME }} if DOCKER_USERNAME is set - if [ "${{ secrets.DOCKER_USERNAME }}" != "" ]; then - DOCKERHUB_TAG=$(echo "--tag $TAG" | sed "s/ghcr.io\/${{ github.actor }}/${{ secrets.DOCKER_USERNAME }}/") - else - DOCKERHUB_TAG="" - fi - - docker buildx imagetools create --append "${TAG}-aarch64" --tag "${TAG}" ${DOCKERHUB_TAG} - done +name: CI + +on: + workflow_dispatch: + pull_request: + paths-ignore: + - .gitignore + - "*.md" + - ".github/screenshots/**" + push: + paths-ignore: + - .gitignore + - "*.md" + - ".github/screenshots/**" + +env: + TRUNK_VERSION: 0.16.0 + RUST_TOOLCHAIN: 1.71.1 + DART_SDK_VERSION: 3.0.7 + DART_SASS_VERSION: 1.62.1 + LLVM_VERSION: 13.0.0 + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + #- macos-latest + - windows-latest + steps: + - uses: actions/checkout@v4 + + - run: mkdir crates/tanoshi-web/dist + + - name: Install deps (ubuntu/MacOS) + if: ${{ matrix.os != 'windows-latest' }} + run: | + if [ "${{ matrix.os }}" == "ubuntu-latest" ]; then + sudo apt-get update && sudo apt-get install -y \ + libssl-dev libarchive-dev build-essential cmake llvm clang libicu-dev \ + nettle-dev libacl1-dev liblzma-dev libzstd-dev liblz4-dev libbz2-dev \ + zlib1g-dev libxml2-dev lsb-release wget software-properties-common \ + libwebkit2gtk-4.0-dev curl libgtk-3-dev libappindicator3-dev patchelf \ + librsvg2-dev libpango1.0-dev + elif [ "${{ matrix.os }}" == "macos-latest" ]; then + brew install icu4c libarchive bzip2 lz4 zlib expat libiconv + fi + + - id: cache-vcpkg + name: Cache vcpkg (windows) + uses: actions/cache@v4 + if: ${{ matrix.os == 'windows-latest' }} + with: + path: "C:/vcpkg/installed" + key: vcpkg-${{ matrix.os }}- + restore-keys: | + vcpkg-${{ matrix.os }}- + + - name: Install deps (windows) + if: ${{ matrix.os == 'windows-latest' }} + run: | + vcpkg integrate install + vcpkg install --only-downloads libarchive:x64-windows-static-md + vcpkg install libarchive:x64-windows-static-md + + - name: Install LLVM and Clang + uses: KyleMayes/install-llvm-action@v2.0.3 + with: + version: ${{ env.LLVM_VERSION }} + + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} + + - uses: Swatinem/rust-cache@v2 + + - name: Run cargo test + env: + # Fix for macos + PKG_CONFIG_PATH: /usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/zlib/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig + run: | + cargo test + + build-web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} + target: wasm32-unknown-unknown + + - uses: Swatinem/rust-cache@v2 + + - name: Build tanoshi-web + run: | + export DART_ARCH="linux-x64" && \ + curl -s "https://storage.googleapis.com/dart-archive/channels/stable/release/${{ env.DART_SDK_VERSION }}/sdk/dartsdk-${DART_ARCH}-release.zip" -o "dartsdk-${DART_ARCH}-release.zip" && \ + unzip "dartsdk-${DART_ARCH}-release.zip" + + export PATH="$PATH:$(pwd)/dart-sdk/bin" + + curl -sL "https://github.com/sass/dart-sass/archive/refs/tags/${{ env.DART_SASS_VERSION }}.zip" -o "${{ env.DART_SASS_VERSION }}.zip" && \ + unzip "${{ env.DART_SASS_VERSION }}.zip" && \ + cd "dart-sass-${{ env.DART_SASS_VERSION }}" && \ + dart pub get && \ + dart compile exe bin/sass.dart -o ${{ github.workspace }}/dart-sdk/bin/sass -Dversion="${{ env.DART_SASS_VERSION }}" + + cd ${{ github.workspace }} + cargo install trunk --version ${{ env.TRUNK_VERSION }} --locked + cd crates/tanoshi-web && trunk build --release + + - name: Upload tanoshi-web + uses: actions/upload-artifact@v4 + with: + name: tanoshi-web + path: crates/tanoshi-web/dist + + build-desktop: + runs-on: ${{ matrix.os }} + needs: + - build-web + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + #- macos-latest + - windows-latest + + steps: + - uses: actions/checkout@v4 + + - name: Download dist + uses: actions/download-artifact@v4 + with: + name: tanoshi-web + path: crates/tanoshi-web/dist + + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} + + - name: Install deps + if: ${{ matrix.os == 'ubuntu-latest' }} + run: sudo apt update && sudo apt upgrade -y && sudo apt install -y libssl-dev libarchive-dev build-essential cmake llvm clang libicu-dev nettle-dev libacl1-dev liblzma-dev libzstd-dev liblz4-dev libbz2-dev zlib1g-dev libxml2-dev lsb-release wget software-properties-common libwebkit2gtk-4.0-dev curl libgtk-3-dev libappindicator3-dev patchelf librsvg2-dev libpango1.0-dev + + - name: Install deps + if: ${{ matrix.os == 'macos-latest' }} + run: brew install icu4c libarchive bzip2 lz4 zlib expat libiconv + + - name: Install LLVM and Clang + uses: KyleMayes/install-llvm-action@v2.0.3 + with: + version: ${{ env.LLVM_VERSION }} + + - name: Cache vcpkg + uses: actions/cache@v4 + if: ${{ matrix.os == 'windows-latest' }} + with: + path: "C:/vcpkg/installed" + key: vcpkg-${{ matrix.os }}- + restore-keys: | + vcpkg-${{ matrix.os }}- + + - name: Install deps + if: ${{ matrix.os == 'windows-latest' }} + run: | + vcpkg integrate install + vcpkg install --only-downloads libarchive:x64-windows-static-md + vcpkg install libarchive:x64-windows-static-md + + - uses: Swatinem/rust-cache@v2 + + - name: Install tauri-cli + run: cargo install tauri-cli --version ^1.0.0-rc --locked + + - name: Build tanoshi (ubuntu) + if: ${{ matrix.os == 'ubuntu-latest' }} + env: + RUSTFLAGS: "-Clink-arg=-Wl,--allow-multiple-definition" + run: | + cd crates/tanoshi + cargo tauri build + + - name: Build tanoshi (macos) + if: ${{ matrix.os == 'macos-latest' }} + env: + PKG_CONFIG_PATH: /usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/zlib/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig + run: | + cd crates/tanoshi + cargo tauri build + + - name: Build tanoshi (windows) + if: ${{ matrix.os == 'windows-latest' }} + run: | + cd crates/tanoshi + cargo tauri build + + - name: Move files (linux/macOS) + if: ${{ matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' }} + run: | + mkdir -p builds + find target/release/bundle/ -type f \( -name "*.deb" -o -name "*.AppImage" -o -name "*.dmg" \) -print0 | + while IFS= read -r -d '' file; do + mv "$file" ${{ github.workspace }}/builds/ + done + + - name: Move files (windows) + if: ${{ matrix.os == 'windows-latest' }} + run: | + mkdir -p builds + mv target/release/bundle/msi/*.msi ${{ github.workspace }}/builds/ + + - name: Upload dist + uses: actions/upload-artifact@v4 + with: + name: tanoshi-desktop-${{ matrix.os }} + path: ${{ github.workspace }}/builds/ + + - name: Upload binaries to GitHub Releases + if: startsWith(github.ref, 'refs/tags/') + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ github.workspace }}/builds/* + tag: ${{ github.ref }} + file_glob: true + overwrite: true + + build-cli: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install deps + run: sudo apt update && sudo apt upgrade -y && sudo apt install -y libssl-dev libarchive-dev build-essential cmake libicu-dev nettle-dev libacl1-dev liblzma-dev libzstd-dev liblz4-dev libbz2-dev zlib1g-dev libxml2-dev lsb-release wget software-properties-common libwebkit2gtk-4.0-dev curl libgtk-3-dev libappindicator3-dev patchelf librsvg2-dev libpango1.0-dev + + - name: Install LLVM and Clang + uses: KyleMayes/install-llvm-action@v2.0.3 + with: + version: ${{ env.LLVM_VERSION }} + + - name: Install rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ env.RUST_TOOLCHAIN }} + + - name: Build tanoshi-cli + env: + RUSTFLAGS: "-Clink-arg=-Wl,--allow-multiple-definition" + run: | + cargo build -p tanoshi-cli --release + + - name: Copy artifact + run: | + mkdir ${{ github.workspace }}/artifact/ + cp ${{ github.workspace }}/target/release/tanoshi-cli ${{ github.workspace }}/artifact/ + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: tanoshi-cli + path: ${{ github.workspace }}/artifact/tanoshi-cli + + - name: Upload binaries to GitHub Releases + if: startsWith(github.ref, 'refs/tags/') + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: target/release/tanoshi-cli + asset_name: tanoshi-cli + tag: ${{ github.ref }} + + build-docker-amd64: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - dockerfile: Dockerfile + variant: slim + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to ghcr.io + id: docker_login + continue-on-error: true + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker meta + id: docker_meta_amd64 + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/${{ github.actor }}/tanoshi + tags: | + type=raw,value=latest,enable=${{ matrix.variant == 'slim' && github.ref_name == github.event.repository.default_branch }} + type=raw,value=dev,enable=${{ matrix.variant == 'slim' && github.ref_name == 'dev' }} + type=raw,value=latest,suffix=-${{ matrix.variant }},enable={{ is_default_branch }} + type=ref,event=branch,suffix=-${{ matrix.variant }} + type=ref,event=pr,suffix=-${{ matrix.variant }} + type=semver,pattern={{ version }},suffix=-${{ matrix.variant }} + type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }} + type=sha,suffix=-${{ matrix.variant }} + + - name: Build + if: "${{ steps.docker_login.outcome != 'success' }}" + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.dockerfile }} + platforms: linux/amd64 + push: false + tags: ${{ steps.docker_meta_amd64.outputs.tags }} + labels: ${{ steps.docker_meta_amd64.outputs.labels }} + build-args: | + BUILD_WEB=false + cache-from: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache + cache-to: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache,mode=max + + - name: Build Push + if: "${{ steps.docker_login.outcome == 'success' && steps.docker_meta_amd64.outputs.tags != '' }}" + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.dockerfile }} + platforms: linux/amd64 + push: true + tags: ${{ steps.docker_meta_amd64.outputs.tags }} + labels: ${{ steps.docker_meta_amd64.outputs.labels }} + build-args: | + BUILD_WEB=false + cache-from: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache + cache-to: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache,mode=max + + build-docker-aarch64: + runs-on: [self-hosted, arm64] + if: ${{ github.event_name == 'push' }} + strategy: + fail-fast: false + matrix: + include: + - dockerfile: Dockerfile + variant: slim + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to ghcr.io + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker meta + id: docker_meta_aarch64 + env: + ARCH: aarch64 + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/${{ github.actor }}/tanoshi + tags: | + type=raw,value=latest,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == 'slim' && github.ref_name == github.event.repository.default_branch }} + type=raw,value=dev,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == 'slim' && github.ref_name == 'dev' }} + type=raw,value=latest,suffix=-${{ matrix.variant }}-${{ env.ARCH }},enable={{ is_default_branch }} + type=ref,event=branch,suffix=-${{ matrix.variant }}-${{ env.ARCH }} + type=ref,event=pr,suffix=-${{ matrix.variant }}-${{ env.ARCH }} + type=semver,pattern={{ version }},suffix=-${{ matrix.variant }}-${{ env.ARCH }} + type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }}-${{ env.ARCH }} + type=sha,suffix=-${{ matrix.variant }}-${{ env.ARCH }} + + - name: Build Push + id: build_push + env: + ARCH: aarch64 + if: "${{ steps.docker_meta_aarch64.outputs.tags != '' }}" + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ matrix.dockerfile }} + platforms: linux/aarch64 + push: true + tags: ${{ steps.docker_meta_aarch64.outputs.tags }} + labels: ${{ steps.docker_meta_aarch64.outputs.labels }} + build-args: | + BUILD_WEB=false + cache-from: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache-${{ env.ARCH }} + cache-to: type=registry,ref=ghcr.io/${{ github.actor }}/tanoshi:buildcache-${{ env.ARCH }},mode=max + + docker-build-merge: + runs-on: ubuntu-latest + if: ${{ github.event_name == 'push' }} + needs: + - build-docker-amd64 + - build-docker-aarch64 + strategy: + fail-fast: false + matrix: + include: + - dockerfile: Dockerfile + variant: slim + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to ghcr.io + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Docker meta + id: docker_meta + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/${{ github.actor }}/tanoshi + tags: | + type=raw,value=latest,enable=${{ matrix.variant == 'slim' && github.ref_name == github.event.repository.default_branch }} + type=raw,value=dev,enable=${{ matrix.variant == 'slim' && github.ref_name == 'dev' }} + type=raw,value=latest,suffix=-${{ matrix.variant }},enable={{ is_default_branch }} + type=ref,event=branch,suffix=-${{ matrix.variant }} + type=ref,event=pr,suffix=-${{ matrix.variant }} + type=semver,pattern={{ version }},suffix=-${{ matrix.variant }} + type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }} + type=sha,suffix=-${{ matrix.variant }} + + - name: Install deps + run: | + sudo apt-get update && sudo apt-get install -y jq + + - name: Login to DockerHub + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + if: "${{ env.DOCKER_USERNAME != '' }}" + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + + # Use the merged tags to create a single manifest tag + - name: Create Combined Manifest Tag + id: create_combined_manifest + env: + DOCKER_CLI_ACI: "1" + run: | + for TAG in $(jq -r '.tags[]' <<< "$DOCKER_METADATA_OUTPUT_JSON"); do + echo "Creating manifest tag $TAG" + # Replace ghcr.io/${{ github.actor }} with docker.io/${{ secrets.DOCKER_USERNAME }} if DOCKER_USERNAME is set + if [ "${{ secrets.DOCKER_USERNAME }}" != "" ]; then + DOCKERHUB_TAG=$(echo "--tag $TAG" | sed "s/ghcr.io\/${{ github.actor }}/${{ secrets.DOCKER_USERNAME }}/") + else + DOCKERHUB_TAG="" + fi + + docker buildx imagetools create --append "${TAG}-aarch64" --tag "${TAG}" ${DOCKERHUB_TAG} + done