目標:當有代碼提交到了gitlab以后,自動部署新的代碼。
1 準備工作
1.1 漢化(如果安裝好就已經是中文了,跳過這一步)
manage jenkins -> manage plugins ->可選插件 -> 搜索 locale -> 直接安裝
ps: 插件如果搜不到,表示你已經安裝了。
安裝完成后去配置:
manage jenkins ->Configure system
1.2 安裝git和gitlab插件
- manage jenkins -> manage plugins ->可選插件
- 分別搜索git和gitlab,如果沒搜到表示已經裝好了,在 已安裝 里能找到。
- 安裝
1.3 配置gitlab 插件
-
manage jenkins ->Configure system -> 填寫gitlab配置 ->保存
image.png
1.4 配置git插件
-
manage jenkins ->Configure system -> 填寫git plugin配置 ->保存
image.png
1.5 jenkins的服務器的sshkey需要添加到gitlab
- 在jenkins生成key:
ssh-keygen -t rsa -C "your.email@example.com" -b 4096
這里需要注意,如果你jenkins啟動用戶不是root,則需要用你的啟動用戶去生成key。
- 拷貝到gitlab
1.5 安裝jenkins的服務器需要安裝git:
yum install git
1.6 安裝jenkins的服務器需要安裝maven:
- 官網下載
- 解壓
- 配置環境變量
- 驗證是否成功
[root@kvm15 ~]# mvn -version
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00)
Maven home: /home/maven/apache-maven-3.6.1
Java version: 1.8.0_151, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_151/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.17.1.el7.x86_64", arch: "amd64", family: "unix"
[root@kvm15 ~]#
2 創建jekins job
2.1 拉代碼
起一個任務名字
填寫描述和git相關信息
我們保存,然后構建一下,查看工作日志:
大概可以看出來,jenkins把代碼clone到了指定的工作目錄下,可以去工作目錄核實一下:
[root@kvm15 lib]# cd /var/lib/jenkins/workspace/deploy_merchat_open_api
[root@kvm15 deploy_merchat_open_api]# ls
pom.xml README.MD src
2.2 打包
在 構建 下新建一個execute shell命令,命令為打包:
mvn package -Dmaven.test.skip=true -f pom.xml
保存,構建。
這個時候你會發現構建失敗了,找不到mvn命令。 其實是因為jenkins沒有使用系統的環境變量,需要單獨配置環境變量(配置一次以后,所有job共用。)。在manage jenkins ->Configure System ->全局屬性:
在此構建,已經成功,并且已經生成了可運行jar包(因為我是springboot項目):
pom.xml README.MD src target
[root@kvm15 deploy_merchat_open_api]# ls target/
classes generated-sources maven-archiver maven-status merchant-open-api-1.0.0.RELEASE.jar merchant-open-api-1.0.0.RELEASE.jar.original
[root@kvm15 deploy_merchat_open_api]#
2.3 推到遠程服務器
用scp命令把可運行的jar包推到應用服務器。我這里只有一臺機器,所以就用cp命令拷貝到指定目錄下模擬推送到別的服務器。
2.4 重啟
我們還需要判斷一下是否有進程再殺進程,否則當沒有進程的時候,執行kill命令會報錯,完整的腳本:
mvn package -Dmaven.test.skip=true -f pom.xml
cp ./target/merchant-open-api-1.0.0.RELEASE.jar /home/exter/merchant/war/
pid=$(ps -ef|grep merchant-open-api|grep -v grep|cut -c 9-15|xargs)
if [ "$pid"x = ""x ]; then
echo "no old pid"
else
kill -9 $pid
echo "$pid been killed"
fi
nohup java -jar /home/exter/merchant/war/merchant-open-api-1.0.0.RELEASE.jar -Xms256m -Xmx256m --spring.profiles.active=test &
構建的日志看出已經成功:
去目錄查看jar包,創建時間是剛剛:
[root@kvm15 deploy_merchat_open_api]# ll /home/exter/merchant/war/
total 35908
-rwxrwxrwx 1 root root 36768901 May 21 15:48 merchant-open-api-1.0.0.RELEASE.jar
但是。。。卻沒有進程:
[root@kvm15 deploy_merchat_open_api]# ps -ef|grep merchant
root 14575 13172 0 15:55 pts/1 00:00:00 grep --color=auto merchant
這其實是我把jenkins和應用弄在了一臺上面引起的,不推薦這么做。 官方也有這個問題的描述:
https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
其實就是jenkins默認會清理job產生的子進程,避免留下太對僵尸進程。解決方案是設置一下build_id:
或者
啟動jenkins的時候禁用該功能:
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
如果只是手動觸發的話,到此就可以了。當我們需要自動的持續集成環境的時候,需要用到自動觸發構建:比如定時(每天自動拉一下代碼部署)或者每次有代碼提交到代碼倉庫就自動部署一次。
2.5 設置代碼提交時觸發構建
構建觸發器:
- 觸發遠程構建 (例如,使用腳本):暴露一個帶token的url,訪問該url則觸發構建。
- Build after other projects are built:指定在一個別的job之后觸發。
- Build periodically : 周期性觸發,比如 :每個月第一天觸發。
- Build when a change is pushed to GitLab. :當有代碼push到git上觸發,利用了git的hook
- GitHub hook trigger for GITScm polling:通過github的hook觸發
- Poll SCM:定期檢查,如果有更新則觸發,沒有則不觸發。
我們這里選擇用git的hook觸發:
當push事件發生或者accepted merge request 事件發生時觸發。