-
GitLab CI 是預設包含在 GitLab 中的,我們的程式碼使用 GitLab 進行託管,這樣可以很容易的進行整合
-
GitLab CI 的前端介面比較美觀,容易被人接受
-
包含實時構建日誌,容易追蹤
-
採用 C/S 的架構,可方面的進行橫向擴充套件,效能上不會有影響
-
使用 YAML 進行配置,任何人都可以很方便的使用
-
所有 Stages 按順序執行,即當一個 Stage 完成後,下一個 Stage 才會開始
-
任一 Stage 失敗,後面的 Stages 將永不會執行,Pipeline 失敗
-
只有當所有 Stages 完成後,Pipeline 才會成功
-
相同 Stage 中的 Jobs 會並行執行
-
任一 Job 失敗,那麼 Stage 失敗,Pipeline 失敗
-
相同 Stage 中的 Jobs 都執行成功時,該 Stage 成功
docker run --rm -t -i -v /path/to/config:/etc/gitlab-runner --name gitlab-runner gitlab/gitlab-runner register \
--executor "docker" \
--docker-image alpine:3 \
--url "https://gitlab.com/" \
--registration-token "PROJECT_REGISTRATION_TOKEN" \
--description "docker-runner" \
--tag-list "dev" \
--run-untagged \
--locked="true"
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.com/" \
--registration-token "PROJECT_REGISTRATION_TOKEN" \
--executor "docker" \
--docker-image alpine:3 \
--description "docker-runner" \
--tag-list "docker,aws" \
--run-untagged \
--locked="false" \
-
Shared:Runner runs jobs from all unassigned projects
-
Group:Runner runs jobs from all unassigned projects in its group
-
Specific:Runner runs jobs from assigned projects
-
Locked:Runner cannot be assigned to other projects
-
Paused:Runner will not receive any new jobs
concurrent = 1
check_interval = 0
-
concurrent:併發數,0 為無限制。
-
sentry_dsn:與 Sentry 聯動,可以將異常等收集至 Sentry 中。
-
listen_address:暴露出 metrics 供 Prometheus 監控。
-
Shell
-
Docker(本次的分享內容)
-
Docker Machine and Docker Machine SSH(autoscaling)
-
Parallels
-
VirtualBox
-
SSH
-
Kubernetes(推薦)
sudo docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock taobeier/docker /bin/sh
如何實現
-
建立組和使用者,並將使用者加入該組。 使用 groupadd 和 useradd 命令。
-
更新 subuid 和 subgid 檔案, 將新使用者和組配置到 /etc/subgid 和 /etc/subuid 檔案中。 subuid 和 subgid 規定了允許使用者使用的從屬 ID。
-
接下來需要掛載 /sys/kernel/security 為 securityfs 型別可以使用 mountpoint 命令進行測試 mountpoint /sys/kernel/security 如果不是一個掛載點, 那麼使用 mount -t securityfs none /sys/kernel/security 進行掛載。如果沒有掛載成功的話, 可以檢查是否是 SELinux 或者 AppArmor 阻止了這個行為。這裡詳細的安全問題,可以參考 Linux Security Modules (LSM)。
-
接下來允許 dockerd 命令啟動 daemon 即可, dockerd –host=unix:///var/run/docker.sock –host=tcp://0.0.0.0:2375 即可將docker daemon 監聽至 2375 埠。
[[runners]]
name = "docker"
url = "https://gitlab.example.com/"
token = "TOKEN"
limit = 0
executor = "docker"
builds_dir = ""
shell = ""
environment = ["ENV=value", "LC_ALL=en_US.UTF-8"]
clone_url = "http://172.17.0.4"
[runners.docker]
host = ""
hostname = ""
tls_cert_path = "/home/tao/certs"
image = "docker"
dns = ["8.8.8.8"]
privileged = false
userns_mode = "host"
devices = ["/dev/net/tun"]
disable_cache = false
wait_for_services_timeout = 30
cache_dir = ""
volumes = ["/data", "/home/project/cache"]
extra_hosts = ["other-host:127.0.0.1"]
services = ["mongo", "redis:3"]
allowed_images = ["go:*", "python:*", "java:*"]
image: registry.docker-cn.com/taobeier/docker
variables:
DOCKER_DRIVER: overlay2 # overlay2 is best bug need kernel >= 4.2
services:
- name: registry.docker-cn.com/taobeier/docker:stable-dind
alias: docker
stages:
- build
- deploy
build_and_test:
stage: build
tags:
- build
script:
# change repo
#- sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
# 使用預設官方源 apk 耗時 7min 30s. 修改後 耗時 18s
- ping -c 1 docker
- ping -c 1 registry.docker-cn.com__taobeier__docker
- ipaddr
- apk add --no-cache py-pip
# 使用預設耗時 1 min 15s. 修改後耗時 43s
- pip install -i https://mirrors.ustc.edu.cn/pypi/web/simple docker-compose
- docker-compose up -d
- docker-compose run --rm web pytest -s -v tests/test_session.py
deploy:
image: "registry.docker-cn.com/library/centos"
stage: deploy
tags:
- deploy
script:
# install ssh client
- 'ssh-agent || (yum install -y openssh-clients)'
# run ssh-agent
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
# create ssh dir
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
# use ssh-keyscan to get key
- ssh-keyscan -p $SSH_PORT $DEPLOY_HOST >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
# - ssh -p $SSH_PORT $DEPLOY_USER@$DEPLOY_HOST ls
- rm -rf .git
- scp -r -P $SSH_PORT . $DEPLOY_USER@$DEPLOY_HOST:~/we/
-
建立 service 容器(已經配置在 service 中的映象)
-
建立 cache 容器(儲存已經配置在 config.toml 的捲和構建映象的 Dockerfile)
-
建立 build 容器 並且 link 所有的 service 容器
-
啟動 build 容器 並且傳送 job 指令碼到該容器中
-
執行 job 的指令碼
-
檢出程式碼:/builds/group-name/project-name/
-
執行 .gitlab-ci.yml 中定義的步驟
-
檢查指令碼執行後的狀態碼,如果非 0 則構建失敗
-
移除 build 和 service 容器
{
"auths": {
"registry.example.com": {
"auth": "5oiR5piv5byg5pmL5rab"
}
}
}
services:
- name: registry.docker-cn.com/taobeier/docker:stable-dind
variables:
DOCKER_HOST: "tcp://registry.docker-cn.com__taobeier__docker:2375"
services:
- name: registry.docker-cn.com/taobeier/docker:stable-dind
alias: docker