diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7d973d664e..4f1e43456c 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -2,7 +2,7 @@ name: Docker image on: push: - branches: [ master ] + branches: [ master, feat/multiple-docker-platforms ] release: types: [ prereleased, released ] @@ -12,36 +12,113 @@ jobs: steps: - uses: actions/checkout@v3 - uses: gradle/wrapper-validation-action@v1 - test: - needs: [ validate_gradle_wrapper ] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 11 - uses: actions/setup-java@v3 - with: - java-version: '11' - distribution: 'temurin' - - name: Cache Gradle packages - uses: actions/cache@v3 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - restore-keys: ${{ runner.os }}-gradle - - name: Run Java tests - uses: gradle/gradle-build-action@v2 - with: - arguments: testAggregateTestReport - - name: Persist aggregated test reports on failure - if: ${{ failure() }} - uses: actions/upload-artifact@v3 - with: - name: Test report - Java - path: build/reports/tests/unit-test/aggregated-results/ +# test: +# needs: [ validate_gradle_wrapper ] +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 +# - name: Set up JDK 11 +# uses: actions/setup-java@v3 +# with: +# java-version: '11' +# distribution: 'temurin' +# - name: Cache Gradle packages +# uses: actions/cache@v3 +# with: +# path: ~/.gradle/caches +# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} +# restore-keys: ${{ runner.os }}-gradle +# - name: Run Java tests +# uses: gradle/gradle-build-action@v2 +# with: +# arguments: testAggregateTestReport +# - name: Persist aggregated test reports on failure +# if: ${{ failure() }} +# uses: actions/upload-artifact@v3 +# with: +# name: Test report - Java +# path: build/reports/tests/unit-test/aggregated-results/ - build_push: - needs: test - name: Build and push Docker image +# build_test: +# needs: test +# name: Build and test Docker +# runs-on: ubuntu-latest +# strategy: +# matrix: +# platform: [amd64 , arm64] +# steps: +# - uses: actions/checkout@v3 +# with: +# fetch-depth: 0 # need full clone so `./gradlew currentVersion` can search parents for older tags when needed +# - name: Set up JDK 11 +# uses: actions/setup-java@v3 +# with: +# java-version: '11' +# distribution: 'temurin' +# - name: Cache Gradle packages +# uses: actions/cache@v3 +# with: +# path: ~/.gradle/caches +# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} +# restore-keys: ${{ runner.os }}-gradle +# - name: Set up Docker Buildx +# uses: docker/setup-buildx-action@v2 +# - name: Login to GitHub Container Registry +# uses: docker/login-action@v1 +# with: +# registry: ghcr.io +# username: ${{ github.repository_owner }} +# password: ${{ secrets.GITHUB_TOKEN }} +# - name: Initialize Gradle +# run: | +# # The first time gradlew is invoked it downloads gradle and outputs progress about that to STDOUT. +# # This "dummy" invokation gets that out of the way so future gradlew commands have clean output +# ./gradlew --version +# - name: Prepare version metadata +# id: prep +# run: | +# # ghcr.io path should match current repo but be all lowercase +# DOCKER_IMAGE=ghcr.io/${GITHUB_REPOSITORY,,} +# echo "Set DOCKER_IMAGE=${DOCKER_IMAGE}" +# +# # delegate to axion-release-plugin to generate version string from Git repository state +# echo "Detecting version with ./gradlew currentVersion" +# AXION_VERSION="$(./gradlew currentVersion -q -Prelease.quiet)" +# echo "Set AXION_VERSION=${AXION_VERSION}" +# +# # determine docker tags +# if [[ "${GITHUB_EVENT_NAME}" == "release" ]]; then +# # tag releases with version determined by axion-release-plugin +# DOCKER_TAGS="${DOCKER_IMAGE}:${AXION_VERSION}" +# else +# # tag pushes to master as "latest" +# DOCKER_TAGS="${DOCKER_IMAGE}:latest" +# fi +# echo "Set DOCKER_TAGS=${DOCKER_TAGS}" +# +# echo ::set-output name=version::${AXION_VERSION} +# echo ::set-output name=tags::${DOCKER_TAGS} +# echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ') +# +# - name: Build Docker container image +# uses: docker/build-push-action@v3 +# with: +# context: . +# file: ./Dockerfile +# build-args: | +# VERSION_TAG=${{ steps.prep.outputs.version }} +# load: true +# platforms: linux/amd64, linux/arm64 +# tags: ${{ steps.prep.outputs.tags }} +# labels: | +# org.opencontainers.image.source=https://github.com/${GITHUB_REPOSITORY,,}.git +# org.opencontainers.image.created=${{ steps.prep.outputs.created }} +# org.opencontainers.image.revision=${{ github.sha }} +# org.opencontainers.image.version=${{ steps.prep.outputs.version }} +# - name: Test Docker container image +# run: docker run --rm ${{ steps.prep.outputs.tags }} --help + push_multiplatform: + name: Build/Push multi-platform image runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -96,10 +173,6 @@ jobs: echo ::set-output name=version::${AXION_VERSION} echo ::set-output name=tags::${DOCKER_TAGS} echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ') - - # Build and push steps are split up in order to test the built contaire image in between - # - build-args and labels inputs _must_ be kept matching between both to prevent rebuild - # - See: https://github.com/docker/build-push-action/blob/master/docs/advanced/test-before-push.md - name: Build Docker container image uses: docker/build-push-action@v3 with: @@ -107,15 +180,14 @@ jobs: file: ./Dockerfile build-args: | VERSION_TAG=${{ steps.prep.outputs.version }} - load: true - tags: ${{ steps.prep.outputs.tags }} + load: false + platforms: linux/amd64, linux/arm64 + tags: ${{ steps.prep.outputs.tags }}-test-multiplat labels: | org.opencontainers.image.source=https://github.com/${GITHUB_REPOSITORY,,}.git org.opencontainers.image.created=${{ steps.prep.outputs.created }} org.opencontainers.image.revision=${{ github.sha }} org.opencontainers.image.version=${{ steps.prep.outputs.version }} - - name: Test Docker container image - run: docker run --rm ${{ steps.prep.outputs.tags }} --help - name: Push Docker container image uses: docker/build-push-action@v3 with: @@ -124,7 +196,8 @@ jobs: build-args: | VERSION_TAG=${{ steps.prep.outputs.version }} push: true - tags: ${{ steps.prep.outputs.tags }} + platforms: linux/amd64,linux/arm64 + tags: ${{ steps.prep.outputs.tags }}-test-multiplat labels: | org.opencontainers.image.source=https://github.com/${GITHUB_REPOSITORY,,}.git org.opencontainers.image.created=${{ steps.prep.outputs.created }} diff --git a/Dockerfile b/Dockerfile index 90fa33d8ee..442d032e52 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ -FROM gradle:7-jdk11-alpine AS build +# FROM --platform=$BUILDPLATFORM gradle:7-jdk11-alpine AS build + +FROM --platform=$BUILDPLATFORM eclipse-temurin:11 AS build COPY --chown=gradle:gradle . /build WORKDIR /build @@ -9,7 +11,7 @@ RUN ./gradlew shadowJar \ -Prelease.forceVersion="${VERSION_TAG%-SNAPSHOT}" -FROM openjdk:11-slim +FROM --platform=$BUILDPLATFORM openjdk:11-slim COPY --from=build /build/cli/build/libs/gtfs-validator-*-cli.jar /gtfs-validator-cli.jar WORKDIR / diff --git a/Dockerfile_arm64v8 b/Dockerfile_arm64v8 new file mode 100644 index 0000000000..05d175fc6e --- /dev/null +++ b/Dockerfile_arm64v8 @@ -0,0 +1,18 @@ +FROM arm64v8/gradle:7-jdk11 AS build + +COPY --chown=gradle:gradle . /build +WORKDIR /build + +ARG VERSION_TAG +RUN ./gradlew shadowJar \ + --no-daemon \ + -Prelease.forceVersion="${VERSION_TAG%-SNAPSHOT}" + + +FROM openjdk:11-slim +COPY --from=build /build/cli/build/libs/gtfs-validator-*-cli.jar /gtfs-validator-cli.jar +WORKDIR / + +ARG VERSION_TAG +ENV VERSION_TAG=$VERSION_TAG +ENTRYPOINT [ "java", "-jar", "gtfs-validator-cli.jar" ]