Skip to content
Snippets Groups Projects
Forked from anaee-dev / OpenAdom / openADOM-frontend
62 commits behind the upstream repository.
.gitlab-ci.yml 5.74 KiB
image: docker:stable

# Pour l'utilisation de testcontainers
# https://www.testcontainers.org/supported_docker_environment/continuous_integration/gitlab_ci/
services: &dind_definition
  - name: docker:dind
    alias: docker
    command: ['--tls=false']

variables:
  OPENADOM_DOCK_REG: $CI_REGISTRY/anaee-dev/openadom/frontend
  TRIGGER_PROJECT_NAME: "anaee-dev/openadom/deployment"
  # Instruct Testcontainers to use the daemon of DinD.
  DOCKER_HOST: tcp://docker:2375
  # Improve performance with overlayfs.
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""
  
stages:
  - build_env
  - trigger

.before_script_template: &before_script
  - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  - echo   "Commit Short id = $CI_COMMIT_SHORT_SHA"
  
development:
  stage: build_env
  timeout: 4 hours 00 minutes
  interruptible: true
  tags:
    - stable  # Use stable runner
    - docker  # Use docker runner
  before_script:
    *before_script
  script:
    # $CI_COMMIT_REF_SLUG : Clean special characters and convert to lowercase with hyphens
    - IMAGE_NAME="$OPENADOM_DOCK_REG:$CI_COMMIT_REF_SLUG"
    - IMAGE_NAME_WITH_COMMIT_ID="$IMAGE_NAME-$CI_COMMIT_SHORT_SHA"
    - echo "Docker Image Name         = $IMAGE_NAME "
    - echo "Docker Image Name With ID = $IMAGE_NAME_WITH_COMMIT_ID"
    - echo "Building Docker image     = $IMAGE_NAME"
    - docker build -f docker/Dockerfile -t $IMAGE_NAME .
    - echo  "Pushing Docker image to registry = $IMAGE_NAME"
    - docker push $IMAGE_NAME 
    - docker tag  $IMAGE_NAME $IMAGE_NAME_WITH_COMMIT_ID
    - echo  "Pushing tagged Docker image to registry = $IMAGE_NAME_WITH_COMMIT_ID"
    - docker push $IMAGE_NAME_WITH_COMMIT_ID
  rules:
    # Trigger on 'develop' branch automatically, disable for 'main' and tags, manual for others
    - if: '$CI_COMMIT_REF_SLUG == "develop"'
      when: on_success
    - if: '$CI_COMMIT_REF_SLUG == "main" || $CI_COMMIT_TAG'
      when: never
    - when: manual

preprod:
  stage: build_env
  timeout: 4 hours 00 minutes
  interruptible: true
  tags:
    - stable  # Use stable runner
    - docker  # Use docker runner
  before_script:
    *before_script
  script:
    # $CI_COMMIT_REF_SLUG : Clean special characters and convert to lowercase with hyphens
    - IMAGE_NAME="$OPENADOM_DOCK_REG:$CI_COMMIT_REF_SLUG"
    - IMAGE_NAME_WITH_COMMIT_ID="$IMAGE_NAME-$CI_COMMIT_SHORT_SHA"
    - echo "Docker Image Name         = $IMAGE_NAME "
    - echo "Docker Image Name With ID = $IMAGE_NAME_WITH_COMMIT_ID"
    - echo "Building Docker image     = $IMAGE_NAME"
    - docker build -f docker/Dockerfile -t $IMAGE_NAME .
    - echo  "Pushing Docker image to registry = $IMAGE_NAME"
    - docker push $IMAGE_NAME 
    - docker tag  $IMAGE_NAME $IMAGE_NAME_WITH_COMMIT_ID
    - echo  "Pushing tagged Docker image to registry = $IMAGE_NAME_WITH_COMMIT_ID"
    - docker push $IMAGE_NAME_WITH_COMMIT_ID
  rules:
    # Automatically trigger for 'main' branch
    - if: '$CI_COMMIT_REF_SLUG == "main"'
      when: on_success
    - when: never 

# Production-specific build job that validates 
# semantic version tags and builds Docker images
# Accepted formats : <int>, <int>.<int>, or <int>.<int>.<int>
production:
  stage: build_env
  # Set a reasonable timeout for build process
  timeout: 4 hours 00 minutes
  # Prevent job from being canceled when a new pipeline starts
  interruptible: false
  # Runner tags required for this job
  tags:
    - stable  # Use stable runner
    - docker  # Use docker runner
  before_script:
    *before_script
  script:
    - echo "Validating tag format for $CI_COMMIT_TAG"
    # Check if a tag is provided
    - |
      if [ -n "$CI_COMMIT_TAG" ];  then
        # Validate tag format with grep
        if echo "$CI_COMMIT_TAG" | grep -qE "^[0-9]+(\.[0-9]+){0,2}$" && ! echo "$CI_COMMIT_TAG" | grep -q "\.$"; then
          echo  "Tag format is valid = $CI_COMMIT_TAG"
          echo  "Building Docker image : $OPENADOM_DOCK_REG:$CI_COMMIT_TAG"
          docker build -f docker/Dockerfile -t $OPENADOM_DOCK_REG:$CI_COMMIT_TAG .
          echo  "Pushing Docker image to registry : $OPENADOM_DOCK_REG:$CI_COMMIT_TAG"
          docker push $OPENADOM_DOCK_REG:$CI_COMMIT_TAG
        else
          echo "Invalid tag format = $CI_COMMIT_TAG"
          echo "Tag must be in format : <int>, <int>.<int>, or <int>.<int>.<int>"
          echo "Examples : 1, 1.0, 1.0.0"
          exit 1
        fi
      else
        echo "No tag provided"
        exit 1
      fi
  # Run this job only for tags (not branches)
  only:
    - tags

deployment:
  stage: trigger
  rules:
    - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
      variables:
        TRIGGERED_BY_PARENT: 'true'
        ENV: 'development'
        OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG' # develop branch
        INIT_DB_USER: true
        REMOVE_DB_AND_VOLUMES: true
      when: on_success
    - if: '$CI_COMMIT_REF_SLUG == "main"'  # Preprod Env
      variables:
        TRIGGERED_BY_PARENT: 'true'
        ENV: 'preprod'
        OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG' # main branch
        INIT_DB_USER: true
        REMOVE_DB_AND_VOLUMES: true 
      when: on_success
    - if: '$CI_COMMIT_TAG'  # Production Env
      variables:
        TRIGGERED_BY_PARENT: 'true'
        ENV: "production"
        OA_FRONTEND_VERSION: '$CI_COMMIT_TAG'
        INIT_DB_USER: false
        REMOVE_DB_AND_VOLUMES: false
      when: on_success
    - if: '$CI_MERGE_REQUEST_IID != null' # Do nothing with merge request
      when: never
    - when: manual  # Trigger manually if needed ( Feature Dev branch )
      variables:
        TRIGGERED_BY_PARENT: 'true'
        ENV: "development"
        OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG'
        INIT_DB_USER: true
        REMOVE_DB_AND_VOLUMES: true
  trigger:
    project: '$TRIGGER_PROJECT_NAME'
    branch: main
    strategy: depend