[gnome-initial-setup/wip/wjt/ci-custom-image] ci: Build and use custom container image




commit 4bdc091f21d0d72f1b316379823ae20ddacc4b85
Author: Will Thompson <wjt endlessm com>
Date:   Mon Aug 24 14:32:00 2020 +0100

    ci: Build and use custom container image
    
    Script borrowed from GTK.

 .gitlab-ci.yml               |  50 +---------------
 .gitlab-ci/fedora.Dockerfile |  60 +++++++++++++++++++
 .gitlab-ci/run-docker.sh     | 136 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 197 insertions(+), 49 deletions(-)
---
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a6f20c52..0914ed70 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,59 +1,11 @@
-image: fedora:33
+image: registry.gitlab.gnome.org/gnome/gnome-initial-setup/fedora:v1
 
 stages:
   - build
 
-before_script:
-  - dnf install -y
-    --nogpgcheck
-    desktop-file-utils
-    gcc
-    gettext
-    git
-    gobject-introspection-devel
-    gtk-doc
-    ibus-devel
-    intltool
-    krb5-devel
-    libpwquality-devel
-    libsecret-devel
-    meson
-    ninja-build
-    "pkgconfig(accountsservice)"
-    "pkgconfig(cheese)"
-    "pkgconfig(cheese-gtk)"
-    "pkgconfig(flatpak)"
-    "pkgconfig(fontconfig)"
-    "pkgconfig(gdm)"
-    "pkgconfig(geocode-glib-1.0)"
-    "pkgconfig(gio-2.0)"
-    "pkgconfig(gio-unix-2.0)"
-    "pkgconfig(glib-2.0)"
-    "pkgconfig(gnome-desktop-3.0)"
-    "pkgconfig(goa-1.0)"
-    "pkgconfig(goa-backend-1.0)"
-    "pkgconfig(gstreamer-1.0)"
-    "pkgconfig(gtk+-3.0)"
-    "pkgconfig(gweather-3.0)"
-    "pkgconfig(libgeoclue-2.0)"
-    "pkgconfig(libnm)"
-    "pkgconfig(libnma)"
-    "pkgconfig(webkit2gtk-4.0)"
-    polkit-devel
-    rest-devel
-
 .job_template: &job_definition
   stage: build
   script:
-    # FIXME: We can’t install malcontent via dnf until it’s packaged in Fedora,
-    # so build it manually.
-    - git clone https://gitlab.freedesktop.org/pwithnall/malcontent.git ./malcontent
-    - pushd ./malcontent
-    - git checkout tags/0.6.0
-    - meson setup ${MESON_COMMON_OPTIONS} --prefix /usr _build
-    - ninja -C _build
-    - sudo ninja -C _build install
-    - popd
     # In general, we would like warnings to be fatal. However, code copied from
     # gnome-control-center uses many deprecated functions. Until we have a good
     # answer to sharing that code (#68), make those warnings non-fatal.
diff --git a/.gitlab-ci/fedora.Dockerfile b/.gitlab-ci/fedora.Dockerfile
new file mode 100644
index 00000000..97ff4be2
--- /dev/null
+++ b/.gitlab-ci/fedora.Dockerfile
@@ -0,0 +1,60 @@
+FROM registry.fedoraproject.org/fedora:33
+
+# TODO: remove --nogpgcheck when Fedora 
+RUN dnf -y install \
+    ccache \
+    desktop-file-utils \
+    gcc \
+    gettext \
+    git \
+    gobject-introspection-devel \
+    gtk-doc \
+    ibus-devel \
+    intltool \
+    krb5-devel \
+    libpwquality-devel \
+    libsecret-devel \
+    meson \
+    ninja-build \
+    "pkgconfig(accountsservice)" \
+    "pkgconfig(cheese)" \
+    "pkgconfig(cheese-gtk)" \
+    "pkgconfig(flatpak)" \
+    "pkgconfig(fontconfig)" \
+    "pkgconfig(gdm)" \
+    "pkgconfig(geocode-glib-1.0)" \
+    "pkgconfig(gio-2.0)" \
+    "pkgconfig(gio-unix-2.0)" \
+    "pkgconfig(glib-2.0)" \
+    "pkgconfig(gnome-desktop-3.0)" \
+    "pkgconfig(goa-1.0)" \
+    "pkgconfig(goa-backend-1.0)" \
+    "pkgconfig(gstreamer-1.0)" \
+    "pkgconfig(gtk+-3.0)" \
+    "pkgconfig(gweather-3.0)" \
+    "pkgconfig(libgeoclue-2.0)" \
+    "pkgconfig(libnm)" \
+    "pkgconfig(libnma)" \
+    "pkgconfig(webkit2gtk-4.0)" \
+    polkit-devel \
+    rest-devel \
+    && dnf clean all
+
+RUN \
+    git clone https://gitlab.freedesktop.org/pwithnall/malcontent.git /tmp/malcontent && \
+    pushd /tmp/malcontent && \
+    git checkout tags/0.6.0 && \
+    meson setup --prefix /usr _build && \
+    ninja -C _build install && \
+    popd && \
+    rm -r /tmp/malcontent
+
+ARG HOST_USER_ID=5555
+ENV HOST_USER_ID ${HOST_USER_ID}
+RUN useradd -u $HOST_USER_ID -ms /bin/bash user
+
+USER user
+WORKDIR /home/user
+
+ENV LANG C.utf8
+ENV PATH="/usr/lib64/ccache:${PATH}"
diff --git a/.gitlab-ci/run-docker.sh b/.gitlab-ci/run-docker.sh
new file mode 100755
index 00000000..bf4144f5
--- /dev/null
+++ b/.gitlab-ci/run-docker.sh
@@ -0,0 +1,136 @@
+#!/bin/bash
+set -x
+
+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;;
+                --base-version) 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"
+else
+        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/gnome-initial-setup/${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]