Initial #261
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: CI | |
on: | |
workflow_dispatch: | |
pull_request: | |
paths-ignore: | |
- .gitignore | |
- "*.md" | |
- ".github/screenshots/**" | |
push: | |
paths-ignore: | |
- .gitignore | |
- "*.md" | |
- ".github/screenshots/**" | |
env: | |
LLVM_VERSION: 15 | |
UBUNTU_DEPS: | | |
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.1-dev curl libgtk-3-dev libappindicator3-dev patchelf \ | |
librsvg2-dev libpango1.0-dev libsoup-3.0-dev libjavascriptcoregtk-4.1-dev \ | |
libb2-dev | |
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 ${{ env.UBUNTU_DEPS }} | |
elif [ "${{ matrix.os }}" == "macos-latest" ]; then | |
brew install icu4c libarchive bzip2 lz4 zlib expat libiconv | |
fi | |
- uses: ilammy/setup-nasm@v1 | |
- 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/[email protected] | |
with: | |
version: ${{ env.LLVM_VERSION }} | |
- 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 | |
container: | |
image: ghcr.io/luigi311/tanoshi-builder:sha-6886658-slim | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: Swatinem/rust-cache@v2 | |
- name: Build tanoshi-web | |
run: 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 | |
- name: Install deps (ubuntu) | |
if: ${{ matrix.os == 'ubuntu-latest' }} | |
run: sudo apt update && sudo apt upgrade -y && sudo apt install -y ${{ env.UBUNTU_DEPS }} | |
- name: Install deps (macOS) | |
if: ${{ matrix.os == 'macos-latest' }} | |
run: brew install icu4c libarchive bzip2 lz4 zlib expat libiconv | |
- uses: ilammy/setup-nasm@v1 | |
- name: Install LLVM and Clang | |
uses: KyleMayes/[email protected] | |
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 (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 | |
- uses: Swatinem/rust-cache@v2 | |
- name: Install tauri-cli | |
run: cargo install tauri-cli --version ^2.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-tauri | |
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-tauri | |
cargo tauri build | |
- name: Build tanoshi (windows) | |
if: ${{ matrix.os == 'windows-latest' }} | |
run: | | |
cd crates/tanoshi-tauri | |
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 | |
container: | |
image: ghcr.io/luigi311/tanoshi-builder:sha-6886658-slim | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: Swatinem/rust-cache@v2 | |
- name: Build tanoshi-cli | |
env: | |
RUSTFLAGS: "-Clink-arg=-Wl,--allow-multiple-definition" | |
run: | | |
cargo build -p tanoshi-cli --release | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: tanoshi-cli | |
path: ${{ github.workspace }}/target/release/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 | |
env: | |
DEFAULT_VARIANT: slim | |
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: | | |
# Do not push to ghcr.io on PRs due to permission issues, only push if the owner is luigi311 so it doesnt fail on forks | |
ghcr.io/${{ github.repository }},enable=${{ github.event_name != 'pull_request' && github.repository_owner == 'luigi311'}} | |
flavor: latest=false | |
tags: | | |
type=raw,value=latest,enable=${{ matrix.variant == env.DEFAULT_VARIANT && startsWith(github.ref, 'refs/tags/') }} | |
type=raw,value=latest,suffix=-${{ matrix.variant }},enable=${{ startsWith(github.ref, 'refs/tags/') }} | |
type=ref,event=branch,suffix=-${{ matrix.variant }} | |
type=ref,event=branch,enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=ref,event=pr,suffix=-${{ matrix.variant }} | |
type=ref,event=pr,enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=semver,pattern={{ version }},suffix=-${{ matrix.variant }} | |
type=semver,pattern={{ version }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }} | |
type=semver,pattern={{ major }}.{{ minor }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=sha,suffix=-${{ matrix.variant }} | |
type=sha,enable=${{ matrix.variant == env.DEFAULT_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' }} | |
env: | |
DEFAULT_VARIANT: slim | |
ARCH: 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_aarch64 | |
uses: docker/metadata-action@v5 | |
with: | |
images: | | |
# Do not push to ghcr.io on PRs due to permission issues, only push if the owner is luigi311 so it doesnt fail on forks | |
ghcr.io/${{ github.repository }},enable=${{ github.event_name != 'pull_request' && github.repository_owner == 'luigi311'}} | |
flavor: latest=false | |
tags: | | |
type=raw,value=latest,suffix=-${{ matrix.variant }}-${{ env.ARCH }},enable=${{ startsWith(github.ref, 'refs/tags/') }} | |
type=raw,value=latest,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == env.DEFAULT_VARIANT && startsWith(github.ref, 'refs/tags/') }} | |
type=ref,event=branch,suffix=-${{ matrix.variant }}-${{ env.ARCH }} | |
type=ref,event=branch,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=ref,event=pr,suffix=-${{ matrix.variant }}-${{ env.ARCH }} | |
type=ref,event=pr,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=semver,pattern={{ version }},suffix=-${{ matrix.variant }}-${{ env.ARCH }} | |
type=semver,pattern={{ version }},suffix=-${{ env.ARCH }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }}-${{ env.ARCH }} | |
type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ env.ARCH }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=sha,suffix=-${{ matrix.variant }}-${{ env.ARCH }} | |
type=sha,suffix=-${{ env.ARCH }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
- name: Build Push | |
id: build_push | |
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' }} | |
env: | |
DEFAULT_VARIANT: slim | |
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: | | |
# Do not push to ghcr.io on PRs due to permission issues, only push if the owner is luigi311 so it doesnt fail on forks | |
ghcr.io/${{ github.repository }},enable=${{ github.event_name != 'pull_request' && github.repository_owner == 'luigi311'}} | |
flavor: latest=false | |
tags: | | |
type=raw,value=latest,enable=${{ matrix.variant == env.DEFAULT_VARIANT && startsWith(github.ref, 'refs/tags/') }} | |
type=raw,value=latest,suffix=-${{ matrix.variant }},enable=${{ startsWith(github.ref, 'refs/tags/') }} | |
type=ref,event=branch,suffix=-${{ matrix.variant }} | |
type=ref,event=branch,enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=ref,event=pr,suffix=-${{ matrix.variant }} | |
type=ref,event=pr,enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=semver,pattern={{ version }},suffix=-${{ matrix.variant }} | |
type=semver,pattern={{ version }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ matrix.variant }} | |
type=semver,pattern={{ major }}.{{ minor }},enable=${{ matrix.variant == env.DEFAULT_VARIANT }} | |
type=sha,suffix=-${{ matrix.variant }} | |
type=sha,enable=${{ matrix.variant == env.DEFAULT_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 |