GitLab CI/CD介紹
GitLab CI的工作流程:
GitLab CI是 GitLab 提供的持續集成服務,只要在你的倉庫根目錄 創建一個.gitlab-ci.yml 文件, 並為該項目指派一個Runner,當有合並請求或者 push的時候就會觸發build。
這個.gitlab-ci.yml 文件定義GitLab runner要做哪些操作。默認有3個默認有3個[stages(階段)]: build、test、deploy。
當build完成后(返回非零值),你會看到push的 commit或者合並請求前面出現一個綠色的對號。這個功能很方便的讓你檢查出來合並請求是否會導致build失敗, 免的你去檢查代碼。
大部分項目用GitLab’s CI服務跑build測試, 開發者會很快得到反饋,知道自己是否寫出了BUG。
所以簡單的說,要讓CI工作可總結為以下幾點:
在倉庫根目錄創建一個名為.gitlab-ci.yml 的文件
為該項目配置一個Runner
完成上面的步驟后,每次push代碼到Git倉庫, Runner就會自動開始pipeline。
配置Runner
詳細的使用說明,請閱讀官方文檔:https://docs.gitlab.com/runner/
安裝GitLab-Runner
#在ubuntu server16.04版本下使用命令即可安裝 $ 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 #創建一個gitlab-ci用戶 $ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash #安裝,並作為服務啟動 $ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
至此,安裝工作完成,接下來需要注冊Runner,來將Runner和Gitlab綁定到一起。
其他系統安裝參考
注冊Runner
- 輸入命令
$ sudo gitlab-runner register
會要求輸入gitlab的url和Token.
查找過程如下:
進入倉庫->settings->CI/CD,找到Runner Settings這一項,點擊Expend,即可在Setup a specific Runner manually
這項中找到。如下:
注意,其他版本位置可能會不同
其中的url和Token就是遮起來的內容,只需要在注冊過程中填入即可。
當這些做完之后啟用命令啟動Runner
$gitlab-runner run
教程上說是使用gitlab-runner
start命令,但我試的時候並沒有生效,但是用了gitlab run
就可以了,建議先使用gitlab-runner start
試一下,不行再用gitlab-runner run
啟動成功后就可以看到,gitlab對應的倉庫下(操作:進入倉庫->settings->CI/CD,找到Runner Settings這一項,點擊Expend,即可在Setup a specific Runner manually
)看到注冊的runner已經在運行了。
注:如果狀態顏色是灰色的表示沒有運行成功,也可以選擇“Pause”和“Remove Runner”
自動化測試
創建.gitlab-ci.yml
.gitlab-ci.yml 介紹
-
.gitlab-ci.yml 用來配置 CI 用你的項目中做哪些操作,這個文件位於倉庫的根目錄。
-
當有新內容push到倉庫后,GitLab會查找是否有.gitlab-ci.yml文件,如果文件存在, Runners 將會根據該文件的內容開始build 本次commit。
.gitlab-ci.yml 使用YAML語法, 你需要格外注意縮進格式,要用空格來縮進,不能用tabs來縮進。
創建.gitlab-ci.yml
因為本人項目基本都是Gradle構建的,Gradle進行單元測試比較簡單,只需要使用gradle test
即可運行所有的單元測試
- 新建一個.gitlab-ci.yml文件,並完成如下內容
stages:
- build
- test
before_script:
- echo "Restoring Packages..."
build_job:
stage: build
script:
- echo "Release build..."
except:
- tags
test_job:
stage: test
script:
- echo "Tests run..."
- cd cds.ci.test
- gradle test
stage翻譯為階段的意思,在構建的過程中,必須要有一個先后順序。最上面的stages配置意思是,先構建階段為build的job,然后再構建階段為test的job,下面build_job和test_job都是job,如果不配置stages,默認為:
stages:
- build
- test
- deploy
推送配置文件
配置好.gitlab-ci.yml文件之后,只要把它加入git后然后推送到遠程倉庫,CI就會開始自動化集成。這樣我們提交代碼到GitLab是在每次提交的后面都會有自動測試的結果
如果失敗了,也可以進入對應的階段,查找錯誤原因。gitlab提供了可視化的界面,非常方便。
代碼審查
安裝Docker
- 由於apt官方庫里的docker版本可能比較舊,所以先卸載可能存在的舊版本:
$ sudo apt-get remove docker docker-engine docker-ce docker.io
- 更新apt包索引:
$ sudo apt-get update
- 安裝以下包以使apt可以通過HTTPS使用存儲庫:
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
- 添加Docker官方的GPG密鑰
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 使用下面的命令來設置stable存儲庫
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 再更新以下apt包索引
$ sudo apt-get update
- 列出可用的版本
$ apt-cache madison docker-ce
- 選取要安裝的特定版本
$ sudo apt-get install docker-ce=<VERSION>
SonarQube介紹
安裝SonarQube
- 獲取postgresql的鏡像
$ docker pull postgres
- 啟動postgresql
$ docker run --name db -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d postgres
- 獲取sonarqube的鏡像
$ docker pull sonarqube
- 啟動sonarqube
$ docker run --name sq --link db -e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar -p 9000:9000 -d sonarqube
- 將sonar-gitlab-plugin-2.1.0.jar添加到docker中的sonarqube容器中
$ docker cp sonar-gitlab-plugin-2.1.0.jar sonarqube:/opt/sonarqube/extensions/plugins
打開http://localhost:9000 點擊login
用戶名密碼均默認為admin
Gradle集成SonarQube
代碼審查可以使用Gradle集成Sonarqube。整體來說,共分為三步:
-
在build.gradle中添加配置,啟動sonarqube插件
-
配置sonar系統認證權限信息,以便將分析結果上傳到sonar中展示;
-
運行分析命令:gradle sonarqube,然后就可以在sonarqube頁面上看到分析結果。
但我們需要在gitlab上進行持續集成,所以我們將gradle sonarqube命令寫入到.gitlab-ci.yml腳本中,在提交代碼到gitlab是執行。
首先對build.gradle進行配置:
buildscript {
repositories {
# 添加庫路徑,實際項目中原來此處可能還有別的庫,在此位置追加。追加庫的位置可能會導致項目報錯(找不到某些依賴的錯誤)
maven { url "http://192.168.109.63:8081/nexus/content/groups/public/" }
}
dependencies {
#在此位置追加一下依賴行
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2"
}
}
plugins {
# plugins段放置位置有要示,放在buildscript段前面會報錯,放到文件最末尾也報錯,緊跟buildscript放置OK
#添加插件信息
id "org.sonarqube" version "2.6-rc1"
}
apply plugin: "org.sonarqube"
subprojects {
sonarqube {
# 如果同時存在src/main/java與src/main/test,則要按以下方式設置,如果沒有單元測試用例目錄test,也可以只填寫src
properties {
property "sonar.sources", "src/main/java"
}
}
}
#配置sonarqube的權限信息
sonarqube{
properties {
property "sonar.host.url", "http://192.168.90.58:9000"
property "sonar.projectName", "${artifactIdParam}"
property "sonar.projectKey", "${artifactIdParam}"
property "sonar.projectVersion", "${versionParam}"
property "sonar.login","admin"
property "sonar.password","admin"
}
}
完成gradle與sonar的集成后,接下來需要編寫.gitlab-ci.yml腳本,增加執行代碼審查的腳本。
code_review
stage: test
script:
- echo "Start reviewing code"
- gradle sonarqube
完成之后提交代碼到gitlab,即可顯示執行結果。
# plugins段放置位置有要示,放在buildscript段前面會報錯,放到文件最末尾也報錯,緊跟buildscript放置OK
plugins {
#添加插件信息
id "org.sonarqube" version "2.6-rc1"
}
#聲明插件
apply plugin: "org.sonarqube"
subprojects {
sonarqube {
# 如果同時存在src/main/java與src/main/test,則要按以下方式設置,如果沒有單元測試用例目錄test,也可以只填寫src
properties {
property "sonar.sources", "src/main/java"
}
}
}
sonarqube{
properties {
property "sonar.host.url", "http://192.168.90.58:9000"
property "sonar.projectName", "${artifactIdParam}"
property "sonar.projectKey", "${artifactIdParam}"
property "sonar.projectVersion", "${versionParam}"
property "sonar.login","admin"
property "sonar.password","admin"
}
}
至此gradle集成SonarQube完成,接下來需要編寫腳本並上傳
編寫.gitlab-ci.yml
在剛才的自動化測試腳本里追加如下內容:
code_review:
stage: test
script:
- echo "Start reviewing code"
- gradle sonarqube
這樣在提交代碼到遠程倉庫時即可實現代碼審查。結果如下:
進入項目下就可以看到具體的代碼審查結果
自動化部署
要實現自動部署,需要在.gitlab-ci.yml中指定執行的腳本,與自動化測試類似。
stages:
- deploy
deploy:
stage: deploy
script:
- echo "start deploy....."
only:
- master
tags:
- shell
這里我們只有一個stage是deploy。only指定了只有在master分支push的時候才會被執行。tags是shell,對應了剛才注冊runner的時候的tags。
這是一個最簡單的執行模塊,在實際開發中我們要通過一個shell腳本來將資源自動部署到指定位置。例如修改腳本如下:
stages:
- deploy
deploy:
stage: deploy
script:
- echo "start deploy....."
- deploy
only:
- master
tags:
- shell
其中deploy是編寫的shell腳本,可以實現將要發布的內容自動部署到發布目錄下:
#!/bin/bash
deploy_path="/home/xuda/tomcat8/webapps"
project_path="gitlab_ci_cd_test";
judge_path = "$deploy_path/$project_path"
if [ ! -d "$judge_path" ]
then
project_url="http://XXXXcom/xuda/gitlab_ci_cd_test.git"
git clone $project_path $deploy_path
else
cd $deploy_path
git pull
fi
這個腳本的大意就是,先判斷tomcat的webapps下有沒有gitlab_ci_cd_test文件夾,如果目錄不存在,那么就在webapps文件夾下git clone一個,如果存在了就git pull一個到指定目錄下。這樣就實現了自動部署,我們同樣可以在gitlab的倉庫下看到結果
最后,附上一張gitlab倉庫的項目結構圖
總結
GitLab的持續集成持續部署的功能還是很強大的。因為剛畢業進入這家公司看到他們的持續集成做的非常棒,所以學習了基本的安裝。如果想要完成比較復雜的功能也是完全可以實現的,這時可以結合Shell腳本來操作。因為水平有限,如果有問題可以提出,學習交流。