Skip to content

Commit

Permalink
Publish preview images, add checks for the multi-arch image variants (#…
Browse files Browse the repository at this point in the history
…120)

* chore

* Publish preview images in the build workflow

* Check the multi-arch image for completeness

* Build images only when running on the default branch

* Make the "build" job require only the "test-*" jobs

* Make the "build" job require only the "test-*" jobs

* RELEASE -> RELEASING :)

* be more lax checking arch/os versions
  • Loading branch information
gesellix authored May 23, 2024
1 parent c612bb6 commit 8f3a6fb
Show file tree
Hide file tree
Showing 4 changed files with 227 additions and 73 deletions.
194 changes: 174 additions & 20 deletions .github/workflows/build-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,11 @@ env:
IMAGE_REPOSITORY: testcontainers/ryuk

jobs:
test:
test-linux:
runs-on: ubuntu-latest
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- run: go version
Expand All @@ -35,15 +32,57 @@ jobs:
- name: go-test
run: go test -v ./...

test-windows:
runs-on: windows-2022
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- run: go version

- name: go-mod verify
run: go mod verify

- name: go-mod tidy
run: go mod tidy

- name: go-build
env:
GOOS: windows
run: go build

# TODO enable tests on Windows
# Currently doesn't succeed, see https://github.com/testcontainers/testcontainers-go/issues/948
# - name: go-test
# run: go test -v ./...

build-image-linux:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- run: go version

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.IMAGE_REPOSITORY }}
tags: |
type=sha,format=long
flavor: |
suffix=-linux
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
Expand All @@ -55,15 +94,15 @@ jobs:
- name: Buildx inspect
run: docker buildx inspect

- name: Build image
- name: Build and push image
uses: docker/build-push-action@v3
with:
context: .
file: linux/Dockerfile
platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v6
push: false
# Use a 'temp' tag, that won't be pushed for non-release builds
tags: ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name || 'temp' }}-linux
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

build-image-windows:
strategy:
Expand All @@ -72,28 +111,143 @@ jobs:
- ltsc2019
- ltsc2022
runs-on: windows-2022
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v3

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
go-version-file: 'go.mod'
- run: go version
images: ${{ env.IMAGE_REPOSITORY }}
tags: |
type=sha,format=long
flavor: |
suffix=-windows.${{ matrix.os-version }}
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Docker info
run: docker info

- name: Build image
# Use a 'temp' tag, that won't be pushed for non-release builds
run: |
docker build -f windows/Dockerfile --build-arg BASE_IMAGE=mcr.microsoft.com/windows/nanoserver:${{ matrix.os-version }} -t ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name || 'temp' }}-windows.amd64.${{ matrix.os-version }} .
docker build -f windows/Dockerfile --build-arg BASE_IMAGE=mcr.microsoft.com/windows/nanoserver:${{ matrix.os-version }} -t ${{ steps.meta.outputs.tags }} .
build:
runs-on: ubuntu-latest
- name: Push image
run: |
docker push ${{ steps.meta.outputs.tags }}
publish-multi-arch-image:
needs:
- test
- test-linux
- test-windows
- build-image-linux
- build-image-windows
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.IMAGE_REPOSITORY }}
tags: |
type=sha,format=long
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2

- name: Docker info
run: docker info
- name: Buildx inspect
run: docker buildx inspect

- name: Get os version for nanoserver:ltsc2019
run: >-
full_version=$(docker manifest inspect mcr.microsoft.com/windows/nanoserver:ltsc2019 | jq -r '.manifests[]|.platform|."os.version"'| sed 's@.*:@@') || true;
echo "OS_VERSION_ltsc2019=${full_version}" >> $GITHUB_ENV;
- name: Get os version for nanoserver:ltsc2022
run: >-
full_version=$(docker manifest inspect mcr.microsoft.com/windows/nanoserver:ltsc2022 | jq -r '.manifests[]|.platform|."os.version"'| sed 's@.*:@@') || true;
echo "OS_VERSION_ltsc2022=${full_version}" >> $GITHUB_ENV;
- name: Docker Manifest
run: >-
target_image=${{ steps.meta.outputs.tags }};
linux_manifest=$(docker manifest inspect ${target_image}-linux);
linux_digests=$(docker manifest inspect ${target_image}-linux | jq -r '.manifests[].digest');
manifest_list=${linux_digests//sha256:/${target_image%%:*}@sha256:};
manifest_list+=" ${target_image}-windows.ltsc2019";
manifest_list+=" ${target_image}-windows.ltsc2022";
docker manifest create ${target_image} ${manifest_list};
docker manifest annotate \
--os-version ${OS_VERSION_ltsc2019} \
--os windows \
--arch amd64 \
${target_image} "${target_image}-windows.ltsc2019";
docker manifest annotate \
--os-version ${OS_VERSION_ltsc2022} \
--os windows \
--arch amd64 \
${target_image} "${target_image}-windows.ltsc2022";
docker manifest push ${target_image};
check-published-image:
runs-on: ubuntu-latest
needs:
- publish-multi-arch-image
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.IMAGE_REPOSITORY }}
tags: |
type=sha,format=long
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Print multi-arch manifest
run: |
docker manifest inspect --verbose ${{ steps.meta.outputs.tags }} > manifest_complete.json
cat manifest_complete.json | jq ".[].Descriptor.platform" | jq "(.architecture + \"_\" + .os + \"_\") + .\"os.version\"" | sort | uniq > architectures_actual.txt
- name: Check multi-arch manifest
run: |
cat supported-architectures.txt | sort | uniq > architectures_expected.txt
# we're counting the entries only, because windows os.version numbers change too frequently
diff $(cat architectures_expected.txt | wc -l) $(cat architectures_actual.txt | wc -l)
build:
runs-on: ubuntu-latest
needs:
- test-linux
- test-windows
steps:
- name: join point for test, linux build, and windows build
- name: Finish
run: |
echo "done"
echo "All tests passed"
85 changes: 32 additions & 53 deletions .github/workflows/publish-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,38 +11,16 @@ jobs:
release-linux:
runs-on: ubuntu-latest
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
- run: go version
- uses: actions/checkout@v4

- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: go-mod verify
run: go mod verify

- name: go-mod tidy
run: go mod tidy

- name: go-build
env:
GOOS: linux
run: go build

- name: go-test
run: go test -v ./...

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
Expand All @@ -58,7 +36,6 @@ jobs:
context: .
file: linux/Dockerfile
platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v6
# Only push if we are publishing a release
push: true
tags: ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}-linux

Expand All @@ -70,46 +47,24 @@ jobs:
- ltsc2022
runs-on: windows-2022
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v3
with:
go-version-file: 'go.mod'
- run: go version
- uses: actions/checkout@v4

- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: go-mod verify
run: go mod verify

- name: go-mod tidy
run: go mod tidy

- name: go-build
env:
GOOS: windows
run: go build

#- name: go-test
# run: go test -v ./...

- name: Docker info
run: docker info

- name: Build image
run: |
docker build -f windows/Dockerfile --build-arg BASE_IMAGE=mcr.microsoft.com/windows/nanoserver:${{ matrix.os-version }} -t ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}-windows.amd64.${{ matrix.os-version }} .
docker build -f windows/Dockerfile --build-arg BASE_IMAGE=mcr.microsoft.com/windows/nanoserver:${{ matrix.os-version }} -t ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}-windows.${{ matrix.os-version }} .
- name: Push image
# Only push if we are publishing a release
run: |
docker push ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}-windows.amd64.${{ matrix.os-version }}
docker push ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}-windows.${{ matrix.os-version }}
release:
needs:
Expand Down Expand Up @@ -150,17 +105,41 @@ jobs:
linux_manifest=$(docker manifest inspect ${target_image}-linux);
linux_digests=$(docker manifest inspect ${target_image}-linux | jq -r '.manifests[].digest');
manifest_list=${linux_digests//sha256:/${target_image%%:*}@sha256:};
manifest_list+=" ${target_image}-windows.amd64.ltsc2019";
manifest_list+=" ${target_image}-windows.amd64.ltsc2022";
manifest_list+=" ${target_image}-windows.ltsc2019";
manifest_list+=" ${target_image}-windows.ltsc2022";
docker manifest create ${target_image} ${manifest_list};
docker manifest annotate \
--os-version ${OS_VERSION_ltsc2019} \
--os windows \
--arch amd64 \
${target_image} "${target_image}-windows.amd64.ltsc2019";
${target_image} "${target_image}-windows.ltsc2019";
docker manifest annotate \
--os-version ${OS_VERSION_ltsc2022} \
--os windows \
--arch amd64 \
${target_image} "${target_image}-windows.amd64.ltsc2022";
${target_image} "${target_image}-windows.ltsc2022";
docker manifest push ${target_image};
check-release:
runs-on: ubuntu-latest
needs:
- publish-multi-arch-image
steps:
- uses: actions/checkout@v4

- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Print multi-arch manifest
run: |
docker manifest inspect --verbose ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }} > manifest_complete.json
cat manifest_complete.json | jq ".[].Descriptor.platform" | jq "(.architecture + \"_\" + .os + \"_\") + .\"os.version\"" | sort | uniq > architectures_actual.txt
- name: Check multi-arch manifest
run: |
cat supported-architectures.txt | sort | uniq > architectures_expected.txt
# we're counting the entries only, because windows os.version numbers change too frequently
diff $(cat architectures_expected.txt | wc -l) $(cat architectures_actual.txt | wc -l)
Loading

0 comments on commit 8f3a6fb

Please sign in to comment.