背景: 一次偶然的機會看到了其它專案組強大的GitLab流水線, 想起自己每天還要手動打映象做一些重複性工作,瞬間眼紅. 這不就是我想要的流水線嗎.湊巧專案組決定把程式碼遷移到公司的機器上, 那就藉著這個機會把gitlab弄完整吧.
名詞:
- .gitlab-ci.yml
.gitlab-ci.yml
)進行專案配置。它放置在儲存庫的根目錄中,幷包含如何構建專案的定義。關於YAML檔案的書寫格式, 這裡不展開敘述,附上阮一峰老師的YAML教程。詳細.gitlab-ci.yml檔案的書寫可以參考官方教程,以下是我在專案中所用到的簡單配置。image: docker:stable
before_script:
- echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories; echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories
- apk update
- apk add --update git bash
- docker login -u yourName -p yourPas yourDockerIp
stages:
- test
- build_docker
- cleanup_build
test:
stage: test
allow_failure: true
cache:
paths:
- node_modules/
script:
- apk add --update nodejs nodejs-npm
- npm install --registry=http://192.168.130.131:9090
- npm test
only:
- branches
build_docker:
stage: build_docker
retry: 2
script:
- apk add bash
- bash build-docker.sh
only:
- dev
- master
- release
- /^hotfixes-\d.\d.\d$/
cache:
paths:
- node_modules/
cleanup_build_dicker:
stage: cleanup_build
retry: 2
when: on_failure
script:
- CI_COMMIT_REF_NAME=${CI_COMMIT_REF_NAME} bash build-docker.sh
only:
- branches
- dev
- master
- release
複製程式碼
Gitlab-runner是.gitlab-ci.yml
指令碼的執行器,Gitlab-runner是基於Gitlab-CI的API進行構建的相互隔離的機器(或虛擬機器)。GitLab Runner 不需要和Gitlab安裝在同一臺機器上,但是考慮到GitLab Runner的資源消耗問題和安全問題,也不建議這兩者安裝在同一臺機器上。Pipelines
.gitlab-ci.yml
中的不同階段的不同任務。我把Pipelines理解為流水線,流水線包含有多個階段(stages),每個階段包含有一個或多個工序(jobs),比如先購料、組裝、測試、包裝再上線銷售,每一次push或者MR都要經過流水線之後才可以合格出廠。而
.gitlab-ci.yml
正是定義了這條流水線有哪些階段,每個階段要做什麼事。下面我們開始正式安裝
1. 搭建私有GitLab:在這次搭建過程中, 我使用的是ubuntu虛擬機器, 進入虛擬機器一套命令下來之後,也就安裝得差不多了,大部分時間還是在谷歌以及嘗試各種方法 。比較幾個教程之後, 也找到了比較適合我的方法。
for ubuntu
新增 GitLab 映象源並安裝curl -sS http://packages.gitlab.com.cn/install/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce
配置並啟動 GitLab
sudo gitlab-ctl reconfigure複製程式碼
接下來通過域名就可以訪問我們的GitLab了, 第一次訪問會要求初始化管理員密碼, 設定完成之後, 系統會重定向到登入頁面, 預設管理員賬號為root, 登入之後, 就可以修改管理員賬號為自己喜歡的賬號了
2.安裝gitlab-runner
最初安裝時,我選用了官方提供的安裝方法, 一頓操作之後, 發現並不好用(一定是我開啟的方式不對).於是我默默開啟了萬能的谷歌, 最後選擇了安裝gitlab-ci-multi-runner.這裡依然還是一堆命令,默默等待它下載吧.詳細介紹參考這位網友的文章
1.新增Gitlab的官方源:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
2.安裝
sudo apt-get install gitlab-ci-multi-runner
3.註冊
sudo gitlab-ci-multi-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://mygitlab.com/ci
Please enter the gitlab-ci token for this runner
xxx-xxx-xxx
Please enter the gitlab-ci description for this runner
my-runner
INFO[0034] fcf5c619 Registering runner... succeeded
Please enter the executor: shell, docker, docker-ssh, ssh?
docker
Please enter the Docker image (eg. ruby:2.1):
node:4.5.0
INFO[0037] Runner registered successfully. Feel free to start it, but if it's
running already the config should be automatically reloaded!
複製程式碼
在第3步註冊過程中, 會填一些資訊,按提示一直往下走就行了,其中toker可以在我們的gitlab管理員主頁獲得 ip/admin/runners.
配置完成之後, 還需要在頁面底部編輯runner, 將runner 與專案關聯,關聯之後才能執行流水線.
至此, 我們離配置runner還差最後一步:為專案設定runner.進入專案的CI/CD設定介面(Settings => CI/CD => Runners), 找到剛剛關聯好的runner, 啟用即可.
完成這步之後, 專案就可以順利開始跑流水線啦.當專案分支有程式碼更新時, 就能看到我們在.gitlab-ci-yml中定義好的任務當前所處狀態.
遇到的坑:
安裝GitLab時, 遇到錯誤
There was an error running gitlab-ctl reconfigure:
execute[/opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8] (postgresql::enable line 80) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 ----
STDOUT: The files belonging to this database system will be owned by user "gitlab-psql".
This user must also own the server process.
STDERR: initdb: invalid locale settings; check LANG and LC_* environment variables
---- End output of /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 ----
Ran /opt/gitlab/embedded/bin/initdb -D /var/opt/gitlab/postgresql/data -E UTF8 returned 1複製程式碼
在全棧leader的指導下, 修改/etc/default/locale檔案, 新增以下兩行配置重啟之後果然很香.
LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"複製程式碼
還有就是docker in docker 的問題, 在runner中每次都安裝一個docker顯然不太現實, 所以我們用了外部docker的方式, GitLab官方也給出了相應教程.
在安裝過程中, 下載部分資源非常慢, 一定要切換到國內映象源!!!附上中國科技大學的映象源
echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories; echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories
複製程式碼
執行一段時間後, runner會生成非常多image佔滿記憶體, 可以使用docker images檢視當前映象情況.需要清理移除不必要映象.建議增加定時任務,定期清理映象
- 移除映象
docker rmi $(docker images | grep 'dev.k2data.com.cn:5001')複製程式碼
- 定時任務指令碼
#!/bin/sh p=`df / | awk '{print $5}' | grep -Eo '[0-9]+' ` if p > 85; then docker rmi $(docker images | grep 'dev.k2data.com.cn:5001') fi 複製程式碼
備份
gitlab-rake gitlab:backup:create
複製程式碼
總結:
這次的gitlab流水線搭建之旅, 在leader以及幾位運維同事的幫助下, 也算是基本能用了,由於知識面太窄, 過程中大部分時間都在查資料看文件,不斷測試.確實是開卷有益, 想起了高中物理老師說的那句話:"多讀點書總不可能把人讀壞吧".
整個流程弄下來發現並不是太難,命令也不多.但在安裝之前,需要靠自己網上去搜各種教程, 中途也會出現千奇百怪的錯誤,每個步驟都可以單獨出一個教程.我們需要一篇篇看完教程,甄選出最適合自己的.這是最花費時間的地方.另一個比較費時間的點就是測試和安裝依賴, 有時可能會花費1個小時的時間去等待下載, 最後發現,下載失敗,啊哈哈哈哈.