【Jenkins使用之五】jenkins集成Gitlab
環境
CentOS Linux release 7.6.1810
jdk1.8.0_65
apache-tomcat-8.5.45
Jenkins-2.235.5
apache-maven-3.6.3
git-2.9.5
gradle-6.6.1
SonarQube-7.8
sonar-scanner-cli-4.2.0.1873
拓撲:
node1:安裝GitLab、SonarQube
node2:安裝Jenkins、Git、MAVEN
一、SSH key
SSH(Secure Shell Protocol):是一種協議,在進行數據傳輸之前,SSH先對聯機數據包通過加密技術進行加密處理,加密后在進行數據傳輸,確保了傳遞的數據安全。
SSH key即SSH密鑰對,可以讓您方便的登錄到SSH服務器,而無需輸入密碼,也就是免密登錄。SSH 密鑰對總是成雙出現的,一把公鑰,一把私鑰。公鑰可以自由的放在您所需要連接的SSH服務器上,而私鑰保存在客戶端。
1、公鑰和私鑰作用
(1)什么是公鑰登錄
公鑰登錄,很多時候也說public key認證,公鑰登錄的原理:首先用戶將自己的公鑰存儲在需要登錄的遠程機器上面,然后登錄的時候,遠程主機會向用戶發送一段隨機字符串,接着用戶使用自己的私鑰加密字符串,並發給遠程主機。最后,遠程主機使用存儲的公鑰進行解密,若解密成功,則說明用戶可信,准許登錄,不在提示輸入密碼。
備注:
1)服務端會將客戶端發的公鑰寫入到~/.ssh/authorized_keys 文件末尾。
2)公鑰和私鑰在客戶端(登錄端)生成
(2)什么是口令登錄
口令登錄,即登錄的時候需要輸入登錄密碼。
1)客戶端向服務器發出請求
2)服務器將自己的公鑰返回給客戶端;
3)客戶端用服務器的公鑰加密登錄信息, 再將信息發送給服務器;
4)服務器接收到客戶端傳送的登錄信息, 用自己的私鑰解碼, 如果結果正確, 則同意登錄, 建立起連接。
備注:公鑰和私鑰在服務端生成
2、密鑰對的生成
sh-keygen命令,可以生成公鑰和私鑰,默認生成到用戶的家目錄下的.ssh文件夾里面
示例:ssh-keygen -t rsa -C "cac2020@163.com"
私鑰默認會被保存在 ~/.ssh/id_rsa
公鑰默認會被保存在 ~/.ssh/id_rsa.pub
參數解析:
-f 指定要生成文件的文件名稱
-t 設置認定方式,值為rsa,即非對稱加密;或dsa,即數字簽名和認證
-c 指定公鑰中的備注信息。在gitlab里備注一般使用郵箱,因為像gitlab、github等都是通過郵箱來區分的,郵箱僅僅是識別用的key
二、為什么GitLab需要SSH Key
因為GitLab需要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,所以,GitLab只要知道了你的公鑰,就可以確認只有你自己才能推送。另外,CI/CD(服務器環境,不能阻塞態等待輸入)
https開頭的就是用的https了,git@ 開頭的就是用的ssh了.
場景一:不同賬號生成不同SSH Key
(1)打開Git Bash,輸入ssh-keygen -t rsa -C "cac2020@163.com" ,三個回車,沒有輸入密碼,最后在用戶家目錄下找到.ssh目錄
(2)拷貝公鑰里面的內容,粘貼到GitLab-->Settings下面SSH Keys里
(3)配置完成上面操作后,會發現Gitlab里項目地址已經變成了:git@192.168.76.65:sonartest/maven-basic.git SSH的了.
然后到本地項目目錄下Git Bash執行 git config --global credential.helper store,再次pull或者push的時候還要輸入用戶名和密碼,輸入之后 下次就不用再輸入了。注意:如果賬或者郵箱錯誤 可以重新按照以上步驟重新生成。
場景二:同一賬號多個終端生成不同SSH Key
GitLab允許你添加多個Key。假定你有若干電腦,你一會兒在公司提交,一會兒在家里提交,只要把每台電腦的Key都添加到GitLab,就可以在每台電腦上往GitLab推送了。那最好這里-C指定的title最好是主機名來區分。
場景三:一個終端配置多個ssh key
大多數時候,我們的機器上會有很多的git host,比如公司gitlab、github、oschina等,那我們就需要在本地配置多個ssh key,使得不同的host能使用不同的ssh key。以前用github的ssh key,后來工作原因多了一個gitlab的賬號,在綁定gitlab的ssh key時,發現將github的ssh key覆蓋了。怎么同時綁定github和gitlab的ssh key,並不產生沖突呢?技巧是在.ssh目錄下新建一個config文件配置一下,就能解決gitlab與github的ssh key的沖突。
做法如下:問題的關鍵是生成密鑰對的時候需要指定文件
(1)生成公司的GitLab秘鑰ssh key
ssh-keygen -t rsa -C 'yourEmail@xx.com' -f ~/.ssh/gitlab-rsa
(2)生成github秘鑰ssh key
ssh-keygen -t rsa -C 'yourEmail2@xx.com' -f ~/.ssh/github-rsa
(3)登錄ssh-agent 添加添加私鑰
eval `ssh-agent` ssh-add ~/.ssh/id_rsa_github ssh-add ~/.ssh/id_rsa_gitlib ssh-add ~/.ssh/id_rsa_oschina ssh-add ~/.ssh/id_rsa_foxmail
(4)在~/.ssh目錄下新建名稱為config的文件(無后綴名)。用於配置多個不同的host使用不同的ssh key,內容如下:
Host github.com HostName github.com User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_github Host gitlib.com HostName gitlib.com User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_gitlib Host oschina.com HostName oschina.com User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_oschina Host 192.168.1.222 HostName 192.168.1.222 User smallajax@foxmail.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_foxmail # 配置文件參數 # Host : Host可以看作是一個你要識別的模式,對識別的模式,進行配置對應的的主機名和ssh文件 # HostName : 要登錄主機的主機名 # User : 登錄名,填郵箱或者用戶名都可以 # IdentityFile : 指明上面User對應的identityFile路徑
(5)按照上面的步驟分別往gitlab和github上添加生成的公鑰gitlab_id-rsa.pub和github_id-rsa.pub
然后就可以clone、push、pull了,注意在內網、虛機、Docker安裝的Gitlab,可能會出現問題:
git@192.168.76.65: Permission denied (publickey,password,keyboard-interactive). fatal: Could not read from remote repository.
那么宿主機的22端口可能被占用等引起。
附:對於Http協議登錄,git可以記住首次輸入的密碼,后面不再輸入
(1)取消全局用戶名和郵箱設置
git config --global --unset user.name
git config --global --unset user.email
(2)啟用git 認證保存
git config --global credential.helper store
(3)首次pull push clone需要輸入密碼 后面不再輸入
三、jenkins集成Gitlab
1、安裝Git
安裝Git:因為我們需要從GitLab上拉取代碼。
參考:git安裝
2、jenkins安裝GitLab插件
3、配置jenkins訪問Gitlab憑證
這里涉及兩種憑證:
第一個是拉取代碼庫的憑證,這個憑證有多種方式,這里介紹兩種:
(1)配置Username with password類型,使用http協議
ID設立一個簡潔,有含義的名稱,因為后面我們將要在腳本中通過這個id名稱來調用這個賬戶來連接gitlab獲取數據
(2)配置SSH Username with private key類型,使用SSH協議,需要配置免密登錄
#首先在jenkins所在主機node2下生成一對公鑰和私鑰
[root@node2 ~]# ssh-keygen -t rsa -C 'cac2020@163.com' Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:vWziB4fz4ilri49Glp7OHzySj6upKitkQuLRP7DlTaQ cac2020@163.com The key's randomart image is: +---[RSA 2048]----+ | | | . | | . o | |.o o E . . | |+ . *.o S.. | |.+ .+* .+... | |+ +o.= .=+ | |o o+*o+.+o | |Boo+B=*=+o | +----[SHA256]-----+
#然后將公鑰內容加到Gitlab里的SSH keys 見上面 二 部分。
#然后將私鑰加到Jenkins里的憑證里 在項目里使用
第二個是jenkins訪問Gitlab提供的API接口的憑證
Jenkins連接gitlab需要配置access token,所以先在gitlab上生成access token,后將該token配置在Jenkins上。(access token只需配置一次,后續每個工程直接使用即可)
(1)在Gitlab里生成personal access token
(2)在jenkins配置憑證
Credentials配置GitLab API token類型
(3)配置jenkins全局配置
4、項目構建觸發方式-Build Triggers
我們這里項目類型是pipeline流水線類型,這里將兩個常見的觸發類型
4.1 定時觸發
勾選Build periodically,下面配置cron表達式,這個常見。
4.2 webhook觸發事件觸發
就是開發人員隨時開發 隨時發布 隨時測試這種場景,需要GitLab配置webhook。Build Triggers 模塊下配置觸發器,webhook 相關的觸發有如下三種:
方式二:Build when a change is pushed to GitLab. GitLab CI Service URL: http://x.x.x.x:8888/project/project-name
這種方式依賴Gitlab Hook Plugin,GitLab Plugin,Gitlab Authentication plugin插件
如果報錯參考:Hook executed successfully but returned HTTP 403
方式三:Trigger builds remotely (e.g., from scripts)
(1)在Jenkins所在主機生成一個Token,Build Triggers下勾選 Trigger builds remotely (e.g., from scripts),填入Authentication Token(身份驗證令牌)框
[root@node2 repo]# openssl rand -hex 12 9f87e6362bb720f3b7b78121
(2)生成當前jenkins構建用戶的API token,我這里使用的是admin用戶,生成的API Token是119e934834ed454acfb8bbffb244ef9d97
(3)組裝HookURL,配置到GitLab里
格式:http://jenkins用戶名:apitoken@jenkinsURL/job/構建任務名/build?token=(1)步驟中生成的Authentication Token
我這個是:http://admin:119e934834ed454acfb8bbffb244ef9d97@134.32.80.196:8080/job/test3-pipeline/build?token=9f87e6362bb720f3b7b78121
可能產生的問題:問題:Hook executed successfully but returned HTTP 403 (No valid crumb was included in the request)
參考:
Gitlab Jenkins WebHook 持續集成配置踩坑記
Build Triggers
5、拉取代碼
test3-pipeline任務核心就是 pipeline里的配置,這個環節有兩種類型:Pipeline script 和 Pipeline script from scm
示例GitLab項目:項目下面只有一個README.md文件:
5.1 Pipeline script類型
可以使用pipeline聲明式語法,也可以使用腳本式語法。這里用的git命令拉取代碼。
node(){ def workspace = pwd() stage 'checkout' dir('base'){ git credentialsId: 'gitlab-wangjy', url: 'http://192.168.82.46:19527/wjy/citest.git' } sh """ echo $workspace """ } 命令解釋: (1)def workspace = pwd() 此處等同於linux命令行中pwd命令,等於把當前路徑賦值給workspace變量, (2)dir('base') 創建base目錄:用於存放本次從gitlab中拉取的代碼 base目錄絕對路徑是:Jenkins家目錄下/workspace/任務名稱/base,我這里是/data/.jenkins/workspace/test3-pipeline (3)注意這里用到了git命令,所以前面要在jenkins-->Manage Jenkins-->Global Tool Configuration設置Git路徑 (4)credentialsId指上面配置的Gitlab賬戶憑證標識,這里使用的是Username with password類型的憑證,url就選用http類型
查看生成的目錄:
[root@node106 base]# pwd /data/.jenkins/workspace/test3-pipeline/base [root@node106 base]# ll total 4 -rw-r----- 1 root root 26 Sep 10 18:08 README.md
查看任務執行日志:
寫pipeline腳本的技巧,使用Pipeline Syntax自動生成腳本:
5.2 Pipeline script from SCM類型
這種方式使用Jenkinsfile,使用聲明式pipeline腳本,這樣便於構建代碼的版本化管理,這是業界推薦的一種做法。
此選項指示Jenkins從源代碼管理(SCM)倉庫獲取你的流水線配置文件Jenkinsfile,里面是pipeline腳本,這里的倉庫就是你clone到本地的Git倉庫。
(1)首先配置jenkinsfile對應的Git倉庫信息,這里需要說明
(2)編寫Jenkinsfile,這里使用pipeline聲明式語法來編寫
在工程根目錄下新建一個文件Jenkinsfile,因為上面配置的腳本路徑就是:Jenkinsfile,沒有多級目錄:
在Jenkinsfile里編寫如下腳本:
pipeline{ agent any options { ansiColor('xterm') } stages{ stage("代碼下載"){ steps{ script{ sh """ echo 123 """
checkout scm echo "\033[31m 紅任務已執行完成 \033[0m" echo "\033[30m 黑任務已執行完成 \033[0m" echo "\033[32m 綠任務已執行完成 \033[0m" echo "\033[33m 黃任務已執行完成 \033[0m" echo "\033[34m 藍任務已執行完成 \033[0m" echo "\033[35m 紫任務已執行完成 \033[0m" echo "\033[36m 深綠任務已執行完成 \033[0m" echo "\033[37m 白色任務已執行完成 \033[0m" } } } } }
解釋:
ansiColor('xterm'):配置彩色打印信息到控制台;
checkout SCM 可以用來下載git倉代碼; 注意使用Pipeline script from SCM類型 默認會執行 checkout scm,腳本里顯式使用checkout scm會再次拉取一遍代碼
checkout步驟將從源檢出代碼; scm是一個特殊變量,指示checkout步驟克隆觸發此Pipeline運行的特定修訂。
另外在pipeline可以checkout指定版本的代碼,不是用git命令:
stage('get code '){ steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@github.dfc.com:newback/dfc.git']]]) } }
傳統方式執行,打印日志到控制台:
另外可以使用Blue Ocean插件來創建、查看pipeline視圖:
代碼下載目錄清單:
[root@node2 test3-pipeline]# pwd /data/.jenkins/workspace/test3-pipeline [root@node2 test3-pipeline]# tree . ├── Jenkinsfile ├── pom.xml ├── README.MD └── src 1 directory, 3 files