name: Docker Build and Push on: push: branches: - master - develop jobs: docker-build: runs-on: ubuntu-latest if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop' steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: linux/amd64,linux/arm64 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: platforms: linux/amd64,linux/arm64 - name: Create and use multi-platform builder run: | docker buildx create --name multiarch --use --bootstrap docker buildx inspect multiarch - name: Install Rust uses: dtolnay/rust-toolchain@stable with: targets: x86_64-unknown-linux-musl,aarch64-unknown-linux-musl,wasm32-unknown-unknown - name: Cache cargo tools id: cache-tools uses: actions/cache@v4 with: path: | ~/.cargo/bin ~/.cargo/registry ~/.cargo/git key: ${{ runner.os }}-cargo-tools-v1 restore-keys: | ${{ runner.os }}-cargo-tools- - name: Install cross run: | if ! command -v cross &> /dev/null; then cargo install cross --git https://github.com/cross-rs/cross fi - name: Install trunk run: | if ! command -v trunk &> /dev/null; then RUSTFLAGS="" cargo install trunk --locked fi - name: Install wasm-bindgen-cli run: | if ! command -v wasm-bindgen &> /dev/null; then cargo install wasm-bindgen-cli fi - name: Cache cargo registry and dependencies id: cache-cargo-deps uses: actions/cache@v4 with: path: | ~/.cargo/registry/index ~/.cargo/registry/cache ~/.cargo/git/db target backend/target frontend/target shared/target key: ${{ runner.os }}-cargo-deps-${{ hashFiles('**/Cargo.lock') }}-${{ hashFiles('**/Cargo.toml') }} restore-keys: | ${{ runner.os }}-cargo-deps-${{ hashFiles('**/Cargo.lock') }}- ${{ runner.os }}-cargo-deps- - name: Cache Docker buildx uses: actions/cache@v4 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - name: Cache frontend dist id: cache-frontend uses: actions/cache@v4 with: path: frontend/dist key: ${{ runner.os }}-frontend-${{ hashFiles('frontend/**/*', 'shared/**/*') }}-${{ hashFiles('frontend/Cargo.toml', 'frontend/Trunk.toml') }} restore-keys: | ${{ runner.os }}-frontend- - name: Cache cross-compilation tools uses: actions/cache@v4 with: path: | ~/.cross ~/.rustup/toolchains/*/lib/rustlib/x86_64-unknown-linux-musl ~/.rustup/toolchains/*/lib/rustlib/aarch64-unknown-linux-musl key: ${{ runner.os }}-cross-${{ hashFiles('**/Cargo.lock') }}-v2 restore-keys: | ${{ runner.os }}-cross- - name: Cache built resources id: cache-resources uses: actions/cache@v4 with: path: | resources/*.ts key: ${{ runner.os }}-resources-${{ hashFiles('resources/*.jpg') }}-v1 restore-keys: | ${{ runner.os }}-resources- - name: Install ffmpeg (only if resources not cached) if: steps.cache-resources.outputs.cache-hit != 'true' run: | sudo apt-get update sudo apt-get install -y ffmpeg - name: Extract branch name shell: bash run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT id: extract_branch - name: Create GHCR token file run: | mkdir -p $HOME echo "GHCR_IO_TOKEN=${{ secrets.GHCR_IO_TOKEN }}" > $HOME/.ghcr.io - name: Make build script executable run: chmod +x ./bin/build_docker.sh - name: Build and push Docker images env: FRONTEND_CACHE_HIT: ${{ steps.cache-frontend.outputs.cache-hit }} CARGO_DEPS_CACHE_HIT: ${{ steps.cache-cargo-deps.outputs.cache-hit }} BUILDX_CACHE_FROM: type=local,src=/tmp/.buildx-cache BUILDX_CACHE_TO: type=local,dest=/tmp/.buildx-cache-new,mode=max run: ./bin/build_docker.sh ${{ steps.extract_branch.outputs.branch }} - name: Move buildx cache run: | rm -rf /tmp/.buildx-cache mv /tmp/.buildx-cache-new /tmp/.buildx-cache || true