Fichier .gitlab-ci.yml pour génération automatique d'images Docker de Dokos

Bonjour,

sur la base de la documentation officielle j’ai réalisé un template d’intégration continue pour Gitlab permettant de produire une image valide de Dokos à chaque nouveau tag.
Vous trouverez le fichier ci-dessous. Il se base sur le dépôt officiel de Frappe.

Attention : il n’intègre pas HRMS et n’installe pas Payments.

Mode d’emploi :

Pour instancier, il faut penser à :

  • ajouter/configurer les bonnes variables dans .env
  • utiliser docker compose en assemblant les fichiers qui vous intéressent (dans mon cas : docker compose -f compose.yaml -f overrides/compose.redis.yaml -f overrides/compose.mariadb.yaml -f overrides/compose.noproxy.yaml up -d)
  • lancer la création du site “à la main” : docker compose exec backend bench new-site frontend --no-mariadb-socket --admin-password=XXX --db-root-password=XXXX --install-app erpnext --set-default
  • nota : pour l’utiliser en local bien faire attention que la valeur de variable d’environnement FRAPPE_SITE_NAME_HEADER corresponde au nom du site créé (cf : frappe_docker/single-compose-setup.md at main · frappe/frappe_docker · GitHub)
  • de façon générale lisez la doc du dépôt on y apprend pas mal de choses …

Fichier en code source ci-dessous : .gitlab-ci.yml

default:
  ## FROM : https://docs.gitlab.com/ee/ci/docker/using_kaniko.html
  ## l.9 : Ajout des codes d'accès au registre (si nécessaire)
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  before_script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json

variables:
  ## en fonction des releases en cours
  PAYMENTS_VERSION: "v3.x.x"
  DOKOS_VERSION: "v3.20.0"
  FRAPPE_BRANCH: "v3.21.0"
  ## voir docker-bake.hcl
  PYTHON_VERSION: "3.10.5"
  NODE_VERSION: "16.18.0"

build_docker_dokos:
  stage: build
  script:
    - >-
      APPS_JSON="[{\"url\": \"https://gitlab.com/dokos/payments\",\"branch\": \"${PAYMENTS_VERSION}\"},{\"url\": \"https://gitlab.com/dokos/dokos\",\"branch\": \"${DOKOS_VERSION}\"}]"

      APPS_JSON_BASE64=$(echo ${APPS_JSON} | base64)

      /kaniko/executor
      --context "${CI_PROJECT_DIR}/"
      --dockerfile "${CI_PROJECT_DIR}/images/custom/Containerfile"
      --build-arg "FRAPPE_PATH=https://gitlab.com/dokos/dodock"
      --build-arg "FRAPPE_BRANCH=${FRAPPE_BRANCH}"
      --build-arg "PYTHON_VERSION=${PYTHON_VERSION}"
      --build-arg "NODE_VERSION=${NODE_VERSION}"
      --build-arg "APPS_JSON_BASE64=${APPS_JSON_BASE64}"
      --cache=true
      --destination "${CI_REGISTRY_IMAGE}/dokos:${CI_COMMIT_TAG}"
      --snapshotMode=redo
  ##  SI le TAG commence par "dokos" .. alors action
  rules:
    - if: '$CI_COMMIT_TAG =~ /^dokos/'
      when: always
      allow_failure: true
3 « J'aime »

Complément :

  1. Comme on va sûrement utiliser un reverse proxy (traefik ou autre) pour utiliser les conteneurs ainsi créer, il faut aussi penser à définir le ‘hostname’ externe pour que Dokos / Frappe ne se perde pas lors de commandes internes (en particulier la génération des PDFs, autrement les ressources .css ne sont pas au bon endroit …).
    Il faut donc compléter la partie installation par une commande du type : docker compose exec backend bench set-config hostname "https://monsitedoskos.com"

  2. On peut raffiner/simplifier le fichier .gitlab-cy.yml en faisant en sorte de n’avoir pas besoin de dupliquer dans le dépôt du fichier en question la totalité du repository d’origine (frappe/frappe_docker). Pour cela on indique à kaniko de chercher les sources non pas dans le répertoire courant, mais directement dans le dépôt Github (il va les “puller” tout seul comme un grand). Voici le fichier mis à jour de cette façon (et avec un nouvelle version pour Dockdock / Dokos) :

default:
  ## FROM : https://docs.gitlab.com/ee/ci/docker/using_kaniko.html
  ## l.9 : Ajout des codes d'accès au registre (si nécessaire)
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  before_script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json

variables:
  DIR_BASE: "docker-files"
  PAYMENTS_VERSION: "v3.x.x"
  DOKOS_VERSION: "v3.21.0" # https://gitlab.com/dokos/dokos/-/releases
  FRAPPE_BRANCH: "v3.22.0" # https://gitlab.com/dokos/dodock/-/releases
  PYTHON_VERSION: "3.10.5" # https://github.com/frappe/frappe_docker/blob/main/docker-bake.hcl
  NODE_VERSION: "16.18.0" # https://github.com/frappe/frappe_docker/blob/main/docker-bake.hcl

build_docker_dokos:
  stage: build
  script:
    - >-
      APPS_JSON="[{\"url\": \"https://gitlab.com/dokos/payments\",\"branch\": \"${PAYMENTS_VERSION}\"},{\"url\": \"https://gitlab.com/dokos/dokos\",\"branch\": \"${DOKOS_VERSION}\"}]"

      APPS_JSON_BASE64=$(echo ${APPS_JSON} | base64)

      /kaniko/executor
      --context "git://github.com/frappe/frappe_docker.git"
      --dockerfile "images/custom/Containerfile"
      --build-arg "FRAPPE_PATH=https://gitlab.com/dokos/dodock"
      --build-arg "FRAPPE_BRANCH=${FRAPPE_BRANCH}"
      --build-arg "PYTHON_VERSION=${PYTHON_VERSION}"
      --build-arg "NODE_VERSION=${NODE_VERSION}"
      --build-arg "APPS_JSON_BASE64=${APPS_JSON_BASE64}"
      --cache=true
      --destination "${CI_REGISTRY_IMAGE}/dokos:${CI_COMMIT_TAG}"
      --snapshotMode=redo
  ##  SI le TAG commence par "dokos"
  rules:
    - if: '$CI_COMMIT_TAG =~ /^dokos/'
      when: always
      allow_failure: true

nb : c’est le paramètre “–context” qui a été modifé.

  1. A noter : parfois sur mon serveur l’image a du mal à être générée (OOM Kiil), il suffit de relancer le job manuellement kaniko reprend depuis les caches et termine la génération.

  2. L’étape ultime serait d’ajouter un petit script pour récupérer dynamiquement les variables xx_VERSION et xx_BRANCH depuis les dépôts github / gitlab correspondants.

2 « J'aime »