From 69dc4e2b838347c4eff73e06653c76f5118afead Mon Sep 17 00:00:00 2001 From: Alexey Pustovalov Date: Tue, 7 Mar 2023 16:56:16 +0900 Subject: [PATCH] Zabbix 6.4 release --- .github/workflows/images_build.yml | 100 ++--- .github/workflows/images_build_rhel.yml | 9 +- .github/workflows/images_build_windows.yml | 22 +- .github/workflows/nightly_build.yml | 334 +++++++++++++++++ .github/workflows/nightly_build_windows.yml | 385 ++++++++++++++++++++ 5 files changed, 796 insertions(+), 54 deletions(-) create mode 100644 .github/workflows/nightly_build.yml create mode 100644 .github/workflows/nightly_build_windows.yml diff --git a/.github/workflows/images_build.yml b/.github/workflows/images_build.yml index c300bc07a..e6a6ee816 100644 --- a/.github/workflows/images_build.yml +++ b/.github/workflows/images_build.yml @@ -10,6 +10,7 @@ on: - '5.0' - '6.0' - '6.2' + - '6.4' - 'trunk' paths: - 'Dockerfiles/**' @@ -39,7 +40,7 @@ jobs: is_default_branch: ${{ steps.branch_info.outputs.is_default_branch }} steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v2.3.4 with: fetch-depth: 1 @@ -56,28 +57,28 @@ jobs: run: | os_list=$(jq -r '.["os-linux"] | keys | [ .[] | tostring ] | @json' "./build.json") - echo "list=$os_list" >> $GITHUB_OUTPUT + echo "::set-output name=list::$os_list" - name: Prepare Platform list id: platform_list run: | platform_list=$(jq -r '.["os-linux"] | tostring | @json' "./build.json") - echo "list=$platform_list" >> $GITHUB_OUTPUT + echo "::set-output name=list::$platform_list" - name: Prepare Database engine list id: database run: | database_list=$(jq -r '[.components | values[] ] | sort | unique | del(.. | select ( . == "" ) ) | [ .[] | tostring ] | @json' "./build.json") - echo "list=$database_list" >> $GITHUB_OUTPUT + echo "::set-output name=list::$database_list" - name: Prepare Zabbix component list id: components run: | component_list=$(jq -r '.components | keys | [ .[] | tostring ] | @json' "./build.json") - echo "list=$component_list" >> $GITHUB_OUTPUT + echo "::set-output name=list::$component_list" - name: Get branch info id: branch_info @@ -94,7 +95,7 @@ jobs: if [[ "$github_ref" == "${{ env.LATEST_BRANCH }}" ]]; then result=true fi - echo "is_default_branch=$result" >> $GITHUB_OUTPUT + echo "::set-output name=is_default_branch::$result" build_base: timeout-minutes: 30 @@ -108,23 +109,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v2.3.4 with: fetch-depth: 1 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v1.2.0 with: image: tonistiigi/binfmt:latest platforms: all - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v1.6.0 with: driver-opts: image=moby/buildkit:master - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -135,22 +136,25 @@ jobs: platform_list=$(jq -r '.["os-linux"].${{ matrix.os }} | join(",")' "./build.json") platform_list="${platform_list%,}" - echo "list=$platform_list" >> $GITHUB_OUTPUT + echo ::set-output name=list::$platform_list - name: Generate tags id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v3 with: images: ${{ env.DOCKER_REPOSITORY }}/zabbix-${{ env.BASE_BUILD_NAME }} tags: | - type=ref,event=branch,prefix=${{ matrix.os }}- - type=ref,event=branch,suffix=-${{ matrix.os }} + type=semver,pattern={{version}},prefix=${{ matrix.os }}- + type=semver,pattern={{version}},suffix=-${{ matrix.os }} + type=ref,event=branch,prefix=${{ matrix.os }}-,suffix=-latest + type=ref,event=branch,suffix=-${{ matrix.os }}-latest + type=raw,enable=${{ needs.init_build.outputs.is_default_branch == 'true' }},value=${{matrix.os}}-latest flavor: | - latest=false + latest=${{ (matrix.os == 'alpine') && ( needs.init_build.outputs.is_default_branch == 'true' ) }} - name: Build ${{ env.BASE_BUILD_NAME }}/${{ matrix.os }} and push id: docker_build - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v2 with: context: ./Dockerfiles/${{ env.BASE_BUILD_NAME }}/${{ matrix.os }} file: ./Dockerfiles/${{ env.BASE_BUILD_NAME }}/${{ matrix.os }}/Dockerfile @@ -167,7 +171,7 @@ jobs: echo "${{ steps.docker_build.outputs.digest }}" > ${{ env.BASE_BUILD_NAME }}_${{ matrix.os }} - name: Upload SHA256 tag - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v2.2.4 with: name: ${{ env.BASE_BUILD_NAME }}_${{ matrix.os }} path: ${{ env.BASE_BUILD_NAME }}_${{ matrix.os }} @@ -186,21 +190,21 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v2.3.4 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v1.2.0 with: image: tonistiigi/binfmt:latest platforms: all - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v1.6.0 with: driver-opts: image=moby/buildkit:master - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -211,21 +215,24 @@ jobs: platform_list=$(jq -r '.["os-linux"].${{ matrix.os }} | join(",")' "./build.json") platform_list="${platform_list%,}" - echo "list=$platform_list" >> $GITHUB_OUTPUT + echo ::set-output name=list::$platform_list - name: Generate tags id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v3 with: images: ${{ env.DOCKER_REPOSITORY }}/zabbix-${{ matrix.build }} tags: | - type=ref,event=branch,prefix=${{ matrix.os }}- - type=ref,event=branch,suffix=-${{ matrix.os }} + type=semver,pattern={{version}},prefix=${{ matrix.os }}- + type=semver,pattern={{version}},suffix=-${{ matrix.os }} + type=ref,event=branch,prefix=${{ matrix.os }}-,suffix=-latest + type=ref,event=branch,suffix=-${{ matrix.os }}-latest + type=raw,enable=${{ needs.init_build.outputs.is_default_branch == 'true' }},value=${{matrix.os}}-latest flavor: | - latest=false + latest=${{ (matrix.os == 'alpine') && ( needs.init_build.outputs.is_default_branch == 'true' ) }} - name: Download SHA256 tag build-base:${{ matrix.os }} - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v2.0.10 with: name: build-base_${{ matrix.os }} @@ -235,12 +242,12 @@ jobs: BASE_TAG=$(cat build-base_${{ matrix.os }}) BUILD_BASE_IMAGE=${{ env.DOCKER_REPOSITORY }}/zabbix-build-base@${BASE_TAG} - echo "base_tag=${BASE_TAG}" >> $GITHUB_OUTPUT - echo "base_build_image=${BUILD_BASE_IMAGE}" >> $GITHUB_OUTPUT + echo ::set-output name=base_tag::${BASE_TAG} + echo ::set-output name=base_build_image::${BUILD_BASE_IMAGE} - name: Build ${{ matrix.build }}/${{ matrix.os }} and push id: docker_build - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v2 with: context: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }} file: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }}/Dockerfile @@ -258,7 +265,7 @@ jobs: echo "${{ steps.docker_build.outputs.digest }}" > ${{ matrix.build }}_${{ matrix.os }} - name: Upload SHA256 tag - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v2.2.4 with: name: ${{ matrix.build }}_${{ matrix.os }} path: ${{ matrix.build }}_${{ matrix.os }} @@ -276,21 +283,21 @@ jobs: runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v2.3.4 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v1.2.0 with: image: tonistiigi/binfmt:latest platforms: all - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v1.6.0 with: driver-opts: image=moby/buildkit:master - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -320,28 +327,31 @@ jobs: platform_list="${platform_list%,}" - echo "list=$platform_list" >> $GITHUB_OUTPUT + echo ::set-output name=list::$platform_list - name: Detect Build Base Image id: build_base_image run: | BUILD_BASE=$(jq -r '.components."${{ matrix.build }}"' "./build.json") - echo "build_base=${BUILD_BASE}" >> $GITHUB_OUTPUT + echo ::set-output name=build_base::${BUILD_BASE} - name: Generate tags id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v3 with: images: ${{ env.DOCKER_REPOSITORY }}/zabbix-${{ matrix.build }} tags: | - type=ref,event=branch,prefix=${{ matrix.os }}- - type=ref,event=branch,suffix=-${{ matrix.os }} + type=semver,pattern={{version}},prefix=${{ matrix.os }}- + type=semver,pattern={{version}},suffix=-${{ matrix.os }} + type=ref,event=branch,prefix=${{ matrix.os }}-,suffix=-latest + type=ref,event=branch,suffix=-${{ matrix.os }}-latest + type=raw,enable=${{ needs.init_build.outputs.is_default_branch == 'true' }},value=${{matrix.os}}-latest flavor: | - latest=false + latest=${{ (matrix.os == 'alpine') && ( needs.init_build.outputs.is_default_branch == 'true' ) }} - name: Download SHA256 tag for ${{ steps.build_base_image.outputs.build_base }}:${{ matrix.os }} - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v2.0.10 if: ${{ matrix.build != 'snmptraps' }} with: name: ${{ steps.build_base_image.outputs.build_base }}_${{ matrix.os }} @@ -353,12 +363,12 @@ jobs: BASE_TAG=$(cat ${{ steps.build_base_image.outputs.build_base }}_${{ matrix.os }}) BUILD_BASE_IMAGE=${{ env.DOCKER_REPOSITORY }}/zabbix-${{ steps.build_base_image.outputs.build_base }}@${BASE_TAG} - echo "base_tag=${BASE_TAG}" >> $GITHUB_OUTPUT - echo "base_build_image=${BUILD_BASE_IMAGE}" >> $GITHUB_OUTPUT + echo ::set-output name=base_tag::${BASE_TAG} + echo ::set-output name=base_build_image::${BUILD_BASE_IMAGE} - name: Build ${{ matrix.build }}/${{ matrix.os }} and push id: docker_build - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v2 with: context: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }} file: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }}/Dockerfile diff --git a/.github/workflows/images_build_rhel.yml b/.github/workflows/images_build_rhel.yml index 658a4f3fe..7416967a0 100644 --- a/.github/workflows/images_build_rhel.yml +++ b/.github/workflows/images_build_rhel.yml @@ -9,7 +9,7 @@ on: - '5.0' - '6.0' - '6.2' - - 'trunk' + - '6.4' paths: - 'Dockerfiles/*/rhel/*' - '.github/workflows/images_build_rhel.yml' @@ -25,7 +25,6 @@ env: REGISTRY_NAMESPACE: "redhat-isv-containers" PFLT_LOGLEVEL: "warn" PFLT_ARTIFACTS: "/tmp/artifacts" - TRUNK_BRANCH: "6.4" jobs: init_build: @@ -54,8 +53,12 @@ jobs: github_ref=${github_ref##*/} + if [[ "$github_ref" == "${{ env.LATEST_BRANCH }}" ]]; then + result=true + fi + echo "is_default_branch=$result" >> $GITHUB_OUTPUT - echo "current_branch=${{ env.TRUNK_BRANCH }}" >> $GITHUB_OUTPUT + echo "current_branch=$github_ref" >> $GITHUB_OUTPUT echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT diff --git a/.github/workflows/images_build_windows.yml b/.github/workflows/images_build_windows.yml index 94e3b9742..c3be2e533 100644 --- a/.github/workflows/images_build_windows.yml +++ b/.github/workflows/images_build_windows.yml @@ -10,6 +10,7 @@ on: - '5.0' - '6.0' - '6.2' + - '6.4' - 'trunk' paths: - 'Dockerfiles/*/windows/*' @@ -121,8 +122,11 @@ jobs: with: images: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ env.BASE_BUILD_NAME }} tags: | - type=ref,event=branch,prefix=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}- - type=ref,event=branch,suffix=-${{ steps.base_os_tag.outputs.os_tag }},prefix=${{ matrix.component }}- + type=semver,pattern={{version}},prefix=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}- + type=semver,pattern={{version}},suffix=-${{ steps.base_os_tag.outputs.os_tag }},prefix=${{ matrix.component }}- + type=ref,event=branch,prefix=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}-,suffix=-latest + type=ref,event=branch,suffix=-${{ steps.base_os_tag.outputs.os_tag }}-latest,prefix=${{ matrix.component }}- + type=raw,enable=${{ needs.init_build.outputs.is_default_branch == 'true' }},value=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}-latest flavor: | latest=false @@ -214,8 +218,11 @@ jobs: with: images: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ env.COMPONENT_BASE_BUILD_NAME }} tags: | - type=ref,event=branch,prefix=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}- - type=ref,event=branch,suffix=-${{ steps.base_os_tag.outputs.os_tag }},prefix=${{ matrix.component }}- + type=semver,pattern={{version}},prefix=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}- + type=semver,pattern={{version}},suffix=-${{ steps.base_os_tag.outputs.os_tag }},prefix=${{ matrix.component }}- + type=ref,event=branch,prefix=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}-,suffix=-latest + type=ref,event=branch,suffix=-${{ steps.base_os_tag.outputs.os_tag }}-latest,prefix=${{ matrix.component }}- + type=raw,enable=${{ needs.init_build.outputs.is_default_branch == 'true' }},value=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}-latest flavor: | latest=false @@ -319,8 +326,11 @@ jobs: with: images: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ matrix.component }} tags: | - type=ref,event=branch,prefix=${{ steps.base_os_tag.outputs.os_tag }}- - type=ref,event=branch,suffix=-${{ steps.base_os_tag.outputs.os_tag }} + type=semver,pattern={{version}},prefix=${{ steps.base_os_tag.outputs.os_tag }}- + type=semver,pattern={{version}},suffix=-${{ steps.base_os_tag.outputs.os_tag }} + type=ref,event=branch,prefix=${{ steps.base_os_tag.outputs.os_tag }}-,suffix=-latest + type=ref,event=branch,suffix=-${{ steps.base_os_tag.outputs.os_tag }}-latest + type=raw,enable=${{ needs.init_build.outputs.is_default_branch == 'true' }},value=${{ steps.base_os_tag.outputs.os_tag }}-latest flavor: | latest=false diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml new file mode 100644 index 000000000..072b62e7a --- /dev/null +++ b/.github/workflows/nightly_build.yml @@ -0,0 +1,334 @@ +name: Nightly build images (DockerHub) + +on: + schedule: + - cron: '5 2 * * *' + workflow_dispatch: + +defaults: + run: + shell: bash + +env: + DOCKER_REPOSITORY: "zabbix" + LATEST_BRANCH: ${{ github.event.repository.default_branch }} + BASE_BUILD_NAME: "build-base" + +jobs: + init_build: + name: Initialize build + runs-on: ubuntu-latest + outputs: + os: ${{ steps.os.outputs.list }} + database: ${{ steps.database.outputs.list }} + components: ${{ steps.components.outputs.list }} + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Check build.json file + id: build_exists + run: | + if [[ ! -f "./build.json" ]]; then + echo "::error::File build.json is missing" + exit 1 + fi + + - name: Prepare Operating System list + id: os + run: | + os_list=$(jq -r '.["os-linux"] | keys | [ .[] | tostring ] | @json' "./build.json") + + echo "::set-output name=list::$os_list" + + - name: Prepare Platform list + id: platform_list + run: | + platform_list=$(jq -r '.["os-linux"] | tostring | @json' "./build.json") + + echo "::set-output name=list::$platform_list" + + - name: Prepare Database engine list + id: database + run: | + database_list=$(jq -r '[.components | values[] ] | sort | unique | del(.. | select ( . == "" ) ) | [ .[] | tostring ] | @json' "./build.json") + + echo "::set-output name=list::$database_list" + + - name: Prepare Zabbix component list + id: components + run: | + component_list=$(jq -r '.components | keys | [ .[] | tostring ] | @json' "./build.json") + + echo "::set-output name=list::$component_list" + + build_base: + timeout-minutes: 30 + name: Build base on ${{ matrix.os }} + needs: init_build + strategy: + fail-fast: false + matrix: + os: ${{ fromJson(needs.init_build.outputs.os) }} + + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Prepare Platform list + id: platform + run: | + platform_list=$(jq -r '.["os-linux"].${{ matrix.os }} | join(",")' "./build.json") + + echo ::set-output name=list::$platform_list + + - name: Generate tags + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.DOCKER_REPOSITORY }}/zabbix-${{ env.BASE_BUILD_NAME }} + tags: | + type=raw,value=${{ matrix.os }}-trunk + type=raw,value=trunk-${{ matrix.os }} + flavor: | + latest=false + + - name: Build ${{ env.BASE_BUILD_NAME }}/${{ matrix.os }} and push + id: docker_build + uses: docker/build-push-action@v2 + with: + context: ./Dockerfiles/${{ env.BASE_BUILD_NAME }}/${{ matrix.os }} + file: ./Dockerfiles/${{ env.BASE_BUILD_NAME }}/${{ matrix.os }}/Dockerfile + platforms: ${{ steps.platform.outputs.list }} + push: ${{ secrets.AUTO_PUSH_IMAGES }} + tags: ${{ steps.meta.outputs.tags }} + labels: | + org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} + org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} + + - name: Image digest + run: | + echo ${{ steps.docker_build.outputs.digest }} + echo "${{ steps.docker_build.outputs.digest }}" > ${{ env.BASE_BUILD_NAME }}_${{ matrix.os }} + + - name: Upload SHA256 tag + uses: actions/upload-artifact@v2.2.4 + with: + name: ${{ env.BASE_BUILD_NAME }}_${{ matrix.os }} + path: ${{ env.BASE_BUILD_NAME }}_${{ matrix.os }} + if-no-files-found: error + + build_base_database: + timeout-minutes: 180 + needs: [ "build_base", "init_build"] + name: Build ${{ matrix.build }} base on ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + build: ${{ fromJson(needs.init_build.outputs.database) }} + os: ${{ fromJson(needs.init_build.outputs.os) }} + + runs-on: ubuntu-20.04 + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Prepare Platform list + id: platform + run: | + platform_list=$(jq -r '.["os-linux"].${{ matrix.os }} | join(",")' "./build.json") + + echo ::set-output name=list::$platform_list + + - name: Generate tags + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.DOCKER_REPOSITORY }}/zabbix-${{ matrix.build }} + tags: | + type=raw,value=${{ matrix.os }}-trunk + type=raw,value=trunk-${{ matrix.os }} + flavor: | + latest=false + + - name: Download SHA256 tag build-base:${{ matrix.os }} + uses: actions/download-artifact@v2.0.10 + with: + name: build-base_${{ matrix.os }} + + - name: Retrieve build-base:${{ matrix.os }} SHA256 tag + id: base_build + run: | + BASE_TAG=$(cat build-base_${{ matrix.os }}) + BUILD_BASE_IMAGE=${{ env.DOCKER_REPOSITORY }}/zabbix-build-base@${BASE_TAG} + + echo ::set-output name=base_tag::${BASE_TAG} + echo ::set-output name=base_build_image::${BUILD_BASE_IMAGE} + + - name: Build ${{ matrix.build }}/${{ matrix.os }} and push + id: docker_build + uses: docker/build-push-action@v2 + with: + context: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }} + file: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }}/Dockerfile + platforms: ${{ steps.platform.outputs.list }} + push: ${{ secrets.AUTO_PUSH_IMAGES }} + tags: ${{ steps.meta.outputs.tags }} + build-args: BUILD_BASE_IMAGE=${{ steps.base_build.outputs.base_build_image }} + labels: | + org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} + org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} + + - name: Image digest + run: | + echo ${{ steps.docker_build.outputs.digest }} + echo "${{ steps.docker_build.outputs.digest }}" > ${{ matrix.build }}_${{ matrix.os }} + + - name: Upload SHA256 tag + uses: actions/upload-artifact@v2.2.4 + with: + name: ${{ matrix.build }}_${{ matrix.os }} + path: ${{ matrix.build }}_${{ matrix.os }} + if-no-files-found: error + + build_images: + timeout-minutes: 90 + needs: [ "build_base_database", "init_build"] + name: Build ${{ matrix.build }} base on ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + build: ${{ fromJson(needs.init_build.outputs.components) }} + os: ${{ fromJson(needs.init_build.outputs.os) }} + + runs-on: ubuntu-20.04 + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Prepare Platform list + id: platform + run: | + # Chromium on Alpine is available only on linux/amd64, linux/arm64 platforms + if ([ "${{ matrix.os }}" == "alpine" ] || [ "${{ matrix.os }}" == "centos" ]) && [ "${{ matrix.build }}" == "web-service" ]; then + platform_list="linux/amd64,linux/arm64" + # Chromium on Ubuntu is not available on s390x platform + elif [ "${{ matrix.os }}" == "ubuntu" ] && [ "${{ matrix.build }}" == "web-service" ]; then + platform_list="linux/amd64,linux/arm/v7,linux/arm64" + else + platform_list=$(jq -r '.["os-linux"].${{ matrix.os }} | join(",")' "./build.json") + fi + + # Build only Agent and Agent2 on 386 + if [ "${{ matrix.build }}" != "agent"* ]; then + platform_list="${platform_list#linux/386,}" + fi + + # Can not compile Java applications on ppc64le + if [ "${{ matrix.build }}" == "java-gateway" ]; then + platform_list="${platform_list%linux/ppc64le}" + fi + + platform_list="${platform_list%,}" + + echo ::set-output name=list::$platform_list + + - name: Detect Build Base Image + id: build_base_image + run: | + BUILD_BASE=$(jq -r '.components."${{ matrix.build }}"' "./build.json") + + echo ::set-output name=build_base::${BUILD_BASE} + + - name: Generate tags + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.DOCKER_REPOSITORY }}/zabbix-${{ matrix.build }} + tags: | + type=raw,value=${{ matrix.os }}-trunk + type=raw,value=trunk-${{ matrix.os }} + flavor: | + latest=false + + - name: Download SHA256 tag for ${{ steps.build_base_image.outputs.build_base }}:${{ matrix.os }} + uses: actions/download-artifact@v2.0.10 + if: ${{ matrix.build != 'snmptraps' }} + with: + name: ${{ steps.build_base_image.outputs.build_base }}_${{ matrix.os }} + + - name: Retrieve ${{ steps.build_base_image.outputs.build_base }}:${{ matrix.os }} SHA256 tag + id: base_build + if: ${{ matrix.build != 'snmptraps' }} + run: | + BASE_TAG=$(cat ${{ steps.build_base_image.outputs.build_base }}_${{ matrix.os }}) + BUILD_BASE_IMAGE=${{ env.DOCKER_REPOSITORY }}/zabbix-${{ steps.build_base_image.outputs.build_base }}@${BASE_TAG} + + echo ::set-output name=base_tag::${BASE_TAG} + echo ::set-output name=base_build_image::${BUILD_BASE_IMAGE} + + - name: Build ${{ matrix.build }}/${{ matrix.os }} and push + id: docker_build + uses: docker/build-push-action@v2 + with: + context: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }} + file: ./Dockerfiles/${{ matrix.build }}/${{ matrix.os }}/Dockerfile + platforms: ${{ steps.platform.outputs.list }} + push: ${{ secrets.AUTO_PUSH_IMAGES }} + tags: ${{ steps.meta.outputs.tags }} + build-args: BUILD_BASE_IMAGE=${{ steps.base_build.outputs.base_build_image }} + labels: | + org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} + org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} + + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/nightly_build_windows.yml b/.github/workflows/nightly_build_windows.yml new file mode 100644 index 000000000..adc28d23d --- /dev/null +++ b/.github/workflows/nightly_build_windows.yml @@ -0,0 +1,385 @@ +name: Nightly build images (DockerHub, Windows) + +on: + schedule: + - cron: '5 2 * * *' + workflow_dispatch: + +defaults: + run: + shell: pwsh + +env: + DOCKER_REPOSITORY: "zabbix" + LATEST_BRANCH: ${{ github.event.repository.default_branch }} + IMAGE_PREFIX: "zabbix-" + BASE_BUILD_NAME: "build-base" + COMPONENT_BASE_BUILD_NAME: "build-mysql" + AUTO_PUSH_IMAGES: ${{ secrets.AUTO_PUSH_IMAGES }} + +jobs: + init_build: + name: Initialize build + runs-on: ubuntu-latest + outputs: + os: ${{ steps.os.outputs.list }} + components: ${{ steps.components.outputs.list }} + is_default_branch: ${{ steps.branch_info.outputs.is_default_branch }} + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Check build.json file + id: build_exists + shell: bash + run: | + if [[ ! -f "./build.json" ]]; then + echo "::error::File build.json is missing" + exit 1 + fi + + - name: Prepare Operating System list + id: os + shell: bash + run: | + os_list=$(jq -r '.["os-windows"] | keys | [ .[] | tostring ] | @json' "./build.json") + + echo "::set-output name=list::$os_list" + + - name: Prepare Zabbix component list + id: components + shell: bash + run: | + component_list='["agent","agent2"]' + + echo "::set-output name=list::$component_list" + + - name: Get branch info + id: branch_info + shell: bash + run: | + github_ref="${{ github.ref }}" + result=false + + if [[ "$github_ref" == "refs/tags/"* ]]; then + github_ref=${github_ref%.*} + fi + + github_ref=${github_ref##*/} + + if [[ "$github_ref" == "${{ env.LATEST_BRANCH }}" ]]; then + result=true + fi + echo "::set-output name=is_default_branch::$result" + + build_base: + timeout-minutes: 70 + name: Build ${{ matrix.component }} base on ${{ matrix.os }} + needs: init_build + env: + BASE_BUILD_ARTIFACT_FILE_SUFFIX: "_${{ matrix.os }}_${{ matrix.component }}" + strategy: + fail-fast: false + matrix: + os: ${{ fromJson(needs.init_build.outputs.os) }} + component: ${{ fromJson(needs.init_build.outputs.components) }} + + runs-on: ${{ matrix.os }} + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Login to DockerHub + run: | + docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} + if (-not $?) {throw "Failed"} + + - name: Base OS tag + id: base_os_tag + run: | + $os_tag=$(Get-Content -Path .\build.json | ConvertFrom-Json).'os-windows'.'${{ matrix.os }}' + echo "::set-output name=os_tag::$os_tag" + + - name: Generate tags + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ env.BASE_BUILD_NAME }} + tags: | + type=raw,value=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}-trunk + type=raw,value=${{ matrix.component }}-trunk-${{ steps.base_os_tag.outputs.os_tag }} + flavor: | + latest=false + + - name: Build image + id: docker_build + run: | + $context='.\Dockerfiles\${{ env.BASE_BUILD_NAME }}\windows\' + $dockerfile= $context + 'Dockerfile.${{ matrix.component }}' + + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + $tags=$( $tags_array | Foreach-Object { "--tag=$_" } ) + + echo "docker build --file=$dockerfile $tags $context" + docker build --label org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} ` + --label org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} ` + --build-arg=BUILD_BASE_IMAGE=mcr.microsoft.com/windows/servercore:${{ steps.base_os_tag.outputs.os_tag }} ` + --file=$dockerfile ` + $tags ` + $context + if (-not $?) {throw "Failed"} + + - name: Push image + if: ${{ env.AUTO_PUSH_IMAGES }} + run: | + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + + Foreach ($tag in $tags_array) { + echo "docker image push $tag" + docker image push $tag + if (-not $?) {throw "Failed"} + } + + - name: Image digest + if: ${{ env.AUTO_PUSH_IMAGES }} + run: | + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + + $digest=$(docker inspect $tags_array[0] --format "{{ index .RepoDigests 0}}").Split('@')[-1] + if (-not $?) {throw "Failed"} + + echo $digest + $digest | Set-Content -Path ${{ env.BASE_BUILD_NAME }}${{ env.BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + + - name: Upload SHA256 tag + if: ${{ env.AUTO_PUSH_IMAGES }} + uses: actions/upload-artifact@v2.2.4 + with: + name: ${{ env.BASE_BUILD_NAME }}${{ env.BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + path: ${{ env.BASE_BUILD_NAME }}${{ env.BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + if-no-files-found: error + + - name: Logout from DockerHub + run: | + docker logout + if (-not $?) {throw "Failed"} + + build_components: + timeout-minutes: 70 + needs: [ "build_base", "init_build"] + name: Build ${{ matrix.component }} sources on ${{ matrix.os }} + env: + BASE_BUILD_ARTIFACT_FILE_SUFFIX: "_${{ matrix.os }}_${{ matrix.component }}" + COMPONENT_BASE_BUILD_ARTIFACT_FILE_SUFFIX: "_${{ matrix.os }}_${{ matrix.component }}" + strategy: + fail-fast: false + matrix: + os: ${{ fromJson(needs.init_build.outputs.os) }} + component: ${{ fromJson(needs.init_build.outputs.components) }} + + runs-on: ${{ matrix.os }} + steps: + - name: Checkout repository + uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Login to DockerHub + run: | + docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} + if (-not $?) {throw "Failed"} + + - name: Base OS tag + id: base_os_tag + run: | + $os_tag=$(Get-Content -Path .\build.json | ConvertFrom-Json).'os-windows'.'${{ matrix.os }}' + echo "::set-output name=os_tag::$os_tag" + + - name: Generate tags + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ env.COMPONENT_BASE_BUILD_NAME }} + tags: | + type=raw,value=${{ matrix.component }}-${{ steps.base_os_tag.outputs.os_tag }}-trunk + type=raw,value=${{ matrix.component }}-trunk-${{ steps.base_os_tag.outputs.os_tag }} + flavor: | + latest=false + + - name: Download SHA256 tag build-base:${{ matrix.os }} + uses: actions/download-artifact@v2.0.10 + with: + name: ${{ env.BASE_BUILD_NAME }}${{ env.BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + + - name: Retrieve ${{ env.BASE_BUILD_NAME }}:${{ matrix.os }} SHA256 tag + id: base_build + run: | + $base_tag = Get-Content ${{ env.BASE_BUILD_NAME }}${{ env.BASE_BUILD_ARTIFACT_FILE_SUFFIX }} -Raw + $build_base_image="${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ env.BASE_BUILD_NAME }}@" + $base_tag + + echo "::set-output name=base_tag::$base_tag" + echo "::set-output name=base_build_image::$build_base_image" + + - name: Build image + id: docker_build + run: | + $context='.\Dockerfiles\${{ env.COMPONENT_BASE_BUILD_NAME }}\windows\' + $dockerfile= $context + 'Dockerfile.${{ matrix.component }}' + + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + $tags=$($tags_array | Foreach-Object { "--tag=$_" }) + + echo "docker build --file=$dockerfile $tags $context" + docker build --label org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} ` + --label org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} ` + --file=$dockerfile ` + --build-arg=BUILD_BASE_IMAGE=${{ steps.base_build.outputs.base_build_image }} ` + $tags ` + $context + if (-not $?) {throw "Failed"} + + - name: Push image + if: ${{ env.AUTO_PUSH_IMAGES }} + run: | + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + + Foreach ($tag in $tags_array) { + echo "docker image push $tag" + docker image push $tag + if (-not $?) {throw "Failed"} + } + + - name: Image digest + if: ${{ env.AUTO_PUSH_IMAGES }} + run: | + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + + $digest=$(docker inspect $tags_array[0] --format "{{ index .RepoDigests 0}}").Split('@')[-1] + if (-not $?) {throw "Failed"} + + echo $digest + $digest | Set-Content -Path ${{ env.COMPONENT_BASE_BUILD_NAME }}${{ env.COMPONENT_BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + + - name: Upload SHA256 tag + if: ${{ env.AUTO_PUSH_IMAGES }} + uses: actions/upload-artifact@v2.2.4 + with: + name: ${{ env.COMPONENT_BASE_BUILD_NAME }}${{ env.COMPONENT_BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + path: ${{ env.COMPONENT_BASE_BUILD_NAME }}${{ env.COMPONENT_BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + if-no-files-found: error + + - name: Logout from DockerHub + run: | + docker logout + if (-not $?) {throw "Failed"} + + build_images: + timeout-minutes: 70 + needs: [ "build_components", "init_build"] + name: Build ${{ matrix.component }} on ${{ matrix.os }} + env: + COMPONENT_BASE_BUILD_ARTIFACT_FILE_SUFFIX: "_${{ matrix.os }}_${{ matrix.component }}" + strategy: + fail-fast: false + matrix: + os: ${{ fromJson(needs.init_build.outputs.os) }} + component: ${{ fromJson(needs.init_build.outputs.components) }} + + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2.3.4 + with: + ref: "refs/heads/trunk" + fetch-depth: 1 + + - name: Login to DockerHub + run: | + docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} + if (-not $?) {throw "Failed"} + + - name: Base OS tag + id: base_os_tag + run: | + $os_tag=$(Get-Content -Path .\build.json | ConvertFrom-Json).'os-windows'.'${{ matrix.os }}' + echo "::set-output name=os_tag::$os_tag" + + - name: Generate tags + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ matrix.component }} + tags: | + type=raw,value=${{ steps.base_os_tag.outputs.os_tag }}-trunk + type=raw,value=trunk-${{ steps.base_os_tag.outputs.os_tag }} + flavor: | + latest=false + + - name: Download SHA256 tag for ${{ env.COMPONENT_BASE_BUILD_NAME }}:${{ matrix.os }} + uses: actions/download-artifact@v2.0.10 + with: + name: ${{ env.COMPONENT_BASE_BUILD_NAME }}${{ env.COMPONENT_BASE_BUILD_ARTIFACT_FILE_SUFFIX }} + + - name: ${{ env.COMPONENT_BASE_BUILD_NAME }}:${{ matrix.os }} SHA256 tag + id: base_build + run: | + $base_tag = Get-Content ${{ env.COMPONENT_BASE_BUILD_NAME }}${{ env.COMPONENT_BASE_BUILD_ARTIFACT_FILE_SUFFIX }} -Raw + $build_base_image="${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_PREFIX }}${{ env.COMPONENT_BASE_BUILD_NAME }}@" + $base_tag + + echo "::set-output name=base_tag::$base_tag" + echo "::set-output name=base_build_image::$build_base_image" + + - name: Build image + id: docker_build + run: | + $context='.\Dockerfiles\${{ matrix.component }}\windows\' + $dockerfile= $context + 'Dockerfile' + + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + $tags=$($tags_array | Foreach-Object { "--tag=$_" }) + + # PowerShell images based on LTSC 2019 and LTSC 2016 do not have "ltsc" prefix + $os_tag_suffix='${{ steps.base_os_tag.outputs.os_tag }}' + $os_tag_suffix=$os_tag_suffix -replace "ltsc2019",'1809' + + echo "docker build --file=$dockerfile $tags $context" + docker build --label org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} ` + --label org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} ` + --file=$dockerfile ` + --build-arg=BUILD_BASE_IMAGE=${{ steps.base_build.outputs.base_build_image }} ` + --build-arg=BASE_IMAGE=mcr.microsoft.com/powershell:lts-nanoserver-$os_tag_suffix ` + $tags ` + $context + if (-not $?) {throw "Failed"} + + - name: Push image + if: ${{ env.AUTO_PUSH_IMAGES }} + run: | + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + + Foreach ($tag in $tags_array) { + echo "docker image push $tag" + docker image push $tag + if (-not $?) {throw "Failed"} + } + + - name: Image digest + if: ${{ env.AUTO_PUSH_IMAGES }} + run: | + $tags_array=$( "${{ steps.meta.outputs.tags }}".Split("`r`n") ) + + $digest=$(docker inspect $tags_array[0] --format "{{ index .RepoDigests 0}}").Split('@')[-1] + if (-not $?) {throw "Failed"} + + echo $digest + + - name: Logout from DockerHub + run: | + docker logout + if (-not $?) {throw "Failed"}