diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 2457f3044..f05d3d09e 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -9,10 +9,72 @@ on: - master jobs: - push_to_registry: + build_image_pr_test: + # Only runs build on PRs. + # Only does linux/amd64 build do to speed. Once Github adds more ARM runners, we can add more platforms. + + name: Build Image Test For PR + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + strategy: + fail-fast: true + matrix: + platform: [linux/amd64] # Add linux/arm64 when more runners are available. + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Login to Docker Registry + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_EMAIL }} + password: ${{ secrets.DOCKER_HUB_PASSWORD }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # Caches dependencies separately for each platform. + - name: Cache Docker Dependencies + uses: actions/cache@v3 + with: + path: | + root/.ivy2 + root/.sbt + key: sbt-${{ runner.os }}-${{matrix.platform}}-${{ hashFiles('**/build.sbt', '**/project/*.sbt') }} + restore-keys: | + sbt-${{ runner.os }}-${{matrix.platform}} + + # Injects the cache into the Docker build. Path is based on cache path in Dockerfile. + - name: Inject sbt cache into Docker + uses: reproducible-containers/buildkit-cache-dance@v3.1.0 + with: + cache-map: | + { + "root/.ivy2": "/root/.ivy2", + "root/.sbt": "/root/.sbt" + } + skip-extraction: ${{ steps.cache.outputs.cache-hit }} + + - name: Build Docker Image + uses: docker/build-push-action@v6 + with: + context: . + platforms: ${{ matrix.platform }} + cache-from: type=gha + cache-to: type=gha,mode=max + push: false # Doesn't push to dockerhub on PRs. + tags: teamfemrdev/teamfemr:latest + + build_and_push_image: name: Push Docker Image to Docker Hub - if: github.event_name == 'push' runs-on: ubuntu-latest + if: github.event_name == 'push' + strategy: + fail-fast: true + matrix: + platform: [linux/amd64, linux/arm64] + steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -26,16 +88,18 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + # Caches dependencies separately for each platform. - name: Cache Docker Dependencies uses: actions/cache@v3 with: path: | root/.ivy2 root/.sbt - key: sbt-${{ runner.os }}-${{ hashFiles('**/build.sbt', '**/project/*.sbt') }} + key: sbt-${{ runner.os }}-${{matrix.platform}}-${{ hashFiles('**/build.sbt', '**/project/*.sbt') }} restore-keys: | - sbt-${{ runner.os }}- + sbt-${{ runner.os }}-${{matrix.platform}} + # Injects the cache into the Docker build. Path is based on cache path in Dockerfile. - name: Inject sbt cache into Docker uses: reproducible-containers/buildkit-cache-dance@v3.1.0 with: @@ -50,7 +114,8 @@ jobs: uses: docker/build-push-action@v6 with: context: . + platforms: ${{ matrix.platform }} cache-from: type=gha cache-to: type=gha,mode=max - push: ${{ github.event_name != 'pull_request' }} + push: true tags: teamfemrdev/teamfemr:latest