2 min read

Gitlab simple pipeline

Gitlab pipeline for docker build and deploy

Table of Contents

Info

Here is a simple breakdown of a deployment pipeline which also does quality check using SonarQube

Configure

.gitlab-ci.yml

1
2
3
4
5
6
7
8
9
include:
  - .gitlab/sonarqube.yml
  - .gitlab/docker-build.yml
  - .gitlab/deploy.yml

stages:
  - sonar_analysis
  - build
  - deploy

.gitlab/sonarqube.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
sonarqube-manual-analysis:
  image: sonarsource/sonar-scanner-cli:latest
  stage: sonar_analysis
  cache:
    key: "$CI_COMMIT_REF_NAME"
    paths:
      - .sonar/cache
  script:
    - echo "Starting SonarQube analysis on $CI_COMMIT_REF_NAME branch (manual trigger)."
    - >
      sonar-scanner
      -Dsonar.projectKey=$SONAR_PROJECT_KEY
      -Dsonar.host.url=$SONAR_HOST_URL
      -Dsonar.token=$SONAR_TOKEN
      -Dsonar.sources=.
      -Dsonar.qualitygate.wait="true"
      -Dsonar.projectName=$SONAR_PROJECT_KEY
  allow_failure: true
  rules:
    - if: '$CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "push"'
      when: always

.gitlab/docker-build.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
docker_build:
  stage: build
  image: docker:24.0.5-cli
  script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
    - '[ -n "$CI_COMMIT_TAG" ] && export FINAL_TAG=$CI_COMMIT_TAG || export FINAL_TAG=${CI_COMMIT_BRANCH}-${CI_COMMIT_SHORT_SHA}'
    - docker build -t $CI_REGISTRY_IMAGE:$FINAL_TAG -f Dockerfile .
    - docker push $CI_REGISTRY_IMAGE:$FINAL_TAG
    - echo "DOCKER_BUILD_URL=$CI_REGISTRY_IMAGE:$FINAL_TAG" > build.env
  rules:
    - if: $CI_COMMIT_TAG
      when: always
    - if: '$CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "push"'
      when: always
  artifacts:
    reports:
      dotenv: build.env

.gitlab/deploy.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
deploy_dev:
  stage: deploy
  image:
    name: bitnami/kubectl:latest
    entrypoint: [""]
  needs:
    - docker_build
  variables:
    KUBECONFIG: $DEV_KUBECONFIG
    K8S_NAMESPACE: default
    K8S_DEPLOYMENT_NAME: api-deployment
  script:
    - echo "Set .kube/config"
    - mkdir -p "${CI_PROJECT_DIR}/.kube"
    - echo "$KUBECONFIG" | base64 -d > "${CI_PROJECT_DIR}/.kube/config"
    - export KUBECONFIG="${CI_PROJECT_DIR}/.kube/config"
    - echo "Deploying to Kubernetes cluster..."
    - kubectl config get-contexts
    - kubectl set image deployment/$K8S_DEPLOYMENT_NAME *="$DOCKER_BUILD_URL" -n $K8S_NAMESPACE
    - echo "Deployment updated for $K8S_DEPLOYMENT_NAME in namespace $K8S_NAMESPACE with image $DOCKER_BUILD_URL"
    - kubectl rollout status deployment/$K8S_DEPLOYMENT_NAME -n $K8S_NAMESPACE
  rules:
    - if: '$CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "push"'
      when: on_success