name: 🐳 Build Docker images for current branches # on commits to this file, schedule and dispatch runs, the workflow will build the 3 different Docker images (master, PR, LTR) # on tags, it will build only the image of the given tag # this is made by using a matrix defined in a dedicated job on: push: tags: - final-* branches: - master paths: - .github/workflows/build-docker.yml schedule: # runs every day - cron: '0 0 * * *' workflow_dispatch: # POST https://api.github.com/repos/qgis/QGIS/actions/workflows/2264135/dispatches: permissions: contents: read jobs: define-strategy: permissions: contents: none if: github.repository_owner == 'qgis' runs-on: ubuntu-latest outputs: matrix: ${{ steps.matrix.outputs.matrix }} steps: - id: matrix run: | if [[ "${GITHUB_REF}" =~ ^refs/tags ]]; then echo "matrix={\"branch\":[\"${GITHUB_REF##*/}\"]}" >> $GITHUB_OUTPUT else echo "matrix={\"branch\":[\"master\", \"release-3_34\", \"release-3_28\"]}" >> $GITHUB_OUTPUT fi build-docker: if: github.repository_owner == 'qgis' runs-on: ubuntu-latest needs: define-strategy env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} GH_TOKEN: ${{ secrets.GH_TOKEN }} CC: /usr/lib/ccache/gcc CXX: /usr/lib/ccache/g++ # Building SIP binding freezes with Clang in Docker, maybe a SIP issue, maybe not DOCKER_BUILD_DEPS_FILE: qgis3-qt5-build-deps.dockerfile strategy: fail-fast: false matrix: ${{ fromJSON( needs.define-strategy.outputs.matrix ) }} steps: - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: tool-cache: true large-packages: true docker-images: false swap-storage: true - name: Free additional space run: | df -h rm -rf /tmp/workspace rm -rf /usr/share/dotnet/sdk sudo apt remove llvm-* ghc-* google-chrome-* dotnet-sdk-* dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n | tail -n 100 du -a /usr/share | sort -n -r | head -n 10 du -a /usr/local/share | sort -n -r | head -n 10 df -h sudo apt clean df -h - name: Cache id: cache uses: actions/cache@v3.3.2 with: path: ~/.ccache key: docker-build-${{ matrix.branch }}-${{ github.sha }} restore-keys: | docker-build-${{ matrix.branch }}- docker-build-master- - name: checkout ${{ matrix.branch }} uses: actions/checkout@v4 with: ref: ${{ matrix.branch }} - name: Define vars env: branch: ${{ matrix.branch }} run: | export DOCKER_TAG=${branch//master/latest} export DOCKER_DEPS_TAG=${DOCKER_TAG} # add vars for next steps echo "DOCKER_TAG=${DOCKER_TAG}" >> $GITHUB_ENV echo "DOCKER_DEPS_TAG=${DOCKER_DEPS_TAG}" >> $GITHUB_ENV echo "branch: ${branch}" echo "docker tag: ${DOCKER_TAG}" echo "docker deps tag: ${DOCKER_DEPS_TAG}" - name: Copy cache run: | [[ -d ~/.ccache ]] && echo "cache directory (~/.ccache) exists" || mkdir -p ~/.ccache # copy ccache dir within QGIS source so it can be accessed from docker cp -r ~/.ccache/. ./.ccache_image_build - name: QGIS deps Docker pull/rebuild run: | cd .docker docker --version docker pull "qgis/qgis3-build-deps:${DOCKER_DEPS_TAG}" || true docker build --cache-from "qgis/qgis3-build-deps:${DOCKER_DEPS_TAG}" -t "qgis/qgis3-build-deps:${DOCKER_DEPS_TAG}" -f ${DOCKER_BUILD_DEPS_FILE} . echo "push to qgis/qgis3-build-deps:${DOCKER_DEPS_TAG}" docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" docker push "qgis/qgis3-build-deps:${DOCKER_DEPS_TAG}" - name: Docker QGIS build run: | cd .docker DOCKER_BUILD_ARGS="--build-arg DOCKER_DEPS_TAG --build-arg CC --build-arg CXX" docker build ${DOCKER_BUILD_ARGS} \ --cache-from "qgis/qgis:${DOCKER_TAG}" \ -t "qgis/qgis:BUILDER" \ -f qgis.dockerfile .. - name: Tag container and copy cache run: | docker run --name qgis_container qgis/qgis:BUILDER /bin/true docker cp qgis_container:/QGIS/build_exit_value ./build_exit_value if [[ $(cat ./build_exit_value) != "OK" ]]; then echo "Build failed, not pushing image" exit 1 fi echo "Copy build cache from Docker container to Travis cache directory" rm -rf ~/.ccache/* mkdir -p ~/.ccache docker cp qgis_container:/QGIS/.ccache_image_build/. ~/.ccache echo "Cache size: "$(du -sh ~/.ccache) - name: Finalize image run: | cd .docker # enable experimental features in Docker to squash echo '{ "experimental": true}' | sudo tee /etc/docker/daemon.json sudo service docker restart docker build ${DOCKER_BUILD_ARGS} \ --cache-from "qgis/qgis:BUILDER" \ --squash \ -t "qgis/qgis:${DOCKER_TAG}" \ -f qgis.dockerfile .. - name: Pushing image to docker hub run: | docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" docker push "qgis/qgis:${DOCKER_TAG}" - name: Trigger PyQGIS API docs build for ${{ matrix.branch }} if: success() && !startsWith(github.ref, 'refs/tags/') env: branch: ${{ matrix.branch }} run: | body='{ "ref": "master", "inputs": {"qgis_branch": "__QGIS_VERSION_BRANCH__"} }' body=$(sed "s/__QGIS_VERSION_BRANCH__/${branch}/;" <<< $body) curl -X POST \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: token ${GH_TOKEN}" \ https://api.github.com/repos/qgis/pyqgis/actions/workflows/2246440/dispatches \ -d "${body}"