diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index b4ee26d..0296d4b 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -3,59 +3,34 @@ name: Build Docker Images on: push jobs: + define-matrix: + runs-on: ubuntu-latest + outputs: + cmake_versions: ${{ steps.matrix.outputs.cmake_versions }} + qts: ${{ steps.matrix.outputs.qts }} + steps: + - name: Define Matrix + id: matrix + run: | + echo 'cmake_versions=["3.30.6", "3.31.2"]' >> "$GITHUB_OUTPUT" + echo 'qts=[{"version": "6.6.3", "arch": "gcc_64"}, {"version": "6.7.3", "arch": "linux_gcc_64"}, {"version": "6.8.1", "arch": "linux_gcc_64"}]' >> "$GITHUB_OUTPUT" + cmake: name: "CMake Docker builds" + needs: define-matrix strategy: fail-fast: false matrix: - distro: ['noble'] - cmake_version: ['3.30.6', '3.31.2'] - clang: [ - {major: 17, source: 'apt'}, - {major: 18, source: 'llvm'}, - {major: 19, source: 'llvm'} - ] - gcc: [ - {major: 12, source: 'apt'}, - {major: 13, source: 'apt'}, - {major: 14, source: 'apt'} - ] - qt: [ - {version: '6.6.3', arch: 'gcc_64'}, - {version: '6.7.3', arch: 'linux_gcc_64'}, - {version: '6.8.1', arch: 'linux_gcc_64'} - ] - - include: - - distro: noble - cmake_version: '3.31.2' - clang: {major: 19, source: 'llvm'} - gcc: {major: 14, source: 'apt'} - qt: {version: '6.8.1', arch: 'linux_gcc_64'} - gcc_tags: | - arbmind/cmake-gcc:latest - ghcr.io/arbmind/cmake-gcc:latest - gcc_qt_tags: | - arbmind/cmake-gcc-qt:latest - ghcr.io/arbmind/cmake-gcc-qt:latest - gcc_qtgui_tags: | - arbmind/cmake-gcc-qtgui-dev:latest - ghcr.io/arbmind/cmake-gcc-qtgui-dev:latest - clang_tags: | - arbmind/cmake-clang:latest - ghcr.io/arbmind/cmake-clang:latest - clang_libstdcpp_tags: | - arbmind/cmake-clang-libstdcpp:latest - ghcr.io/arbmind/cmake-clang-libstdcpp:latest - clang_libstdcpp_qt_tags: | - arbmind/cmake-clang-libstdcpp-qt:latest - ghcr.io/arbmind/cmake-clang-libstdcpp-qt:latest - clang_libstdcpp_qtgui_tags: | - arbmind/cmake-clang-libstdcpp-qtgui-dev:latest - ghcr.io/arbmind/cmake-clang-libstdcpp-qtgui-dev:latest + cmake_version: ${{ fromJSON(needs.define-matrix.outputs.cmake_versions) }} + qt: ${{ fromJSON(needs.define-matrix.outputs.qts) }} runs-on: ubuntu-latest steps: + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + tool-cache: true + - uses: actions/checkout@v4 - name: Set up Docker Buildx @@ -76,136 +51,20 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: CMake ${{ matrix.cmake_version }} + GCC ${{ matrix.gcc.major }} - uses: docker/build-push-action@v6 - with: - # buildkitd-flags: --debug - target: cmake-gcc - push: ${{ github.event_name != 'pull_request' }} - tags: | - arbmind/cmake-gcc:${{ matrix.cmake_version }}-${{ matrix.gcc.major }} - ghcr.io/arbmind/cmake-gcc:${{ matrix.cmake_version }}-${{ matrix.gcc.major }} - ${{ matrix.gcc_tags }} - build-args: | - DISTRO=${{ matrix.distro }} - GCC_MAJOR=${{ matrix.gcc.major }} - GCC_SOURCE=${{ matrix.gcc.source }} - QT_VERSION=${{ matrix.qt.version }} - QT_ARCH=${{ matrix.qt.arch }} - CMAKE_VERSION=${{ matrix.cmake_version }} - - - name: CMake ${{ matrix.cmake_version }} + GCC ${{ matrix.gcc.major }} + Qt ${{ matrix.qt.version }} - uses: docker/build-push-action@v6 - with: - target: cmake-gcc-qt - push: ${{ github.event_name != 'pull_request' }} - tags: | - arbmind/cmake-gcc-qt:${{ matrix.cmake_version }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ghcr.io/arbmind/cmake-gcc-qt:${{ matrix.cmake_version }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ${{ matrix.gcc_qt_tags }} - build-args: | - DISTRO=${{ matrix.distro }} - GCC_MAJOR=${{ matrix.gcc.major }} - GCC_SOURCE=${{ matrix.gcc.source }} - QT_VERSION=${{ matrix.qt.version }} - QT_ARCH=${{ matrix.qt.arch }} - CMAKE_VERSION=${{ matrix.cmake_version }} - - - name: CMake ${{ matrix.cmake_version }} + GCC ${{ matrix.gcc.major }} + QtGui ${{ matrix.qt.version }} + Dev - uses: docker/build-push-action@v6 - with: - target: cmake-qtgui-dev - push: ${{ github.event_name != 'pull_request' }} - tags: | - arbmind/cmake-gcc-qtgui-dev:${{ matrix.cmake_version }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ghcr.io/arbmind/cmake-gcc-qtgui-dev:${{ matrix.cmake_version }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ${{ matrix.gcc_qtgui_tags }} - labels: | - Description="Ubuntu ${{ matrix.distro }} - Gcc${{ matrix.gcc.major }} + CMake ${{ matrix.cmake_version }} + QtGui ${{ matrix.qt.version }} + Dev" - org.opencontainers.image.source="https://github.com/arBmind/cmake-containers" - build-args: | - DISTRO=${{ matrix.distro }} - GCC_MAJOR=${{ matrix.gcc.major }} - GCC_SOURCE=${{ matrix.gcc.source }} - QT_VERSION=${{ matrix.qt.version }} - QT_ARCH=${{ matrix.qt.arch }} - CMAKE_VERSION=${{ matrix.cmake_version }} - QTGUI_BASE_IMAGE=cmake-gcc-qt - - - name: CMake ${{ matrix.cmake_version }} + Clang ${{ matrix.clang.major }} - uses: docker/build-push-action@v6 - with: - target: cmake-clang - push: ${{ github.event_name != 'pull_request' }} - tags: | - arbmind/cmake-clang:${{ matrix.cmake_version }}-${{ matrix.clang.major }} - ghcr.io/arbmind/cmake-clang:${{ matrix.cmake_version }}-${{ matrix.clang.major }} - ${{ matrix.clang_tags }} - build-args: | - DISTRO=${{ matrix.distro }} - CLANG_MAJOR=${{ matrix.clang.major }} - CLANG_SOURCE=${{ matrix.clang.source }} - QT_VERSION=${{ matrix.qt.version }} - QT_ARCH=${{ matrix.qt.arch }} - CMAKE_VERSION=${{ matrix.cmake_version }} - - - name: CMake ${{ matrix.cmake_version }} + Clang ${{ matrix.clang.major }} + LibStdC++ ${{ matrix.gcc.major }} - uses: docker/build-push-action@v6 - with: - target: cmake-clang-libstdcpp - push: ${{ github.event_name != 'pull_request' }} - tags: | - arbmind/cmake-clang-libstdcpp:${{ matrix.cmake_version }}-${{ matrix.clang.major }}-${{ matrix.gcc.major }} - ghcr.io/arbmind/cmake-clang-libstdcpp:${{ matrix.cmake_version }}-${{ matrix.clang.major }}-${{ matrix.gcc.major }} - ${{ matrix.clang_libstdcpp_tags }} - build-args: | - DISTRO=${{ matrix.distro }} - CLANG_MAJOR=${{ matrix.clang.major }} - CLANG_SOURCE=${{ matrix.clang.source }} - GCC_MAJOR=${{ matrix.gcc.major }} - GCC_SOURCE=${{ matrix.gcc.source }} - QT_VERSION=${{ matrix.qt.version }} - QT_ARCH=${{ matrix.qt.arch }} - CMAKE_VERSION=${{ matrix.cmake_version }} - - - name: CMake ${{ matrix.cmake_version }} + Clang ${{ matrix.clang.major }} + LibStdC++ ${{ matrix.gcc.major }} + Qt ${{ matrix.qt.version }} - uses: docker/build-push-action@v6 - with: - target: cmake-clang-libstdcpp-qt - push: ${{ github.event_name != 'pull_request' }} - tags: | - arbmind/cmake-clang-libstdcpp-qt:${{ matrix.cmake_version }}-${{ matrix.clang.major }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ghcr.io/arbmind/cmake-clang-libstdcpp-qt:${{ matrix.cmake_version }}-${{ matrix.clang.major }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ${{ matrix.clang_libstdcpp_qt_tags }} - build-args: | - DISTRO=${{ matrix.distro }} - CLANG_MAJOR=${{ matrix.clang.major }} - CLANG_SOURCE=${{ matrix.clang.source }} - GCC_MAJOR=${{ matrix.gcc.major }} - GCC_SOURCE=${{ matrix.gcc.source }} - QT_VERSION=${{ matrix.qt.version }} - QT_ARCH=${{ matrix.qt.arch }} - CMAKE_VERSION=${{ matrix.cmake_version }} + - name: Compact JSON + id: compact_step + run: | + echo "qt_json=$(cat <> "$GITHUB_OUTPUT" - - name: CMake ${{ matrix.cmake_version }} + Clang ${{ matrix.clang.major }} + LibStdC++ ${{ matrix.gcc.major }} + QtGui ${{ matrix.qt.version }} + Dev - uses: docker/build-push-action@v6 + - name: Build + uses: docker/bake-action@v5 with: - target: cmake-qtgui-dev push: ${{ github.event_name != 'pull_request' }} - tags: | - arbmind/cmake-clang-libstdcpp-qtgui-dev:${{ matrix.cmake_version }}-${{ matrix.clang.major }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ghcr.io/arbmind/cmake-clang-libstdcpp-qtgui-dev:${{ matrix.cmake_version }}-${{ matrix.clang.major }}-${{ matrix.gcc.major }}-${{ matrix.qt.version }} - ${{ matrix.clang_libstdcpp_qtgui_tags }} - labels: | - Description="Ubuntu ${{ matrix.distro }} - Clang${{ matrix.clang.major }} + Libstdc++-${{ matrix.gcc.major }} + CMake ${{ matrix.cmake_version }} + QtGui ${{ matrix.qt.version }} + Dev" - org.opencontainers.image.source="https://github.com/arBmind/cmake-containers" - build-args: | - DISTRO=${{ matrix.distro }} - CLANG_MAJOR=${{ matrix.clang.major }} - CLANG_SOURCE=${{ matrix.clang.source }} - GCC_MAJOR=${{ matrix.gcc.major }} - GCC_SOURCE=${{ matrix.gcc.source }} - QT_VERSION=${{ matrix.qt.version }} - QT_ARCH=${{ matrix.qt.arch }} - CMAKE_VERSION=${{ matrix.cmake_version }} - QTGUI_BASE_IMAGE=cmake-clang-libstdcpp-qt + env: + CMAKE_VERSION: ${{ matrix.cmake_version }} + CMAKE_VERSIONS: ${{ needs.define-matrix.outputs.cmake_versions }} + QT: ${{ steps.compact_step.outputs.qt_json }} + QTS: ${{ needs.define-matrix.outputs.qts }} diff --git a/Dockerfile b/Dockerfile index f5e3452..eb26be2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -55,12 +55,12 @@ ARG DEBIAN_FRONTEND=noninteractive RUN pip install aqtinstall RUN < /etc/apt/sources.list.d/gcc.list - apt-get update --quiet + apt-get -qq update -o=Dpkg::Use-Pty=0 fi - apt-get install --yes --quiet --no-install-recommends \ + apt-get -qq --yes install -o=Dpkg::Use-Pty=0 --no-install-recommends \ git \ ninja-build \ make \ @@ -138,8 +138,8 @@ RUN < /etc/apt/sources.list.d/llvm.list - apt-get update --quiet + apt-get -qq update -o=Dpkg::Use-Pty=0 fi - apt-get install --yes --quiet --no-install-recommends \ + apt-get -qq --yes install -o=Dpkg::Use-Pty=0 --no-install-recommends \ git \ ninja-build \ make \ @@ -226,8 +226,8 @@ RUN < /etc/apt/sources.list.d/gcc.list - apt-get update --quiet + apt-get -qq update -o=Dpkg::Use-Pty=0 fi - apt-get install --yes --quiet --no-install-recommends \ + apt-get -qq --yes install -o=Dpkg::Use-Pty=0 --no-install-recommends \ libstdc++-${GCC_MAJOR}-dev - apt-get --yes autoremove - apt-get clean autoclean + apt-get -qq --yes autoremove -o=Dpkg::Use-Pty=0 + apt-get -qq clean autoclean -o=Dpkg::Use-Pty=0 rm -rf /var/lib/apt/lists/{apt,dpkg,cache,log} /tmp/* /var/tmp/* INSTALL_LIBSTDCPP @@ -335,11 +335,11 @@ FROM ${QTGUI_BASE_IMAGE} AS cmake-qtgui-dev ARG QTGUI_PACKAGES RUN < 0 ? "LibStdC++${major}" : "GCC${major}") +} +function "describeQt" { + params = [target, version] + result = version == "" ? "" : (length(regexall("qtgui", target)) > 0 ? "QtGui ${version}" : "Qt ${version}") +} +function "description" { + params = [target, distro, cmake_version, clang_major, gcc_major, qt_version, extra] + result = "Ubuntu ${distro} - ${join(" + ", compact(["CMake ${cmake_version}", describeClang(clang_major), describeGcc(target, gcc_major), describeQt(target, qt_version), extra]))}" +} +function "tags" { + params = [target, cmake_version, clang_major, gcc_major, qt_version] + result = flatten([for tag in compact([versionTag(cmake_version, clang_major, gcc_major, qt_version), latestTag(cmake_version, clang_major, gcc_major, qt_version)]) : [ + "arbmind/${target}:${tag}", + "ghcr.io/arbmind/${target}:${tag}" + ]]) +} +function "dockerTarget" { + params = [target] + result = length(regexall("qtgui-dev$", target)) > 0 ? "cmake-qtgui-dev" : target +} + +group "default" { + targets = [ + "cmake-gcc", "cmake-gcc-qt", "cmake-gcc-qtgui-dev", + "cmake-clang", "cmake-clang-libstdcpp", "cmake-clang-libstdcpp-qt", "cmake-clang-libstdcpp-qtgui-dev" + ] +} + +target "_common" { + dockerfile = "Dockerfile" + context = "./" + labels = { + "org.opencontainers.image.source" = "https://github.com/arBmind/cmake-containers" + } +} + +target "cmake-gcc" { + inherits = ["_common"] + target = dockerTarget(name) + name = uniqueName(name, distro, cmake_version, "", gcc.major, "") + tags = tags(name, cmake_version, "", gcc.major, "") + matrix = { + name = ["cmake-gcc"], + distro = distros(), + cmake_version = matrix_cmake_versions(), + gcc = gccs(), + } + args = { + DISTRO = distro + GCC_MAJOR = gcc.major + GCC_SOURCE = gcc.source + CMAKE_VERSION = cmake_version + } + labels = { + Description = description(name, distro, cmake_version, "", gcc.major, "", "") + } +} +target "cmake-gcc-qt" { + inherits = ["_common"] + target = dockerTarget(name) + name = uniqueName(name, distro, cmake_version, "", gcc.major, qt.version) + tags = tags(name, cmake_version, "", gcc.major, qt.version) + matrix = { + name = ["cmake-gcc-qt"], + distro = distros(), + cmake_version = matrix_cmake_versions(), + gcc = gccs(), + qt = matrix_qts() + } + args = { + DISTRO = distro + GCC_MAJOR = gcc.major + GCC_SOURCE = gcc.source + QT_VERSION = qt.version + QT_ARCH = qt.arch + CMAKE_VERSION = cmake_version + } + labels = { + Description = description(name, distro, cmake_version, "", gcc.major, qt.version, "") + } +} +target "cmake-gcc-qtgui-dev" { + inherits = ["_common"] + target = dockerTarget(name) + name = uniqueName(name, distro, cmake_version, "", gcc.major, qt.version) + tags = tags(name, cmake_version, "", gcc.major, qt.version) + matrix = { + name = ["cmake-gcc-qtgui-dev"], + distro = distros(), + cmake_version = matrix_cmake_versions(), + gcc = gccs(), + qt = matrix_qts() + } + args = { + DISTRO = distro + GCC_MAJOR = gcc.major + GCC_SOURCE = gcc.source + QT_VERSION = qt.version + QT_ARCH = qt.arch + CMAKE_VERSION = cmake_version + QTGUI_BASE_IMAGE = "cmake-gcc-qt" + } + labels = { + Description = description(name, distro, cmake_version, "", gcc.major, qt.version, "Dev") + } +} +target "cmake-clang" { + inherits = ["_common"] + target = dockerTarget(name) + name = uniqueName(name, distro, cmake_version, clang.major, "", "") + tags = tags(name, cmake_version, clang.major, "", "") + matrix = { + name = ["cmake-clang"], + distro = distros(), + cmake_version = matrix_cmake_versions(), + clang = clangs(), + } + args = { + DISTRO = distro + CLANG_MAJOR = clang.major + CLANG_SOURCE = clang.source + CMAKE_VERSION = cmake_version + } + labels = { + Description = description(name, distro, cmake_version, clang.major, "", "", "") + } +} +target "cmake-clang-libstdcpp" { + inherits = ["_common"] + target = dockerTarget(name) + name = uniqueName(name, distro, cmake_version, clang.major, gcc.major, "") + tags = tags(name, cmake_version, clang.major, gcc.major, "") + matrix = { + name = ["cmake-clang-libstdcpp"], + distro = distros(), + cmake_version = matrix_cmake_versions(), + clang = clangs(), + gcc = gccs(), + } + args = { + DISTRO = distro + CLANG_MAJOR = clang.major + CLANG_SOURCE = clang.source + GCC_MAJOR = gcc.major + GCC_SOURCE = gcc.source + CMAKE_VERSION = cmake_version + } + labels = { + Description = description(name, distro, cmake_version, clang.major, gcc.major, "", "") + } +} +target "cmake-clang-libstdcpp-qt" { + inherits = ["_common"] + target = dockerTarget(name) + name = uniqueName(name, distro, cmake_version, clang.major, gcc.major, qt.version) + tags = tags(name, cmake_version, clang.major, gcc.major, qt.version) + matrix = { + name = ["cmake-clang-libstdcpp-qt"], + distro = distros(), + cmake_version = matrix_cmake_versions(), + clang = clangs(), + gcc = gccs(), + qt = matrix_qts() + } + args = { + DISTRO = distro + CLANG_MAJOR = clang.major + CLANG_SOURCE = clang.source + GCC_MAJOR = gcc.major + GCC_SOURCE = gcc.source + QT_VERSION = qt.version + QT_ARCH = qt.arch + CMAKE_VERSION = cmake_version + } + labels = { + Description = description(name, distro, cmake_version, clang.major, gcc.major, qt.version, "") + } +} +target "cmake-clang-libstdcpp-qtgui-dev" { + inherits = ["_common"] + target = dockerTarget(name) + name = uniqueName(name, distro, cmake_version, clang.major, gcc.major, qt.version) + tags = tags(name, cmake_version, clang.major, gcc.major, qt.version) + matrix = { + name = ["cmake-clang-libstdcpp-qtgui-dev"], + distro = distros(), + cmake_version = matrix_cmake_versions(), + clang = clangs(), + gcc = gccs(), + qt = matrix_qts() + } + args = { + DISTRO = distro + CLANG_MAJOR = clang.major + CLANG_SOURCE = clang.source + GCC_MAJOR = gcc.major + GCC_SOURCE = gcc.source + QT_VERSION = qt.version + QT_ARCH = qt.arch + CMAKE_VERSION = cmake_version + QTGUI_BASE_IMAGE = "cmake-clang-libstdcpp-qt" + } + labels = { + Description = description(name, distro, cmake_version, clang.major, gcc.major, qt.version, "Dev") + } +}