[gtksourceview/bilelmoussaoui/fedora-docker] CI: provide a Dockerfile for the build dependencies




commit a29af222dc1667cc660c157422155947eb82e68c
Author: Bilal Elmoussaoui <bil elmoussaoui gmail com>
Date:   Wed Dec 1 19:07:01 2021 +0100

    CI: provide a Dockerfile for the build dependencies
    
    This is needed for the gi-docgen migration
    As we want a newer gobject-introspection than the one available in the gtk published container

 .gitlab-ci/README.md         |  15 +++++
 .gitlab-ci/fedora.Dockerfile |  28 +++++++++
 .gitlab-ci/run-docker.sh     | 140 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 183 insertions(+)
---
diff --git a/.gitlab-ci/README.md b/.gitlab-ci/README.md
new file mode 100644
index 00000000..e9282005
--- /dev/null
+++ b/.gitlab-ci/README.md
@@ -0,0 +1,15 @@
+# CI containers
+
+In order to build the image used by the CI run the following:
+
+```shell
+./run-docker.sh build --basename=fedora
+```
+
+And to publish the image
+
+```shell
+./run-docker.sh push --basename=fedora
+```
+
+For more details, you can run `./run-docker.sh help`
diff --git a/.gitlab-ci/fedora.Dockerfile b/.gitlab-ci/fedora.Dockerfile
new file mode 100644
index 00000000..c0220103
--- /dev/null
+++ b/.gitlab-ci/fedora.Dockerfile
@@ -0,0 +1,28 @@
+FROM fedora:35
+
+RUN dnf update -y
+RUN dnf -y install \
+    meson \
+    vala \
+    gtk4-devel \
+    ninja-build \
+    pkgconf \
+    clang \
+    gobject-introspection-devel \
+    gtk-doc \
+    vulkan-headers \
+    gi-docgen
+
+RUN dnf clean all
+
+# Enable sudo for wheel users
+RUN sed -i -e 's/# %wheel/%wheel/' -e '0,/%wheel/{s/%wheel/# %wheel/}' /etc/sudoers
+
+ARG HOST_USER_ID=5555
+ENV HOST_USER_ID ${HOST_USER_ID}
+RUN useradd -u $HOST_USER_ID -G wheel -ms /bin/bash user
+
+USER user
+WORKDIR /home/user
+
+ENV LANG C.UTF-8
diff --git a/.gitlab-ci/run-docker.sh b/.gitlab-ci/run-docker.sh
new file mode 100755
index 00000000..79768978
--- /dev/null
+++ b/.gitlab-ci/run-docker.sh
@@ -0,0 +1,140 @@
+#!/bin/bash
+
+# Copied from https://gitlab.gnome.org/GNOME/gtk/-/blob/main/.gitlab-ci/run-docker.sh
+
+read_arg() {
+    # $1 = arg name
+    # $2 = arg value
+    # $3 = arg parameter
+    local rematch='^[^=]*=(.*)$'
+    if [[ $2 =~ $rematch ]]; then
+        read "$1" <<<"${BASH_REMATCH[1]}"
+    else
+        read "$1" <<<"$3"
+        # There is no way to shift our callers args, so
+        # return 1 to indicate they should do it instead.
+        return 1
+    fi
+}
+
+set -e
+
+build=0
+run=0
+push=0
+list=0
+print_help=0
+no_login=0
+
+while (($# > 0)); do
+    case "${1%%=*}" in
+    build) build=1 ;;
+    run) run=1 ;;
+    push) push=1 ;;
+    list) list=1 ;;
+    help) print_help=1 ;;
+    --base | -b) read_arg base "$@" || shift ;;
+    --version | -v) read_arg base_version "$@" || shift ;;
+    --no-login) no_login=1 ;;
+    *)
+        echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"
+        exit 1
+        ;;
+    esac
+    shift
+done
+
+if [ $print_help == 1 ]; then
+    echo "$0 - Build and run Docker images"
+    echo ""
+    echo "Usage: $0 <command> [options] [basename]"
+    echo ""
+    echo "Available commands"
+    echo ""
+    echo "  build --base=<BASENAME> - Build Docker image <BASENAME>.Dockerfile"
+    echo "  run --base=<BASENAME>   - Run Docker image <BASENAME>"
+    echo "  push --base=<BASENAME>  - Push Docker image <BASENAME> to the registry"
+    echo "  list                    - List available images"
+    echo "  help                    - This help message"
+    echo ""
+    exit 0
+fi
+
+cd "$(dirname "$0")"
+
+if [ $list == 1 ]; then
+    echo "Available Docker images:"
+    for f in *.Dockerfile; do
+        filename=$(basename -- "$f")
+        basename="${filename%.*}"
+
+        echo -e "  \e[1;39m$basename\e[0m"
+    done
+    exit 0
+fi
+
+# All commands after this require --base to be set
+if [ -z $base ]; then
+    echo "Usage: $0 <command>"
+    exit 1
+fi
+
+if [ ! -f "$base.Dockerfile" ]; then
+    echo -e "\e[1;31mERROR\e[0m: Dockerfile for '$base' not found"
+    exit 1
+fi
+
+if [ -z $base_version ]; then
+    base_version="latest"
+elif [ $base_version != "latest" ]; then
+    base_version="v$base_version"
+fi
+
+if [ ! -x "$(command -v docker)" ] || [ docker --help |& grep -q podman ]; then
+    # Docker is actually implemented by podman, and its OCI output
+    # is incompatible with some of the dockerd instances on GitLab
+    # CI runners.
+    echo "Using: Podman"
+    format="--format docker"
+    CMD="podman"
+else
+    echo "Using: Docker"
+    format=""
+    CMD="sudo docker"
+fi
+
+REGISTRY="registry.gitlab.gnome.org"
+TAG="${REGISTRY}/gnome/gtksourceview/${base}:${base_version}"
+
+if [ $build == 1 ]; then
+    echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}"
+    ${CMD} build \
+        ${format} \
+        --build-arg HOST_USER_ID="$UID" \
+        --tag "${TAG}" \
+        --file "${base}.Dockerfile" .
+    exit $?
+fi
+
+if [ $push == 1 ]; then
+    echo -e "\e[1;32mPUSHING\e[0m: ${base} as ${TAG}"
+
+    if [ $no_login == 0 ]; then
+        ${CMD} login ${REGISTRY}
+    fi
+
+    ${CMD} push ${TAG}
+    exit $?
+fi
+
+if [ $run == 1 ]; then
+    echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}"
+    ${CMD} run \
+        --rm \
+        --volume "$(pwd)/..:/home/user/app" \
+        --workdir "/home/user/app" \
+        --tty \
+        --interactive "${TAG}" \
+        bash
+    exit $?
+fi


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]