利用Gitlab和Jenkins做CI
編輯推薦: |
本文來自於tencent,,主要介紹了Gitlab和Jenkins的安裝詳情以及相關配置,環境測試等相關內容。 |
利用Gitlab和Jenkins做CI(持續整合)
最近用到持續整合順便總結在這裡,都是用的最新版。搭建過程中還有一個demo,提交程式碼到 gitlab 自動觸發 jenkins 任務,自動編譯程式碼和 docker 映象並上傳。
安裝執行 Gitlab
gitlab 國內安裝很麻煩,用官方的源裝不了,因為在國外,太慢,連結會斷掉。國內清華有 gitlab 的 apt 和 yum 源,但是我試過安裝 CentOS 7 的 gitlab ,到最後都會一直卡住結束不了。直接下載清華 gitlab 的 rpm mirror 安裝也是一樣,所以我還是選擇用 docker 啟動 gitlab(提前配好 docker hub 加速器)
準備映象
準備 gitlab 所需目錄
mkdir gitlab
cd gitlab
mkdir config logs data
準備啟動指令碼 (替換想要的啟動埠,ip 地址替換為訪問你的 gitlab 的地址,也可以替換想要的掛載目錄)
#! /bin/bash sudo docker run -d --rm \ -p 8088:8088 \ --name gitlab \ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://118.24.64.246:8088/'; gitlab_rails['lfs_enabled'] = true;" \ -v $PWD/config:/etc/gitlab \ -v $PWD/logs:/var/log/gitlab \ -v $PWD/data:/var/opt/gitlab \ gitlab/gitlab-ee:latest EOF
賦予執行許可權
啟動 gitlab
檢視 gitlab 控制檯輸出
訪問 gitlab,開啟指令碼中配置的 external_url 地址,設定管理員密碼和註冊 gitlab 賬號,登入並新增自己的 SSH key 。建立 repo ,git clone 到本地,後面我們提交程式碼到這個 repo ,觸發 jenkins 的持續整合。
安裝執行 Jenkins
jenkins 建議直接安裝在宿主機,不用 docker 方式,因為持續整合需要安裝各種我們用到的工具,這些工具可能後面根據需要才安裝,重啟不能讓這些工具丟失。比如編譯 java 原始碼需要裝 jdk 環境,編譯和上傳 docker 映象需要安裝 docker 環境,並且還需要提前 docker login 好,不然上傳不了。
因為 jenkins 用 java 寫的,所以確保機器上裝有 jdk 或 openjdk 環境,準備一個 jenkins 用的目錄,下載 war 包
mkdir jenkins
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
執行
檢視 jenkins 輸出
第一次開啟 jenkins web 介面,要求輸出管理員初始密碼,生成在伺服器上,介面上提示有路徑
檢視密碼
貼上密碼並繼續,安裝推薦的外掛,等待安裝完成
建立管理員,儲存並完成
至此,jenkins 安裝完成
Jenkins 安裝需要的外掛
開啟 Jenkins-系統設定-管理外掛
在可選外掛裡選擇並安裝需要的外掛:Git 、 GitLab 、Build Authentication Token Root (Git外掛在預設推薦外掛裡已安裝,在可選外掛列表裡可能沒有)
點選 “直接安裝”,勾選 “安裝完成後重啟Jenkins(空閒時)“,等待安裝完成自動重啟 jenkins
由於後面 Jenkins 的機器上需要用到 docker,所以保證 jenkins 所在機器安裝好 docker 並 配好 docker hub 的加速器,並且 docker login 登入映象要上傳的倉庫。
Gitlab 建立 repo
我們這裡就以一個簡單的 golang 程式做例項,實現提交程式碼自動編譯程式碼,然後 docker 編譯映象並上傳至 CCR (騰訊雲的 docker 映象倉庫)
在 gitlab 上建立空 repo,clone 到本地,新增三個檔案
main.go (原始碼)
package main
func main() {
println("hello world")
}
Dockerfile (編譯映象用的 Dockerfile)
FROM alpine:latest MAINTAINER roc<[email protected]> COPY bd-ci-test /bin/bd-ci-test CMD ["bd-ci-test"]
build (編譯原始碼、映象和上傳映象的指令碼,替換 IMAGE 地址為要上傳的地址)
#! /bin/bash # 編譯程式碼 docker run --rm \ -v $PWD:/go/src/bd-ci-test \ -w /go/src/bd-ci-test \ golang:alpine go build IMAGE="imroc/bd-ci-test:latest" # 編譯映象 docker build -t $IMAGE . # 上傳映象 (請提前登入好,docker login 只需登入一次) docker push $IMAGE # 清理 docker rmi $IMAGE rm bd-ci-test
給 build 指令碼執行許可權
至此,我們的程式碼準備好了,先不忙提交,接下來配置 jenkins 來做持續整合
配置 Jenkins
新建 jenkins 專案,選擇 “構建一個自由風格的軟體專案”
原始碼管理選 Git,Repository URL 填寫你 gitlab 上原始碼 repo 的地址,Credentials 是拉取程式碼時需要用到的身份認證(如果你的repo不是公有的,沒有身份認證就會報錯)
點選 Add 新增一個, Kind 選擇 “Username with password”,輸入 gitlab 賬號密碼
然後 Credentials 選擇我們剛剛新增的(檢測到賬號密碼正確就不會報錯了),我們準備對 master 分支的程式碼做持續整合,所以 “Branches to build” 填 “*/master”
構建觸發器選擇 “Build when a change is pushed to GitLab” (後面的 URL 是我們需要在 gitlab 上配的 webhook 地址),按照下面勾選
點開高階,“Allowd branches” 勾選 “Filter branches by regex”,填寫 “master”。點 “Generate” 生成 token,這個 token 用於填寫到 gitlab 的 webhook 裡,gitlab 檢測到程式碼提交,會通知 webhook 裡填寫的 Jenkins 生成的回掉 URL,並帶上這個 token,防止其它人觸發 jenkins 的持續整合
注: 複製出 URL 和 token,我們後面配置 gitlab 的 webhook 會用到
增加構建步驟 “execute shell”
由於我們把持續整合的操作都寫到 build 指令碼了,所以直接填寫執行 ./build 就可以了
最後點選儲存,至此,jenkins 的持續整合配置好了,還需要配置 gitlab 的 webhook,用於程式碼提交通知 jenkins。
配置 Gitlab Webhook
開啟 gitlab 的 repo 的 Settings-Integrations
URL 和 Secret Token 填寫 jenkins 專案中構建觸發器部分生成的,點選 “Add webhook”,搞定!
測試
現在我們可以提交程式碼測試一下
git add .
git commit -m "test"
git push
我們可以看 jenkins 的輸出來看是否觸發任務,由於我使用了一些 docker hub 的映象來編譯程式碼和映象,如果沒有提前 pull 下來,第一次執行任務可能會比較久,等待執行結束,重新整理 jenkins 主頁
如果執行成功,從 “上次成功” 下拉選擇 “控制檯輸出”
可以看到執行任務過程的輸出
如果都沒問題,你可以看看你的映象倉庫,映象已經成功上傳,至此,這個簡單的持續整合搭建完畢。
附錄
Git Submodule
如果你的專案裡面還引用了其它專案,也就是 git 的 submodules,怎麼辦?甚至 submodule 裡面還要指定分支呢?
在建立 jenkins 專案的時候,在 原始碼管理-Git-Additional Behaviours-Add 選擇 Advanced sub-modules behaviours
勾選下面兩個選項
submodules 的分支靠 git 本來支援的 .gitmodules 檔案來控制,用法舉例:
檢視 .gitmodules 檔案格式:
$ cat .gitmodules [submodule "ref/req"] path = ref/req url = https://github.com/imroc/req.git branch = v1
可以自己手動編輯或用 git submodule add 命令生成