name: CI on: release: types: - published push: branches: - '3.0' - '4.0' - '5.0' - 'trunk' paths-ignore: - '.env*' - 'docker-compose*.yaml' - '*/rhel/*' - "**.md" defaults: run: shell: bash jobs: build: timeout-minutes: 70 env: LATEST_BRANCH: "${{ github.event.repository.default_branch }}" DOCKER_REPOSITORY: "zabbix" strategy: fail-fast: false matrix: build: - agent - agent2 - java-gateway - proxy-mysql - proxy-sqlite3 - server-mysql - server-pgsql - snmptraps - web-apache-mysql - web-apache-pgsql - web-nginx-mysql - web-nginx-pgsql os: - alpine - ubuntu - centos exclude: - os: centos build: agent2 - os: ubuntu build: agent2 runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Install buildx env: DOCKER_CLI_EXPERIMENTAL: enabled run: | docker pull -q multiarch/qemu-user-static:latest docker run --rm --privileged multiarch/qemu-user-static:latest --reset -p yes --credential yes docker buildx create --name builder-${GITHUB_SHA::8} --driver docker-container --use - name: Available platforms env: DOCKER_CLI_EXPERIMENTAL: enabled run: docker buildx inspect | grep Platforms - name: Prepare platform list id: platform run: | DOCKER_PLATFORM="linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/s390x,linux/ppc64le" if [ "${{ matrix.os }}" == "ubuntu" ]; then DOCKER_PLATFORM="linux/amd64,linux/arm/v7,linux/arm64,linux/s390x,linux/ppc64le" fi if [ "${{ matrix.os }}" == "ubuntu" ] && [ "${{ matrix.build }}" == "snmptraps" ]; then DOCKER_PLATFORM="linux/amd64,linux/arm64" fi if [ "${{ matrix.os }}" == "centos" ]; then DOCKER_PLATFORM="linux/amd64,linux/arm64,linux/ppc64le" fi if [ "${{ matrix.build }}" == "java-gateway" ]; then DOCKER_PLATFORM=${DOCKER_PLATFORM%",linux/ppc64le"} fi echo ::set-output name=list::${DOCKER_PLATFORM} - name: Prepare environment (push) if: github.event_name == 'push' id: prepare_push run: | TAGS_ARRAY=() IMAGE_NAME="${{ env.DOCKER_REPOSITORY }}/zabbix-${{ matrix.build }}" GIT_BRANCH="${{ github.ref }}" GIT_BRANCH=${GIT_BRANCH:11} echo "::debug::Branch - ${GIT_BRANCH}" if [ "${GIT_BRANCH}" == "trunk" ]; then TAGS_ARRAY+=("$IMAGE_NAME:${{ matrix.os }}-${GIT_BRANCH}") else TAGS_ARRAY+=("$IMAGE_NAME:${{ matrix.os }}-${GIT_BRANCH}-latest") fi if [ "${{ matrix.os }}" == "alpine" ] && [ "${LATEST_BRANCH}" == "${GIT_BRANCH}" ]; then TAGS_ARRAY+=("$IMAGE_NAME:latest") fi if [ "${LATEST_BRANCH}" == "${GIT_BRANCH}" ]; then TAGS_ARRAY+=("$IMAGE_NAME:${{ matrix.os }}-latest") fi TAGS=$(printf -- "--tag %s " "${TAGS_ARRAY[@]}") echo "::debug::Tags - ${TAGS}" echo ::set-output name=image_name::${IMAGE_NAME} echo ::set-output name=image_tag_versions::$(printf -- "|%s" "${TAGS_ARRAY[@]}") echo ::set-output name=buildx_args::--platform "${{ steps.platform.outputs.list }}" \ --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \ --build-arg VCS_REF=${GITHUB_SHA::8} \ ${TAGS} \ --file ./${{ matrix.build }}/${{ matrix.os }}/Dockerfile ./${{ matrix.build }}/${{ matrix.os }} - name: Prepare environment (release) if: github.event_name == 'release' && github.event.action == 'published' id: prepare_release run: | TAGS_ARRAY=() IMAGE_NAME="${{ env.DOCKER_REPOSITORY }}/zabbix-${{ matrix.build }}" RELEASE_VERSION="${{ github.ref }}" RELEASE_VERSION=${RELEASE_VERSION:10} GIT_BRANCH=${RELEASE_VERSION%.*} echo "::debug::Release version ${RELEASE_VERSION}. Branch ${GIT_BRANCH}" TAGS_ARRAY+=("$IMAGE_NAME:${{ matrix.os }}-${RELEASE_VERSION}") if [ "${{ matrix.os }}" == "alpine" ] && [ "${LATEST_BRANCH}" == "${GIT_BRANCH}" ]; then TAGS_ARRAY+=("$IMAGE_NAME:latest") fi TAGS=$(printf -- "--tag %s " "${TAGS_ARRAY[@]}") echo ::set-output name=image_name::${IMAGE_NAME} echo ::set-output name=image_tag_versions::$(printf -- "|%s" "${TAGS_ARRAY[@]}") echo ::set-output name=buildx_args::--platform "${{ steps.platform.outputs.list }}" \ --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \ --build-arg VCS_REF=${GITHUB_SHA::8} \ $TAGS \ --file ./${{ matrix.build }}/${{ matrix.os }}/Dockerfile ./${{ matrix.build }}/${{ matrix.os }} - name: Build images env: DOCKER_CLI_EXPERIMENTAL: enabled run: | if [ ! -z "${{ steps.prepare_push.outputs.buildx_args }}" ]; then BUILDX_ARGS="${{ steps.prepare_push.outputs.buildx_args }}" elif [ ! -z "${{ steps.prepare_release.outputs.buildx_args }}" ]; then BUILDX_ARGS="${{ steps.prepare_release.outputs.buildx_args }}" else exit 1 fi docker buildx build --cache-to "type=local,dest=/tmp/.buildx-cache" \ --output "type=image,push=false" \ ${BUILDX_ARGS} - name: Docker Hub login if: success() uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Push images from cache if: success() env: DOCKER_CLI_EXPERIMENTAL: enabled run: | if [ ! -z "${{ steps.prepare_push.outputs.buildx_args }}" ]; then BUILDX_ARGS="${{ steps.prepare_push.outputs.buildx_args }}" elif [ ! -z "${{ steps.prepare_release.outputs.buildx_args }}" ]; then BUILDX_ARGS="${{ steps.prepare_release.outputs.buildx_args }}" fi docker buildx build --cache-from "type=local,src=/tmp/.buildx-cache" \ --output "type=image,push=${{ secrets.AUTO_PUSH_IMAGES }}" \ ${BUILDX_ARGS} - name: Inspect images run: | echo "::debug::push - ${{ steps.prepare_push.outputs.buildx_args }}" echo "::debug::release - ${{ steps.prepare_release.outputs.buildx_args }}" if [ ! -z "${{ steps.prepare_push.outputs.image_tag_versions }}" ]; then IMAGE_TAG_VERSIONS="${{ steps.prepare_push.outputs.image_tag_versions }}" echo "::debug::tags push raw - $IMAGE_TAG_VERSIONS" elif [ ! -z "${{ steps.prepare_release.outputs.image_tag_versions }}" ]; then IMAGE_TAG_VERSIONS="${{ steps.prepare_release.outputs.image_tag_versions }}" echo "::debug::tags release raw - $IMAGE_TAG_VERSIONS" fi IMAGE_TAG_VERSIONS=${IMAGE_TAG_VERSIONS%%+(|)} IFS='|' read -r -a IMAGE_TAG_VERSIONS <<< $IMAGE_TAG_VERSIONS for version in ${IMAGE_TAG_VERSIONS[@]}; do echo "Checking \"$version\"... " docker buildx imagetools inspect $version done