可維護性
廠商交付的原始碼與弱點掃描報告,機關需有獨立的驗證與佈署流程。建議機關建立自動化驗證與佈署流程,並使用工具來管理與掃描系統元件組成與可能弱點。
版本控制 - 建立原始碼管理平台
為讓承辦人員可以收納管理程式碼及自動化部署流程,現行有 GitHub 及 GitLab 平台。因 GitHub 自建(self-hosted)仍須採購 GitHub enterprise 才能使用相應功能;而 GitLab 則提供 Community Edition (CE) 開放原始碼版本,雖有功能上限制,但足夠作為基礎自動化驗證及部署流程,因此以下為使用 GitLab 基礎建置。
為了日後易於維護及升級便利,以下範例步驟使用 Docker 來建立 GitLab 環境作為示範,建議須依照機關環境評估以 Official Linux package 方式安裝部屬或 Docker 方式部屬。
Prerequisite1
- 需安裝 Docker Engine 及 docker compose plugin,請先依據 Linux distribution 安裝對應版本。
- 需有一個外部可存取的 DNS 域名給 GitLab 使用。
- 需至少兩台主機
- GitLab 主機
- GitLab runner 主機
使用 Docker 建立 GitLab 平台2
-
登入 GitLab 主機。
-
以下範例為建立
/srv/gitlab
目錄,也可以建立於任一 user 家目錄。此目錄將使用於 GitLab 設定檔、log 及資料。$ sudo mkdir -p /srv/gitlab
-
建立一個環境變數
$GITLAB_HOME
,稍後安裝步驟會使用到。您也可以考慮增加至$HOME/.bashrc
檔案。$ export GITLAB_HOME=/srv/gitlab
-
建立以下
docker-compose.yml
$ cat ./docker-compose.yml
version: '3.6'
services:
web:
image: gitlab/gitlab-ce:16.7.3-ce.0 # GitLab 版本
restart: always
hostname: 'gitlab.example.com' # 自定義 DNS 域名名稱
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2224 # 由於預設 SSH 使用 22 port,將 GitLab SSH port 設定於 2224,可以自行修改 port
ports:
- '80:80'
- '443:443'
- '2224:22' # 由於預設 SSH 使用 22 port,將 GitLab SSH port 設定於 2224,可以自行修改 port
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
shm_size: '256m' -
使用 docker compose 命令執行 GitLab。
$ docker compose up -d
[+] Running 2/2
✔ Network maowang_default Created 0.1s
✔ Container maowang-web-1 Started -
等待 GitLab container status 從 (health: starting) 變成 healthy。
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
maowang-web-1 gitlab/gitlab-ce:16.7.3-ce.0 "/assets/wrapper" web 58 seconds ago Up 57 seconds (health: starting) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:2224->22/tcp, :::2224->22/tcp
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
maowang-web-1 gitlab/gitlab-ce:16.7.3-ce.0 "/assets/wrapper" web 9 minutes ago Up 9 minutes (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:2224->22/tcp, :::2224->22/tcp -
使用
docker exec
命令取得預設 root user 密碼。初次使用 root 密碼後,24 小時候此檔案會被自動移除,請儲存此密碼或登入後修改 root user 密碼。$ sudo docker exec -it YOUR_GITLAB_CONTAINER_NAME grep 'Password:' /etc/gitlab/initial_root_password
# 範例
$ sudo docker exec -it maowang-web-1 grep 'Password:' /etc/gitlab/initial_root_password
Password: FMPTcFGvs5G......pBs4DFwnZZvjL+4IOJwg= -
預設 admin username 為 root,密碼為前一步驟輸出密碼。
-
登入成功。
使用 Docker 部署 GitLab runner3
-
登入 GitLab runner 主機
-
以下範例為建立
/srv/gitlab-runner/
目錄,也可以建立於任一 user 家目錄。此目錄將使用於 GitLab runner 設定檔。$ sudo mkdir -p /srv/gitlab-runner/
-
於左側欄選單 Admin Area -> CI/CD -> Runner 至 Runner 設定頁面,點選 New Instance runner。
-
填寫 Tags,以下範例為
shared
,勾選 Run untagged jobs 以讓此 runner 無須 tag 讓全部專案使用,並點選 Create Runner。 -
建立 Runner 後,可以取得 Runner token。
-
回到 GitLab runner 主機,使用 docker 註冊此主機為 GitLab runner。需填入以下資訊:
- GitLab instance URL:GitLab 域名
- registration token:步驟 5 所產生的 token
- runner name:自定義
- executor type:
docker
- 預設 GitLab CI/CD job 使用的 Docker image:可自行定義,我這邊使用
ubuntu:latest
image
$ docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
Runtime platform arch=amd64 os=linux pid=7 revision=102c81ba version=16.7.0
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.example.com/
Enter the registration token:
glrt-esyngbD9x4UYBikAHZAV
Verifying runner... is valid runner=esyngbD9x
Enter a name for the runner. This is stored only in the local config.toml file:
[8503d76bcb78]: gitlab-runner-1
Enter an executor: docker+machine, instance, custom, docker-windows, virtualbox, docker-autoscaler, kubernetes, docker, parallels, shell, ssh:
docker
Enter the default Docker image (for example, ruby:2.7):
ubuntu:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml" -
註冊後,會自動生成以下 GitLab runner 設定檔。
$ sudo cat /srv/gitlab-runner/config/config.toml
concurrent = 1 # 同時併發可執行 job 數量,可依據 GitLab runner 主機效能提高 concurrent 數量
check_interval = 0
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-runner-1"
url = "https://gitlab.example.com/"
id = 1
token = "glrt-esyngb...略...BikAHZAV"
token_obtained_at = 2024-01-17T06:33:37Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.docker]
tls_verify = false
image = "ubuntu:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
network_mtu = 0 -
使用 docker 執行 GitLab runner。
sudo docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest -
回到 Runner 頁面,檢視 Runner 狀態為 running。