【Jenkins使用之五】jenkins集成Gitlab-拉取代碼


【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端口可能被占用等引起。

參考:git多賬號設置免密登錄
git多賬號免密登錄2

附:對於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 相關的觸發有如下三種:

方式一:Generic Webhook Trigger

方式二: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

 

參考:
Jenkins Pipeline+Maven+Gitlab持續集成構建
jenkins集成Gitlab

checkout SCM 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM