1、jenkins與gitlab互聯html
1、jenkins與gitlab互聯
1. 安裝gitlab相關的插件
在可用的插件處搜索gitlab插件java
GitLab、Gitlab Authentication、GitLab Logonode
Blue Ocean 最新版的jenkins已經自動安裝了python
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密鑰-公鑰
web
在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
4.1 jenkins服務器上查看私鑰後端
bash-5.0# cat ~/.ssh/id_rsa # 而後將其複製到下圖的公鑰中
4.2 jenkins控制檯添加私鑰
安全
其實憑據也能夠是經過gitlab裏建立的token,來實現jenkins與gitlab互聯的
gitlab上建立token
用戶頭像---setting---access tokens
還有幾種方式建立憑據
5. 建立任務
5.1 建立任務- 配置項目git地址- 選擇配置的ssh證書- 當即構建
5.2 項目倉庫上面配置好了,沒有報錯表示jenkins能夠從gitlab拉取代碼了,點擊當即構建
5.3 查看控制檯輸出,驗證構建結果
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命令如何自動將服務部署起來
5.7 經過shell命令的方式觸發服務部署步驟【爲了測試效果】
# 腳本內容以下 # 實現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 查看控制檯輸出
5.9 訪問服務
更新代碼,提交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 修改全局權限
修改成全部登錄用戶能夠任何操做
6.4 建立一個開發分支的任務
首頁-新建任務-輸入任務名-選擇Freestyle project的方式建立
注:構建的任務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 經過觸發遠程構建的方式構建觸發器
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構建部署操做
本次選擇的是當倉庫有更新事件發生是觸發
6.9 gitlab上測試效果
test報錯403錯誤時Hook executed successfully but returned HTTP 403,咱們需要進入jenkins 系統設置-Configure Global Security中,關閉(去掉勾選:防止跨站點請求僞造),而後在點擊gitlab webhooks test OK 返回201 成功。
老版本的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
再次在gitlab上測試,發現ok了。
好了,經過Jenkins聯動gitlab實現推送代碼到倉庫就自動部署就到這裏了,我這裏只是管中見豹,Jenkins發佈還有經過pipline流水線方式,設置每步執行的任務,可視圖方式查看每步執行過程,還有Jenkins單點壓力過大,也支持搭建分佈式等等,有不少方式就待咱們一塊兒去探索發現吧……