diff --git a/.dockerignore b/.dockerignore index a563517..937e8f2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,5 +5,6 @@ testresources/ .gitignore .golangci.yml Dockerfile +**/Dockerfile main_test.go README.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 643e20b..a971d91 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,3 +14,15 @@ updates: day: sunday open-pull-requests-limit: 3 rebase-strategy: disabled + - package-ecosystem: docker + directory: /linux + schedule: + interval: monthly + - package-ecosystem: docker + directory: /testresources + schedule: + interval: monthly + - package-ecosystem: docker + directory: /windows + schedule: + interval: monthly diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 0dc5e8d..a2a7f49 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -2,22 +2,25 @@ name: Test & Build multi-arch Docker Image on: push: - branches: [main] + branches: [ main ] pull_request: +env: + IMAGE_REPOSITORY: testcontainers/ryuk + jobs: test: 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: '1.21' + go-version-file: 'go.mod' - run: go version - - name: Check out code into the Go module directory - uses: actions/checkout@v3 - - name: go-mod verify run: go mod verify @@ -32,33 +35,65 @@ jobs: - name: go-test run: go test -v ./... + build-image-linux: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version-file: 'go.mod' + - run: go version + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - 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: Build 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 + + build-image-windows: + strategy: + matrix: + os-version: + - ltsc2019 + - ltsc2022 + runs-on: windows-2022 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v3 + with: + go-version-file: 'go.mod' + - run: go version + + - 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 }} . + build: runs-on: ubuntu-latest - needs: test + needs: + - test + - build-image-linux + - build-image-windows steps: - - uses: actions/checkout@v3 - - uses: actions/setup-go@v5 - with: - go-version: '1.21' - - run: go version - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - 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: Build image - uses: docker/build-push-action@v3 - with: - context: . - file: ./Dockerfile - platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x - push: false - # Use a 'temp' tag, that won't be pushed, for non-release builds - tags: testcontainers/ryuk:${{ github.event.release.tag_name || 'temp' }} + - name: join point for test, linux build, and windows build + run: | + echo "done" diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 4e1adf3..aca6888 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -15,10 +15,10 @@ jobs: name: lint runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: 1.21 - - uses: actions/checkout@v3 + go-version-file: 'go.mod' - name: golangci-lint uses: golangci/golangci-lint-action@3a919529898de77ec3da873e3063ca4b10e7f5cc # v3 with: diff --git a/.github/workflows/publish-docker-image.yml b/.github/workflows/publish-docker-image.yml index 393828a..5668f0c 100644 --- a/.github/workflows/publish-docker-image.yml +++ b/.github/workflows/publish-docker-image.yml @@ -2,57 +2,165 @@ name: Release multi-arch Docker Image on: release: - types: [published] + types: [ published ] + +env: + IMAGE_REPOSITORY: testcontainers/ryuk jobs: - release: + release-linux: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-go@v5 - with: - go-version: '1.21' - - run: go version - - - name: Login to Docker Hub - uses: docker/login-action@v1 - 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 - - - name: Docker info - run: docker info - - name: Buildx inspect - run: docker buildx inspect - - - name: Build and push image - uses: docker/build-push-action@v3 - with: - context: . - file: ./Dockerfile - platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x + - 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 + + - 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 + + - name: Docker info + run: docker info + - name: Buildx inspect + run: docker buildx inspect + + - 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 + # Only push if we are publishing a release + push: true + tags: ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}-linux + + release-windows: + strategy: + matrix: + os-version: + - ltsc2019 + - 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 + + - 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 }} . + + - name: Push image # Only push if we are publishing a release - push: true - tags: testcontainers/ryuk:${{ github.event.release.tag_name }} + run: | + docker push ${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}-windows.amd64.${{ matrix.os-version }} + + release: + needs: + - release-linux + - release-windows + runs-on: ubuntu-latest + steps: + - 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=${{ env.IMAGE_REPOSITORY }}:${{ github.event.release.tag_name }}; + 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"; + 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"; + docker manifest annotate \ + --os-version ${OS_VERSION_ltsc2022} \ + --os windows \ + --arch amd64 \ + ${target_image} "${target_image}-windows.amd64.ltsc2022"; + docker manifest push ${target_image}; diff --git a/Dockerfile b/linux/Dockerfile similarity index 100% rename from Dockerfile rename to linux/Dockerfile diff --git a/testresources/Dockerfile b/testresources/Dockerfile index 52d831a..e175a44 100644 --- a/testresources/Dockerfile +++ b/testresources/Dockerfile @@ -1 +1 @@ -FROM nginx:alpine \ No newline at end of file +FROM nginx:alpine diff --git a/windows/Dockerfile b/windows/Dockerfile new file mode 100644 index 0000000..c77c7de --- /dev/null +++ b/windows/Dockerfile @@ -0,0 +1,27 @@ +ARG BASE_IMAGE +# ----------- +# Build Image +# ----------- +FROM golang:1.21-nanoserver as build + +# Go build env +ENV CGO_ENABLED=0 + +WORKDIR /app + +# Install source deps +COPY go.mod go.sum ./ +RUN go mod download + +# Copy source & build +COPY . . +RUN go build -v -ldflags "-s" -o /bin/ryuk + +# ----------------- +# Distributed Image +# ----------------- +FROM ${BASE_IMAGE} + +COPY --from=build /bin/ryuk /bin/ryuk +CMD ["/bin/ryuk"] +LABEL org.testcontainers.ryuk=true