jenkins實現專案自動部署
背景
之前給公司搭建過一套gitlab+gerrit+jenkins的持續整合環境,由於操作起來有點繁瑣,自己也沒太搞清楚該怎麼用,所以一直就只用了gitlab來做程式碼管理。最近要做一個專案自動部署的功能,使用過jenkins一定知道他的自動化功能。所以就從jenkins建立自動部署任務的方式來入手。
整體思路
jenkins可以配置觸發器,當有新的提交時,觸發執行相應的任務。由於jenkins和專案部署不在同一伺服器上,所以我想用ssh到遠端伺服器後執行對應的部署指令碼來做自動部署。
實現方式
我是按照倒推的思路來完成整個流程的。
1、 自動化部署指令碼
專案是用git管理的,首先指令碼要能夠實現切換到指定目錄下後pull對應的分支。
#! /bin/bash
#切換到專案路徑下
cd ~/coffee/myproject
git checkout -f
git clean -fd
git pull
可以通過接收的引數,來決定切換的專案路徑
#! /bin/bash
#切換到指定目錄
if [ "$1"x = "project1"x ];
then
cd ~/coffee/myproject1
elif [ "$1"x = "project2"x ];
then
cd ~/coffee/myproject2
elif [ "$1"x = "project3"x ];
then
cd ~/coffee/myproject3
else
echo "failed"
exit
fi
git checkout -f
git clean -fd
git pull
2、 遠端執行
首先在本地配置好在jenkins所在的伺服器上可以免登入ssh到要部署的伺服器上:利用ssh-keygen生成公鑰後,貼上到目標伺服器上~/.ssh/authorized_keys檔案中。此時在jenkins伺服器上即可遠端執行更新指令碼/
ssh root@192.168.1.100 "/root/myscript/pull.sh project1"
3、 配置jenkins任務
(1)填寫專案名稱
(2)在原始碼管理的位置,選擇git,在Repository URL裡填寫專案的URL,結果遇到報錯
stdout:
stderr: Permission denied (publickey,keyboard-interactive).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
這種許可權錯誤,一般是因為ssh公鑰沒有新增到git伺服器上。但是這裡需要注意的一點是,需要填寫jenkins使用者下的公鑰。
執行su - jenkins後,發現沒有任何反應。原因是/etc/passwd中的/bin/bash變成了/bin/false。
sudo vim /etc/passwd
將
jenkins:x:103:160:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/false
改為
jenkins:x:103:160:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
這時執行su - jenkins 後可以切換使用者,但是命令提示符的使用者名稱顯示的是
-bash-4.1$
解決方法是在jenkins使用者下的bash_profile新增命令列提示符環境變數
vim ~/.bash_profile
新增
export PS1='[\u@\h \W]\$'
載入修改完的bash_profile:
source ~/.bash_profile
此時前面的使用者名稱提示恢復正常:
[jenkins@localhost ~]$
我在開始安裝jenkins時,使用以下命令生成過公鑰jenkins.pub:
ssh-keygen -C jenkins@163.com
將公鑰新增到gitlab後,仍然報許可權錯誤。此時看到gitlab上新增ssh公鑰說明,生成公鑰需要選擇-t rsa,而ssh-keygen預設使用的加密是dsa。
使用命令
ssh-keygen -t rsa
將新生成的公鑰新增到gitlab伺服器上,
此時可能需要在jenkins伺服器上,切換到jenkins使用者後執行一下:
git ls-remote -h [專案的git地址] HEAD
參考jenkins host key verification failed
之後就不再報許可權錯誤了。
Branch Specifier (blank for ‘any’)填寫自己要響應的分支變化。
(3)構建觸發器選擇
首先需要在jenkins安裝外掛Gitlab Hook Plugin,安裝完之後在構建觸發器就能看到:
Build when a change is pushed to GitLab. GitLab CI Service URL: http://xxx.com/project/myproject1
選中該選項。因為要在有push事件發生時,進行自動部署,因此勾選Build on Push Events。
(4)構建裡選擇增加構建步驟->Execute shell
Command 裡寫遠端執行更新指令碼的命令
ssh root@192.168.1.100 "/root/myscript/pull.sh project1"
(5)可選:如果想要一個失敗的訊息通知,可以在構建後操作裡,增加構建後操作步驟->Email Notification,填寫自己的郵箱即可
點選儲存。
但是此時還沒有配置完,我們需要通過gitlab的web hooks的功能,來讓jenkins接收到push的訊息。
4、 配置web hooks
剛才在構建觸發器裡有一項,裡面提供的地址就是我們要在gitlab的web hooks裡填寫的地址(下面只是我的一個示例地址)
Build when a change is pushed to GitLab. GitLab CI Service URL: http://xxx.com/project/myproject1
填寫完之後,我們的整個自動部署流程就已經可以運行了。自己push一下試試吧。