Skip to content

ShungYang/gitlab

Repository files navigation

DevSecOps use GitLab

  • 使用 docker-compose 執行 GitLab, 並且運行 GitLab Runner 作為 Continuous integration / Continuous Deployment (CI/CD) 工具
  • 目的是為了實現 DevSecOps , 我在 pipeline 定義了幾 4 個 stages 如下
    • build : 使用 Docker Executor 去 build docker image
    • scan : 使用 Docker Executor 整合使用 SonarQube 做程式碼的安全性分析, 詳細可參考說明文件.gitlab-ci.yml
    • publish : 使用 Docker Executor 把之前在 build stage 打包好的 docker image publish 到 Nexus docker registry 上.
    • deploy : 在欲運行 docker container service 的 host 上 install gitlab runner 註冊為 Shell Executor 來運行容器服務.

GitLab Runner

GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline.

GitLab Runner 有許多種安裝方式, 只要 OS 能編譯 Go GitLab Runner 那就能運作, 我選擇的方式是將 GitLab Runner 作為 Docker container 的方式運行, 好處如下:

  • 運行方便且容易.
  • 擴展容易, 如果有許多 jobs 要執行, Runner 會需要水平擴充來執行排隊中的 jobs.

另外也可以部屬在 Kubernetes 群集中.

The scope of runners

能使用的 Runners 可以分為以下三種:

  • Shared runners : 所有的 groups 和 projects.
  • Group runners : 在 group 中的所有 projects 和 subgroups.
  • Specific runners : 專屬於某個指定的 projects.

Install the Docker image and start the container

先確定 host system 已經安裝了 docker, 由於我將 gitlab-runner 運行在 Docker container 中, 為了不要在 container 重啟時導致 gitlab-runner 的設定消失, 我們需要替 gitlab-runner 掛載 docker volume.

首先建立 volume gitlab-runner-config

docker volume create gitlab-runner-config

接著將運行 gitlab-runner 運行在容器中

docker run -d --name gitlab-runner-docker --restart always \
    --env TZ=Asia/Taipei \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v gitlab-runner-config:/etc/gitlab-runner \
    gitlab/gitlab-runner:ubuntu-v14.9.1

當 gitlab-runner-docker 運行後, 可以進去看看其實容器的環境中是沒有安裝 docker 的

docker exec -it gitlab-runner-docker /bin/bash

Get the logs

docker logs gitlab-runner-docker

Register the runner

接下來的步驟是讓 gitlab-runner 向 GitLab server 進行註冊的動作, 這樣當 GitLab server 有 pipline 要運行時, 才能分配其中的 job 給 gitLab-runner.

透過 docker exec -it 運行註冊指令 gitlab-runner register

docker exec -it gitlab-runner-docker gitlab-runner register

而在註冊的過程中 gitlab-runner 會定義 executor, 一個 executor 代表 job 被執行的環境, 而 runner 實作了許多不同的 Executors 來滿足不同的 job 使用情境, 整個 Pipeline 我會使用兩種 Executor 分別是 Docker Executor 和 Shell Executor, 進一步的說明和設定可以參考連結.

note. 一個 Runner 可以被 register 多次, 或多種 Executor.

在註冊成功後就可以在 GitLab server 上看到該 Runner 為 Online 的狀態. 另外這些設定會寫入到先前綁定的 volume 下的 : /data/docker/volumes/gitlab-runner-config/_data/config.toml

我們還需要針對 Docker Executor 在 config.toml 中加入一個環境變數:

  • DOCKER_AUTH_CONFIG : 讓我們可以在 Docker Executor 中能存取 Nexus docker registry 中的 image.

Update configuration

每一次更改了 config.toml 後需要重啟 Runner 套用變更.

docker restart gitlab-runner-docker

Upgrade gitlab-runner version

也相當的方便, 只要停止正在運行的 gitlab-runner-docker, 並以新版的 gitlab-runner image 重新啟動即可.

docker stop gitlab-runner && docker rm gitlab-runner

Reference Link

Enjoy!