### This workflow setup instance then build and push images ### name: 4testing multiarch-build on: push: tags: - "v*" env: COMPANY_NAME: "onlyoffice" PRODUCT_NAME: "documentserver" jobs: build: name: "Build image: DocumentServer${{ matrix.edition }}" runs-on: ubuntu-latest strategy: fail-fast: false matrix: images: ["documentserver"] edition: ["", "-ee", "-de"] steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx id: buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Get Tag Name run: | echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV - name: Build 4testing run: | ### ==>> At this step build variable declaration ### DOCKER_TAG=$( echo ${{ env.RELEASE_VERSION }} | sed 's/^.//' ) PACKAGE_VERSION=$( echo $DOCKER_TAG | sed -E 's/(.*)\./\1-/' ) NODE_PLATFORMS=$( echo ${{ steps.buildx.outputs.platforms }} | sed 's/linux\///g' | sed 's/,/ /g' ) EXPECTED_PLATFORMS="linux/amd64,linux/arm64" echo "Start check avalivable build platforms >>" ### ==>> In this loop we will check all avalivable documentserver architectures. After that all accessed arch will be added to build-platforms list. ### for ARCH in ${NODE_PLATFORMS}; do REPO_URL=${{ secrets.REPO_URL }} if [[ ${{ env.RELEASE_VERSION }} == v99.* ]]; then REPO_URL=${{ secrets.UNSTABLE_REPO_URL }} DEVELOP_BUILD=true fi PACKAGE_URL_CHECK=${REPO_URL}${{ matrix.edition }}_"$PACKAGE_VERSION"_${ARCH}.deb STATUS=$(curl -s -o /dev/null -w "%{http_code}\n" "${PACKAGE_URL_CHECK}") if [[ "$STATUS" = "200" ]]; then echo "✔ ${ARCH} is avalivable >> set like one of build platforms" PLATFORMS+=(linux/${ARCH},) BUILD_PLATFORMS=$( echo ${PLATFORMS[@]} | sed 's/ //g' | sed 's/\(.*\),/\1/' ) else echo "Х ${ARCH} in not avalivable" fi done PACKAGE_URL_BUILD=$( echo ${PACKAGE_URL_CHECK} | sed -e "s/${PACKAGE_VERSION}_.*.deb/${PACKAGE_VERSION}_TARGETARCH.deb/g" ) ### ==>> At this step if there is no access to any platform and platform list is empty, build will exit with 1. ### if [[ -z ${BUILD_PLATFORMS} ]]; then echo "Have no access to any platform >> exit with 1" exit 1 fi echo "DONE: Check passed >> Build for platforms: ${BUILD_PLATFORMS}" echo "Build is starting ... >>" ### == >> Set exit code for action if [ ${BUILD_PLATFORMS} == ${EXPECTED_PLATFORMS} ]; then EXIT_CODE=0 echo "OK: Build platforms is expected" else EXIT_CODE=1 echo "WARNING: Build platforms is unexpected action is gonna be marked as Failed" fi ### ==>> Build and push images at this step ### PRODUCT_EDITION=${{ matrix.edition }} \ PACKAGE_URL=$PACKAGE_URL_BUILD \ PRODUCT_NAME=${{ env.PRODUCT_NAME }} \ DOCKERFILE=Dockerfile \ PREFIX_NAME=4testing- \ TAG=$DOCKER_TAG \ PLATFORM=$BUILD_PLATFORMS \ COMPANY_NAME=${{ env.COMPANY_NAME }} \ DEVELOP_BUILD=$DEVELOP_BUILD \ docker buildx bake \ -f docker-bake.hcl ${{ matrix.images }} \ --push echo "DONE: Build success >> exit with ${EXIT_CODE}" exit ${EXIT_CODE} shell: bash