iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
1
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 10

day10_docker08_GitLab-CI-(Multi)Runner

架好gitlab,因為新版的gitlab本身已經有ci了
再來就是用runer去跟ci領任務來解囉

今天分2個部分介紹:
1、Sameer Naik大神的docker-gitlab-ci-multi-runner
2、gitlab官方的runner
https://docs.gitlab.com/runner/
(裡面有很多好康的可以學!!!)

歷史:

以前有gitlab-ci-runner,
但GitLab已經棄用gitlab-ci-runner,轉而採用gitlab-ci-multi-runner(以下簡稱runner)。
gitlab-ci-multi-runner用go寫的,能夠在docker container中跑CI測試。

gitlab-ci,當原始碼commit到repostories時會觸發CI,runner從gitlab-ci抓job下來執行並把結果回傳到gitlab-ci,跑每階段的ci流程
runner:跑每階段的ci流程的script

如果團隊很小,所有角色都可以灌在同一台電腦
runner可以很多個:
-> runner1
user -> (push) -> gitlab(gitlab-ci) -> runner2
-> runner3

說到gitlab-ci,不得不用這個機器人runner,可以幫我們作更多自動化的工作
但這個星星數就比較少了,而且最後一版(1.1.4-7)release日期是2017年1月
後面會介紹官網的runner

  • 下載image
$ docker pull sameersbn/gitlab-ci-multi-runner:latest
  • 下載專案
$ git clone https://github.com/sameersbn/docker-gitlab-ci-multi-runner.git
$ docker run --name gitlab-ci-multi-runner -d --restart=always \
  --volume /srv/docker/gitlab-runner:/home/gitlab_ci_multi_runner/data \
  --env='CI_SERVER_URL=http://git.example.com/ci' --env='RUNNER_TOKEN=xxxxxxxxx' \
  --env='RUNNER_DESCRIPTION=myrunner' --env='RUNNER_EXECUTOR=shell' \
  sameersbn/gitlab-ci-multi-runner:1.1.4-7

雖然專案很舊了,但這個專案也有docker-compose.yml

一定要填的環境變數有

  • CI_SERVER_URL
  • RUNNER_TOKEN
  • RUNNER_DESCRIPTION
    以取得GitLab CI的授權

Deploy Keys

預設在建cointainer時,ssh key會放在 /home/gitlab_ci_multi_runner/data/.ssh
(沒有passphrase)

  • CI jobs是用SSH來clone repositories,所以要產生ssh known hosts文件,
# github.com換成你的gitlab domain name或ip
$ ssh-keyscan github.com | sort -u - ~/.ssh/known_hosts -o ~/.ssh/known_hosts

小弟其實是外行人,雄雄學CI,一堆歷史都不知道
而且DevOps相關工具演變很快,一不小心,說不定已經停更了(結果使用者還不知道)
一個比較好的方式是,依官網文件
https://docs.gitlab.com/runner/
runner可以裝在好多地方呀,跟個人比較有關係的:

  • Install on GNU/Linux manually (advanced)
  • Install on macOS
  • Install as a Docker service
  • Install on Kubernetes

全repositories共用的token:
先到 GitLab -> Admin Area -> Overview -> Runners -> Runner Registration Token

特定repository使用的runner:
進入該repository -> settings -> CI/CD

  • 有了token,在任何連得到gitlab的地方都能跑runner去領job來工作~
    (當然還要遵守ISMS規範,跟~網管大人~ 大發慈悲der放行)
$ sudo gitlab-runner register \
  --url "https://gitlab.example.com/" \
  --registration-token "PROJECT_REGISTRATION_TOKEN" \
  --description "docker-ruby-2.1" \
  --executor "docker" \
  --docker-image ruby:2.1 \
  --docker-postgres latest \
  --docker-mysql latest
$ docker run -itd --name gitlab-runner --restart always \
-rm \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest
  • 或者跑起來後,再進到shell作gitlab-runner register
$ sudo gitlab-runner register
  • 或者安裝gitlab-ci-multi-runner
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-ci-multi-runner

$ sudo gitlab-ci-multi-runner register
# 輸入CI URL、token、runner的名字、runner類型(例如:shell)
--url、--token、--executor

$ sudo gitlab-ci-multi-runner list # 看runner的狀態

# 註冊好的runner資訊
以root執行gitlab-ci-multi-runner register
/etc/gitlab-runner/config.toml

# 以非root執行(設定檔在你的家目錄)
~/.gitlab-runner/config.toml

$ gitlab-ci-multi-runner register --help
  • 或者安裝gitlab-runner
    Linux
# 安裝指令
$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
$ sudo chmod +x /usr/local/bin/gitlab-runner

# 新增一個user
$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# 跑成service
$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
$ sudo gitlab-runner start 

# 更新gitlab-runner:
# 1、停止現有服務
$ sudo gitlab-runner stop
# 2、下載新版的gitlab-runner
$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# 3、設可執行
$ sudo chmod +x /usr/local/bin/gitlab-runner 
# 4、啟用服務
$ sudo gitlab-runner start 

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com

Please enter the gitlab-ci token for this runner
xxx

# 設description,後續可在GitLab變更
Please enter the gitlab-ci description for this runner
[hostame] my-runner

# 設tags,後續可在GitLab變更
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag

Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

Please enter the Docker image (eg. ruby:2.1):
alpine:latest

備註:
如果是macOS,/srv 換成 /Users/Shared

  • 看log
$ docker logs gitlab-runner
  • 安裝信任的憑證
    預設是放在 container 的 /etc/gitlab-runner/certs/ca.crt
    把信任的ca.crt --copy--> /etc/gitlab-runner/certs/

register成功後,且gitlab-runner跑起來後
就能在gitlab的runner看到已註冊的runner

image : microsoft/dotnet:latest
stages:
  - build
before_script:
  - 'dotnet restore'
build:
 stage: build
 script:
  - 'dotnet build'
 only:
   - master

node.js 也是簡單易用
2年前的舊文
node.js的docker的執行環境可找「node dockerfile」
https://about.gitlab.com/2016/03/01/gitlab-runner-with-docker/
https://gitlab.com/gitlab-examples/nodejs/

各程式語言的.gitlab-ci.yml檔
https://github.com/gitlabhq/gitlabhq/tree/master/vendor/gitlab-ci-yml

====

結語:

所以到今天已經介紹2種ci工具囉,要怎麼選擇咧?

jenkins:

  • 如果你是使用其他的版控,如:github
  • 有很完整的plugins
  • 感覺熟java的人會比較喜歡jenkins吧? (maven也java環境的)

gitlab

  • 市佔第2
  • 又能裝在local端
  • 又內建ci
  • ui親切,幾乎是裝好就會用,遇到特殊設定再靠google就好了
    (所以偶才沒有截一堆操作圖)

所以結論是…

若工作需要就都要會

~祝所有IT人工作順心~


上一篇
day09_docker07_GitLab02_下集
下一篇
day11_docker09_AngularTaiwan讀書會[S03E08]CI Pipeline for Angular
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言