CI: Build arm64 and merge #325
Workflow file for this run
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 | |
with: | |
persist-credentials: false | |
- 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 $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 | |
with: | |
key: "${{ matrix.os }}" | |
- 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-cli: | |
runs-on: ubuntu-latest | |
container: | |
image: ghcr.io/luigi311/tanoshi-builder:sha-172c475-slim | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- uses: Swatinem/rust-cache@v2 | |
- name: Build tanoshi-cli | |
shell: bash | |
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-web: | |
runs-on: ubuntu-latest | |
container: | |
image: ghcr.io/luigi311/tanoshi-builder:sha-172c475-slim | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- 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-tauri: | |
runs-on: ${{ matrix.os }} | |
needs: | |
- build-web | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-24.04 | |
arch: amd64 | |
type: linux | |
- os: windows-latest | |
arch: amd64 | |
type: windows | |
- os: ubuntu-24.04-arm | |
arch: aarch64 | |
type: linux | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Download dist | |
uses: actions/download-artifact@v4 | |
with: | |
name: tanoshi-web | |
path: crates/tanoshi-web/dist | |
- uses: actions-rust-lang/setup-rust-toolchain@v1 | |
- uses: Swatinem/rust-cache@v2 | |
with: | |
key: "${{ matrix.type }}-${{ matrix.arch }}" | |
- name: Install deps (ubuntu) | |
if: ${{ matrix.type == 'linux' }} | |
run: sudo apt update && sudo apt upgrade -y && sudo apt install -y $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.type == 'windows' }} | |
with: | |
path: "C:/vcpkg/installed" | |
key: vcpkg-${{ matrix.os }}- | |
restore-keys: | | |
vcpkg-${{ matrix.os }}- | |
- name: Install deps (windows) | |
if: ${{ matrix.type == 'windows' }} | |
run: | | |
vcpkg integrate install | |
vcpkg install --only-downloads libarchive:x64-windows-static-md | |
vcpkg install libarchive:x64-windows-static-md | |
- name: Install Binstall | |
uses: cargo-bins/cargo-binstall@main | |
- name: Install tauri-cli | |
run: cargo binstall [email protected] --no-confirm --locked | |
- name: Build tauri | |
shell: bash | |
env: | |
RUSTFLAGS: "-Clink-arg=-Wl,--allow-multiple-definition" | |
run: | | |
cd crates/tanoshi-tauri | |
cargo tauri build | |
- name: Move files (linux/macOS) | |
if: ${{ matrix.type == 'linux' || matrix.type == 'macos' }} | |
run: | | |
mkdir -p builds | |
find target/ -type f \( -name "*.deb" -o -name "*.AppImage" -o -name "*.dmg" \) -print0 | | |
while IFS= read -r -d '' file; do | |
mv "$file" ${{ github.workspace }}/builds/ | |
done | |
mv target/*/tanoshi-app ${{ github.workspace }}/builds/ | |
- name: Move files (windows) | |
if: ${{ matrix.type == 'windows' }} | |
run: | | |
mkdir -p builds | |
mv target/*/bundle/msi/*.msi ${{ github.workspace }}/builds/ | |
mv target/*/tanoshi-app ${{ github.workspace }}/builds/ | |
- name: Upload dist | |
uses: actions/upload-artifact@v4 | |
with: | |
name: tanoshi-app-${{ matrix.type }}-${{ matrix.arch }} | |
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-flatpak: | |
runs-on: ${{ matrix.os }} | |
needs: build-tauri | |
container: | |
image: bilelmoussaoui/flatpak-github-actions:gnome-47 | |
options: --privileged | |
strategy: | |
matrix: | |
include: | |
- arch: x86_64 | |
name: amd64 | |
os: ubuntu-24.04 | |
- arch: aarch64 | |
name: aarch64 | |
os: ubuntu-24.04-arm | |
# Don't fail the whole workflow if one architecture fails | |
fail-fast: false | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Download files | |
uses: actions/download-artifact@v4 | |
with: | |
name: tanoshi-app-linux-${{ matrix.name }} | |
path: target/release/ | |
# Only master contains the upload-artifact option. Waiting on | |
# https://github.com/flatpak/flatpak-github-actions/issues/203 | |
- uses: flatpak/flatpak-github-actions/flatpak-builder@master | |
with: | |
bundle: tanoshi.${{ matrix.arch }}.flatpak | |
manifest-path: org.luigi311.tanoshi.yml | |
cache-key: flatpak-builder-${{ github.sha }} | |
arch: ${{ matrix.arch }} | |
upload-artifact: false | |
- name: Upload dist | |
uses: actions/upload-artifact@v4 | |
with: | |
name: tanoshi.${{ matrix.arch }}.flatpak | |
path: tanoshi.${{ matrix.arch }}.flatpak | |
- 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: tanoshi.${{ matrix.arch }}.flatpak | |
tag: ${{ github.ref }} | |
file_glob: true | |
overwrite: true | |
build-tanoshi: | |
runs-on: ${{ matrix.os }} | |
needs: | |
- build-web | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-24.04 | |
arch: amd64 | |
type: linux | |
- os: ubuntu-24.04-arm | |
arch: aarch64 | |
type: linux | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Download dist | |
uses: actions/download-artifact@v4 | |
with: | |
name: tanoshi-web | |
path: crates/tanoshi-web/dist | |
- uses: actions-rust-lang/setup-rust-toolchain@v1 | |
- uses: Swatinem/rust-cache@v2 | |
with: | |
key: "${{ matrix.type }}-${{ matrix.arch }}" | |
- name: Install deps | |
run: sudo apt update && sudo apt upgrade -y && sudo apt install -y $UBUNTU_DEPS | |
- uses: ilammy/setup-nasm@v1 | |
- name: Install LLVM and Clang | |
uses: KyleMayes/[email protected] | |
with: | |
version: ${{ env.LLVM_VERSION }} | |
- name: Build tanoshi | |
shell: bash | |
env: | |
RUSTFLAGS: "-Clink-arg=-Wl,--allow-multiple-definition" | |
run: cargo build -p tanoshi --release | |
- name: Upload dist | |
uses: actions/upload-artifact@v4 | |
with: | |
name: tanoshi-${{ matrix.arch }} | |
path: ${{ github.workspace }}/target/release/tanoshi | |
docker-amd64: | |
runs-on: ubuntu-24.04 | |
needs: | |
- build-tanoshi | |
env: | |
ARCH: amd64 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Download dist (AMD64) | |
uses: actions/download-artifact@v4 | |
with: | |
name: tanoshi-amd64 | |
path: linux/amd64 | |
- 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=${{ startsWith(github.ref, 'refs/tags/') }},suffix=-${{ env.ARCH }} | |
type=ref,event=branch,suffix=-${{ env.ARCH }} | |
type=ref,event=pr,suffix=-${{ env.ARCH }} | |
type=semver,pattern={{ version }},suffix=-${{ env.ARCH }} | |
type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ env.ARCH }} | |
type=sha,suffix=-${{ env.ARCH }} | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Build | |
id: build | |
if: "${{ steps.docker_meta.outputs.tags == '' }}" | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
file: Dockerfile.CI | |
platforms: linux/amd64 | |
push: false | |
tags: tanoshi:action | |
- name: Build Push | |
id: build_push | |
if: "${{ steps.docker_meta.outputs.tags != '' }}" | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
file: Dockerfile.CI | |
platforms: linux/amd64 | |
push: true | |
tags: ${{ steps.docker_meta.outputs.tags }} | |
labels: ${{ steps.docker_meta.outputs.labels }} | |
# Echo digest so users can validate their image | |
- name: Image digest | |
if: "${{ steps.docker_meta.outcome == 'success' }}" | |
env: | |
DIGEST: ${{ steps.build_push.outputs.digest }} | |
run: echo "$DIGEST" | |
docker-aarch64: | |
runs-on: ubuntu-24.04-arm | |
needs: | |
- build-tanoshi | |
env: | |
ARCH: aarch64 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Download dist (AARCH64) | |
uses: actions/download-artifact@v4 | |
with: | |
name: tanoshi-aarch64 | |
path: linux/arm64 | |
- 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=${{ startsWith(github.ref, 'refs/tags/') }},suffix=-${{ env.ARCH }} | |
type=ref,event=branch,suffix=-${{ env.ARCH }} | |
type=ref,event=pr,suffix=-${{ env.ARCH }} | |
type=semver,pattern={{ version }},suffix=-${{ env.ARCH }} | |
type=semver,pattern={{ major }}.{{ minor }},suffix=-${{ env.ARCH }} | |
type=sha,suffix=-${{ env.ARCH }} | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Build | |
id: build | |
if: "${{ steps.docker_meta.outputs.tags == '' }}" | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
file: Dockerfile.CI | |
platforms: linux/arm64 | |
push: false | |
tags: tanoshi:action | |
- name: Build Push | |
id: build_push | |
if: "${{ steps.docker_meta.outputs.tags != '' }}" | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
file: Dockerfile.CI | |
platforms: linux/arm64 | |
push: true | |
tags: ${{ steps.docker_meta.outputs.tags }} | |
labels: ${{ steps.docker_meta.outputs.labels }} | |
# Echo digest so users can validate their image | |
- name: Image digest | |
if: "${{ steps.docker_meta.outcome == 'success' }}" | |
env: | |
DIGEST: ${{ steps.build_push.outputs.digest }} | |
run: echo "$DIGEST" | |
docker-merge: | |
runs-on: ubuntu-latest | |
needs: | |
- docker-amd64 | |
- docker-aarch64 | |
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=${{ startsWith(github.ref, 'refs/tags/') }} | |
type=ref,event=branch | |
type=ref,event=pr | |
type=semver,pattern={{ version }} | |
type=semver,pattern={{ major }}.{{ minor }} | |
type=sha | |
- 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 |