CI/CD筆記-Jenkins與gitlab實現CICD

1、jenkins與gitlab互聯html

  1. 安裝gitlab相關的插件
  2. 在jenkins服務機器上生成 ssh key
  3. 登錄gitlab配置ssh密鑰-公鑰
  4. 在jenkins上配置到gitlab無交互式拉取代碼
    4.1 jenkins服務器上查看私鑰
    4.2 jenkins控制檯添加私鑰
    gitlab上建立token
  5. 建立任務
    5.1 建立任務- 配置項目git地址- 選擇配置的ssh證書- 當即構建
    5.2 項目倉庫上面配置好了,沒有報錯表示jenkins能夠從gitlab拉取代碼了,點擊當即構建
    5.3 查看控制檯輸出,驗證構建結果
    5.4 去jenkins服務上驗證項目是否pull下來了
    5.5 在jenkins服務器上配置與後端服務器互聯
    5.6 在jenkins上配置構建
    5.7 經過shell命令的方式觸發服務部署步驟【爲了測試效果】
    5.8 查看控制檯輸出
    5.9 訪問服務
    6 建立觸發器
    6.1 代碼倉庫建立測試分支
    6.2 jenkins安裝插件
    6.3 修改全局權限
    6.4 建立一個開發分支的任務
    6.5 生成一個token
    6.6 經過觸發遠程構建的方式構建觸發器
    6.7 驗證觸發器
    6.8 在gitlab上配置觸發器hook
    6.9 gitlab上測試效果

1、jenkins與gitlab互聯
1. 安裝gitlab相關的插件
在可用的插件處搜索gitlab插件java

GitLab、Gitlab Authentication、GitLab Logonode

Blue Ocean 最新版的jenkins已經自動安裝了python

CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD

2. 在jenkins服務機器上生成 ssh key
要想自動化讓jenkins從gitlab上拉取代碼,就須要配置ssh密鑰,這樣驗證時就不用輸入密碼等操做了git

# 若是是鏡像部署jenkins的方式需求進入容器
docker exec -it 容器id /bin/bash
# 建立ssh密鑰
ssh-keygen
# 查看生成的公鑰 ~/.ssh/id_rsa.pub
cat /root/.ssh/id_rsa.pub

bash-5.0# ssh-keygen
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:NELUf0otf4+lY24wF5Lmt/lDCkUWGNJ+EALe+6OIocE root@ab165f23961b
The key's randomart image is:
+---[RSA 3072]----+
|     .oo.o.o+.. |
|     .. o o+ o   |
|     ..oo..+.   |
|       o .=.*o. |
|       So Bo. . |
| .       o.= +..|
|   E .     o.*oB |
|   o o . . ..O..|
|   . . . .   +.oo|
+----[SHA256]-----+
# 查看私鑰
bash-5.0# cat /root/.ssh/id_rsa  
id_rsa     id_rsa.pub  
# 查看公鑰
bash-5.0# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDR3yL8WPCyZ1YdPZ0ndBpxpUZd5sxqpBg8AgsWMt8aYu5tzU7/4XrKMNaDVBHfhWFjgErY7WUhz4ZZtKF0vBdxrwAJFGcE/iytnyWIjm8NA9743osdcdEjkqwhr2g9/UmTh37Dfa1OqdEsecwRFeBu6KFdlFSlcXsaOKESq1QEDf96C+5u4uCavMvZj5PBAw5ekx22NaTWPEmGI/2xygn0yEeWvPrUzkX0M5EE64mczL/O/W/bW1RdvVaUBByvIytNDdQ1vUVvaoA+kR/t77H6jQ8C3Lr4y5SpA4I7pxMX/VSVzd9LhO60Bn8y18E8+hLLPOSEUbxWtS6WJ//pQj63cD7sL+e9nmRSVDwoCoDsCv9Bi0yR0Ub8NyQW+GgofRXdgDrOdR/Gqt4etq7OIIfslga7+TuSwsHARpxpbaenLu0AYYTYXVX4uEYsPLRlj3ebAlaz/0zXCKM9qIEfrCZZ1fm1PcQ5MQwohRA1log/dzegYFQ9ZN3Rd3raMj9g9CM= root@ab165f23961b

3. 登錄gitlab配置ssh密鑰-公鑰
CI/CD筆記-Jenkins與gitlab實現CICDweb

CI/CD筆記-Jenkins與gitlab實現CICD

在jenkins服務器上無需輸入帳密拉取代碼docker

bash-5.0# git clone git@192.168.0.152:makemoney/testproject01.git
Cloning into 'testproject01'...
The authenticity of host '192.168.0.152 (192.168.0.152)' can't be established.
ECDSA key fingerprint is SHA256:LsgUyXjraZbqPdGdwEgGnLHsbsREzqj5JJUmHerQ9oc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.152' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 11, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 11 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (11/11), done.
Resolving deltas: 100% (2/2), done.

4. 在jenkins上配置到gitlab無交互式拉取代碼
jenkins - 系統管理-ManageCredentials - 全局憑據-添加憑據shell

CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD

4.1 jenkins服務器上查看私鑰後端

bash-5.0# cat ~/.ssh/id_rsa
# 而後將其複製到下圖的公鑰中

4.2 jenkins控制檯添加私鑰
CI/CD筆記-Jenkins與gitlab實現CICD安全

CI/CD筆記-Jenkins與gitlab實現CICD

其實憑據也能夠是經過gitlab裏建立的token,來實現jenkins與gitlab互聯的

gitlab上建立token

用戶頭像---setting---access tokens

CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD

還有幾種方式建立憑據

CI/CD筆記-Jenkins與gitlab實現CICD

5. 建立任務
5.1 建立任務- 配置項目git地址- 選擇配置的ssh證書- 當即構建
CI/CD筆記-Jenkins與gitlab實現CICD
CI/CD筆記-Jenkins與gitlab實現CICD
5.2 項目倉庫上面配置好了,沒有報錯表示jenkins能夠從gitlab拉取代碼了,點擊當即構建
CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD

5.3 查看控制檯輸出,驗證構建結果
CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD

5.4 去jenkins服務上驗證項目是否pull下來了
默認拉取的代碼放在目錄中cd /var/lib/jenkins/workspace/,倉庫的代碼放在以之間建立任務名爲目錄名的目錄裏

bash-5.0# cd workspace/testproject-testconnect
bash-5.0# ls -lrt
total 12
-rw-r--r-- 1 root jenkins 21 Nov 29 05:37 index.html
-rw-r--r-- 1 root jenkins 35 Nov 29 05:37 first-test.txt
-rw-r--r-- 1 root jenkins 62 Nov 29 05:37 README.md

5.5 在jenkins服務器上配置與後端服務器互聯

### 首先得讓jenkins與後端服務器無密鏈接

# 生成密鑰,這步剛纔已經作了省略
ssh-keygen
# 將jenkins的公鑰複製到後端預安裝服務的機器上【本地的ssh公鑰文件安裝到遠程主機對應的帳戶下authorized_keys】
ssh-copy-id 遠端服務的ip

[root@python-node01 ~]# ssh-copy-id 192.168.0.150
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.150's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.0.150'"
and check to make sure that only the key(s) you wanted were added.

# 而後測試下ssh登錄,時候須要密碼
ssh 192.168.0.150

5.6 在jenkins上配置構建
構建就是配置腳本或shell命令如何自動將服務部署起來

CI/CD筆記-Jenkins與gitlab實現CICD

5.7 經過shell命令的方式觸發服務部署步驟【爲了測試效果】
CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD

# 腳本內容以下

# 實現jenkins與生產服務器的免密登錄[若是下面這樣寫了,上面就不用手動在jenkins服務器上操做了]
#ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.0.150
# 切換目錄到代碼目錄
cd /var/lib/jenkins/workspace/power-test01
# 打包壓縮代碼
tar czvf code.tar.gz *
# 將代碼拷貝到生產服務器上
scp code.tar.gz root@192.168.0.150:/app/code
# 關閉如今運行的服務
ssh root@192.168.0.150 "PID=\$(ps aux |grep -v grep |grep main.py|awk '{print \$2}');kill -9 \$PID"
# 解包並將代碼複製到部署目錄中
ssh root@192.168.0.150 "rm -rf /app/run/* && cd /app/code && tar xvf code.tar.gz -C /app/run"
# 安裝項目依賴包並運行服務
ssh root@192.168.0.150 "cd /app/run && pip install -r requirements.txt && nohup python main.py >/dev/null 2>&1 &"

5.8 查看控制檯輸出
CI/CD筆記-Jenkins與gitlab實現CICD

5.9 訪問服務
CI/CD筆記-Jenkins與gitlab實現CICD

更新代碼,提交gitlab,而後jenkins點擊任務的構建,服務就被更新了。

6 建立觸發器
前面這種發現仍是不夠方便,開發人員更新代碼後還須要手動操做jenkins構建,感受仍是很麻煩,那麼解決方案就是建立觸發器的方式,即當監控某個分支代碼有變更時自動調用jenkins進行部署

6.1 代碼倉庫建立測試分支

# ide或git操做界面,換到項目中,而後建立分支
cd ~/test-gitlab02/ && git branch dev-20201227 && git add . && git commit -m "test hook"

6.2 jenkins安裝插件
系統管理-管理插件-可選插件-Gitlab Hook和Gitlab Authentication[以前已安裝]

6.3 修改全局權限
修改成全部登錄用戶能夠任何操做

CI/CD筆記-Jenkins與gitlab實現CICD

6.4 建立一個開發分支的任務
首頁-新建任務-輸入任務名-選擇Freestyle project的方式建立

CI/CD筆記-Jenkins與gitlab實現CICD

注:構建的任務job配置文件,在jenkins服務器的以下位置

[root@jenkins power-test01]# ll /var/lib/jenkins/jobs/
總用量 0
drwxr-xr-x 3 root   root    61 12月 27 23:50 power-dev
drwxr-xr-x 3 jenkins jenkins 61 12月 27 20:52 power-test01

6.5 生成一個token
jenkins機器上建立一個token

[root@jenkins power-test01]# openssl rand -hex 12
c8b2faf57578b62cb7b75105

6.6 經過觸發遠程構建的方式構建觸發器
CI/CD筆記-Jenkins與gitlab實現CICD

6.7 驗證觸發器

curl http://192.168.0.153:8080/job/power-dev/build?token=c8b2faf57578b62cb7b75105
# 發現訪問一次dev的任務就構建了一次,實驗成功

6.8 在gitlab上配置觸發器hook
在gitlab上配置觸發器hook,從而實現push代碼是,觸發配置的url,從而聯動jenkins構建部署操做

CI/CD筆記-Jenkins與gitlab實現CICD

本次選擇的是當倉庫有更新事件發生是觸發

CI/CD筆記-Jenkins與gitlab實現CICD

6.9 gitlab上測試效果
test報錯403錯誤時Hook executed successfully but returned HTTP 403,咱們需要進入jenkins 系統設置-Configure Global Security中,關閉(去掉勾選:防止跨站點請求僞造),而後在點擊gitlab webhooks test OK 返回201 成功。

CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD
老版本的jenkins是能夠在安全配置裏直接關閉csrf的,但Jenkins版本自2.204.6以來的重大變動有:刪除禁用 CSRF 保護的功能。

須要修改jenkins配置文件/etc/sysconfig/jenkins

#JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"

# 修改好後重啓jenkins便可
systemctl restart jenkins && systemctl status jenkins

CI/CD筆記-Jenkins與gitlab實現CICD

CI/CD筆記-Jenkins與gitlab實現CICD
再次在gitlab上測試,發現ok了。

CI/CD筆記-Jenkins與gitlab實現CICD

好了,經過Jenkins聯動gitlab實現推送代碼到倉庫就自動部署就到這裏了,我這裏只是管中見豹,Jenkins發佈還有經過pipline流水線方式,設置每步執行的任務,可視圖方式查看每步執行過程,還有Jenkins單點壓力過大,也支持搭建分佈式等等,有不少方式就待咱們一塊兒去探索發現吧……

相關文章
相關標籤/搜索