第0章 Jenkins介紹
官方地址:
https://www.jenkins.io/zh/doc/
介紹
1.jenkins是一個開源的持續集成工具,由java語言開發
2.jenkins是一個調度平台,擁有眾多的插件,絕大部分功能都是由插件來完成的
第1章 Jenkins安裝
1.官方網站
https://www.jenkins.io/zh/
https://www.jenkins.io/zh/doc/
2.安裝部署
清華源直接下載rpm包安裝即可,下載地址如下:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
安裝命令如下:
rpm -ivh jdk-8u181-linux-x64.rpm
rpm -ivh jenkins-2.176.1-1.1.noarch.rpm
3.目錄文件說明
[root@jenkins ~]# rpm -ql jenkins
/etc/init.d/jenkins #啟動文件
/etc/logrotate.d/jenkins #日志切割腳本
/etc/sysconfig/jenkins #配置文件
/usr/lib/jenkins #安裝目錄
/usr/lib/jenkins/jenkins.war #安裝包
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins #數據目錄
/var/log/jenkins #日志目錄
4.配置使用root賬戶運行
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
5.啟動jenkins
systemctl start jenkins
6.解鎖Jenkins
7.修改admin密碼
8.使用清華源作為插件地址
清華源地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
配置步驟:
9.使用離線安裝插件
我們可以將插件提前下好,然后只需要解壓到jenkins對應的目錄即可
tar zxf jenkins_plugins.tar.gz -C /var/lib/jenkins/
ll /var/lib/jenkins/plugins/
重啟jenkins:
systemctl restart jenkins
第2章 構建自由風格的項目
1.創建新任務
2.添加構建步驟
3.點擊立即構建
4.查看控制台輸出
第3章 發布gitlab中的靜態項目
1.gitlab導入工程
這是一個h5小游戲的項目,項目地址:
https://gitee.com/skips/game.git
使用gitlab直接導入項目:
2.在jenkins中關聯gitlab的h5game項目
2.1 創建新項目
2.2 填寫倉庫地址
選擇源碼管理,然后填寫gitlab倉庫信息,但是我們發現報錯了,因為jenkins沒有拉取gitlab項目的權限。
3.配置jenkins訪問gitlab的權限
3.1 部署公鑰解釋和步驟
解釋
1.如果我們想讓jenkins從gitlab上拉取代碼,那么需要將jenkins的公鑰信息放在gitlab上。
2.gitlab針對這種情況有一個專門的功能,叫做部署部署公鑰。
3.部署公鑰的作用是不需要創建虛擬用戶和組,直接在需要拉取的項目里關聯部署公鑰即可。
步驟
1.獲取jenkins公鑰信息
2.將jenkins公鑰信息填寫到gitlab的部署公鑰里
3.由項目管理員操作,在需要jenkins拉取的項目里關聯部署公鑰
4.jenkins配置私鑰憑證,部署項目時關聯憑證
3.2 獲取jenkins服務器的SSH公鑰信息
[root@jenkins-201 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCg8+DQFOjR+gl1Xw83CIyGJ50vI4DBeTaMRFdu5+5pT/IMnYq1iS7/lRS6JxXLYvVeNMDUfDxA1sOL70okyA3npjASXgJPGE1FsbpqzWjsN0TAGoZkR1VWuP9Yn0CrH7dA4lhZQfUUVjvqzFBZK8N9iZMzIu6KOiSY/aD4Ol59vbDS4kO0rTG1DYQNnjZzMPNlIiJ+0EVkfuYRwABRFA8fmL+6btqZqhjGY29EHuIfzIMTDTysrtCTGxQn2ql1zwjReGiNXzmFncwvyy92DAuMbnOQiE1YNn72wThy2oWSHsCwKdIvcNHqY2xBvFnkZ9Ltga7PgR33kbJ7Gl8tjiZF root@jenkins-201
3.3 gitlab添加部署公鑰
3.4 gitlab項目關聯部署公鑰
3.5 jenkins配置私鑰憑證
3.6 測試獲取代碼
查看拉取的代碼:
[root@jenkins-201 ~]# ll /var/lib/jenkins/workspace/h5game
總用量 16
drwxr-xr-x 4 jenkins jenkins 47 8月 6 09:37 game
-rw-r--r-- 1 jenkins jenkins 9349 8月 6 09:37 LICENSE
-rw-r--r-- 1 jenkins jenkins 937 8月 6 09:37 README.md
4.編寫部署腳本
#創建目錄
mkdir -p /scripts/jenkins/
#編寫腳本
cat > /scripts/jenkins/deploy.sh << 'EOF'
#!/bin/bash
PATH_CODE=/var/lib/jenkins/workspace/h5game/
PATH_WEB=/usr/share/nginx
TIME=$(date +%Y%m%d-%H%M)
IP=10.0.0.7
#打包代碼
cd ${PATH_CODE}
tar zcf /opt/${TIME}-web.tar.gz ./*
#拷貝打包好的代碼發送到web服務器代碼目錄
ssh ${IP} "mkdir ${PATH_WEB}/${TIME}-web -p"
scp /opt/${TIME}-web.tar.gz ${IP}:${PATH_WEB}/${TIME}-web
#web服務器解壓代碼
ssh ${IP} "cd ${PATH_WEB}/${TIME}-web && tar xf ${TIME}-web.tar.gz && rm -rf ${TIME}-web.tar.gz"
ssh ${IP} "cd ${PATH_WEB} && rm -rf html && ln -s ${TIME}-web html"
EOF
#添加可執行權限
chmod +x /scripts/jenkins/deploy.sh
也可以使用jenkins內置的變量來代替自定義變量,查看jenkins內置變量的地址如下:
http://10.0.0.201:8080/env-vars.html
4.jenkins調用構建腳本
在構建的位置填寫執行shell腳本的命令
然后立即構建,發現報錯了,提示權限不足:
報錯原因是因為jenkins是以jenkins用戶運行的,所以提示權限不足,我們可以修改jenkins為root用戶運行。
[root@jenkins-201 ~]# vim /etc/sysconfig/jenkins
[root@jenkins-201 ~]# grep "USER" /etc/sysconfig/jenkins
JENKINS_USER="root"
[root@jenkins-201 ~]# systemctl restart jenkins
重啟好之后我們重新構建一下:
查看一下web服務器的代碼目錄
[root@web-7 ~]# ll /usr/share/nginx/
總用量 0
drwxr-xr-x 3 root root 50 8月 6 10:13 20200806-1013-web
lrwxrwxrwx 1 root root 17 8月 6 10:13 html -> 20200806-1013-web
第4章 監聽gitlab自動觸發構建
1.jenkins項目里添加構建觸發器
2.gitlab添加webhook
將剛才jenkins里配置的token和URL地址復制進去
較新版本的gitlab此時點擊添加會提示報錯:
解決方法:進入admin area區域,然后點擊setting-->network進行設置
正常添加成功之后,會在下方出現測試的選項
選擇push事件來測試是否可以正常出發,如果可以,會在頁面上方顯示200狀態碼
此時我們去查看jenkins項目頁面,就會發現以及出發了來自gitlab的構建任務
第5章 返回構建狀態給gitlab
1.gitlab生成access token
點擊創建之后會生成一串token,注意及時保存,因為刷新就沒有了
2.jenkins配置gitlab的token
點擊jenkins的系統管理-->系統設置,然后找到gitlab選項
填寫gitlab的信息:
點擊添加后返回上一層頁面,然后選中剛才添加的gitlab憑證
3.設置項目構建后將結果通知給gitlab
4.合並分支然后檢查gitlab能否收到消息
5.防止重復構建
jenkins具有很多內置變量,點擊項目-->構建--> 查看 可用的環境變量列表
http://10.0.0.201:8080/env-vars.html/
這里我們使用兩個變量,一個是此次提交的commit的hash,另一個是上一次提交成功的commit的hash
我們可以在部署腳本里添加一行判斷,如果這兩個變量一樣,那么就不用再次提交了
這些變量不需要在腳本里定義,直接引用即可
第6章 tag方式發布版本
1.給代碼打標簽
首先我們先給代碼打上標簽,然后提交2個版本
v1.0版本:修改代碼,然后發布v1.0版本
git commit -am 'v1.0'
git tag -a v1.0 -m "v1.0 穩定版"
git push -u origin v1.0
git tag
v2.0版本:修改代碼,然后發布v2.0版本
git commit -am 'v2.0'
git tag -a v2.0 -m "v2.0 穩定版"
git push -u origin v2.0
git tag
2.gitlab查看標簽
此時gitlab上可以看到2個標簽
點進去之后可以看到具體標簽名稱
3.jenkins配置參數化構建
jenkins上我們新建一個參數化構建項目
然后配置git的標簽參數:
最后還需要配置一下git倉庫地址,注意需要修改拉取的版本的變量為 $git_version
此時點擊項目的build with parameters就會看到對應的版本號:
然后去jenkins工作目錄下查看是否拉取了對應版本:
/var/lib/jenkins/workspace/my-deploy-rollback
4.優化部署腳本
cat >/scripts/jenkins/deploy_rollback.sh<<'EOF'
#!/bin/bash
PATH_CODE=/var/lib/jenkins/workspace/my-deploy-rollback/
PATH_WEB=/usr/share/nginx
IP=10.0.0.7
#打包代碼
cd ${PATH_CODE}
tar zcf /opt/web-${git_version}.tar.gz ./*
#拷貝打包好的代碼發送到web服務器代碼目錄
ssh ${IP} "mkdir ${PATH_WEB}/web-${git_version} -p"
scp /opt/web-${git_version}.tar.gz ${IP}:${PATH_WEB}/web-${git_version}
#web服務器解壓代碼
ssh ${IP} "cd ${PATH_WEB}/web-${git_version} && tar xf web-${git_version}.tar.gz && rm -rf web-${git_version}.tar.gz"
ssh ${IP} "cd ${PATH_WEB} && rm -rf html && ln -s web-${git_version} html"
EOF
5.jenkins添加執行腳本動作並測試
6.測試發布
然后去web服務器上查看發現已經發布了
[root@web-7 ~]# ll /usr/share/nginx/
總用量 0
lrwxrwxrwx 1 root root 8 8月 6 15:59 html -> web-v2.0
drwxr-xr-x 3 root root 68 8月 6 15:59 web-v2.0
第7章 tag方式回滾版本
1.jenkins配置回滾選項參數
在工程配置里添加選項參數:
在參數化構建里添加2個選項:發布和回滾
此時查看構建頁面就會發現多了選項卡:
2.修改發布腳本增加條件判斷
cat >/scripts/jenkins/deploy_rollback.sh <<'EOF'
#!/bin/bash
PATH_CODE=/var/lib/jenkins/workspace/my-deploy-rollback/
PATH_WEB=/usr/share/nginx
IP=10.0.0.7
#打包代碼
code_tar(){
cd ${PATH_CODE}
tar zcf /opt/web-${git_version}.tar.gz ./*
}
#拷貝打包好的代碼發送到web服務器代碼目錄
code_scp(){
ssh ${IP} "mkdir ${PATH_WEB}/web-${git_version} -p"
scp /opt/web-${git_version}.tar.gz ${IP}:${PATH_WEB}/web-${git_version}
}
#web服務器解壓代碼
code_xf(){
ssh ${IP} "cd ${PATH_WEB}/web-${git_version} && tar xf web-${git_version}.tar.gz && rm -rf web-${git_version}.tar.gz"
}
#創建代碼軟鏈接
code_ln(){
ssh ${IP} "cd ${PATH_WEB} && rm -rf html && ln -s web-${git_version} html"
}
main(){
code_tar
code_scp
code_xf
code_ln
}
#選擇發布還是回滾
if [ "${deploy_env}" == "deploy" ]
then
ssh ${IP} "ls ${PATH_WEB}/web-${git_version}" >/dev/null 2>&1
if [ $? == 0 -a ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ]
then
echo "web-${git_version} 已部署,不允許重復構建"
exit
else
main
fi
elif [ "${deploy_env}" == "rollback" ]
then
code_ln
fi
EOF
3.測試回滾功能
部署v1.0版本
部署v2.0版本:
檢查web服務器當前的版本
[root@web-7 ~]# ll /usr/share/nginx/
總用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:52 html -> web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
然后我們選擇v1.0版本並且選擇回滾操作:
查看控制台顯示回滾成功:
在web服務器上查看發現已經回滾成功:
[root@web-7 ~]# ll /usr/share/nginx/
總用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:56 html -> web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
4.發布新代碼並打標簽測試
修改代碼並發布v3.0:
cd h5game/
echo v3.0 >> index.html
git commit -am 'v3.0'
git tag -a v3.0 -m 'v3.0 穩定版'
git push -u origin v3.0
git tag
jenkins查看並發布3.0版本:

web服務器查看發布情況:
[root@web-7 ~]# ll /usr/share/nginx/
總用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:58 html -> web-v3.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:58 web-v3.0
然后工程選擇回滾到v2.0版本:
再次在web服務器上查看:
[root@web-7 ~]# ll /usr/share/nginx/
總用量 0
lrwxrwxrwx 1 root root 8 8月 6 16:59 html -> web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:51 web-v1.0
drwxr-xr-x 3 root root 68 8月 6 16:52 web-v2.0
drwxr-xr-x 3 root root 68 8月 6 16:58 web-v3.0
第8章 打標簽工程
1.jenkins新建打標簽工程
2.配置參數化構建
3.配置工程的源碼管理
4.配置構建動作
配置命令:
git tag -a $git_newversion -m "$git_newversion 穩定版"
git push -u origin $git_newversion
5.發布新版本並提交到master
echo "v4.0" >> index.html
git add .
git commit -m "v4.0 穩定版"
git push -u origin v4.0
6.jenkins使用打標簽工程來打標簽
查看控制台輸出發現提示沒有權限:
我們需要在gitlab上把deploy key設置允許寫入
然后重新構建
返回到deploy-rollback工程查看可以發現已經生成了新標簽,然后我們開始構建:
在web服務器上查看可以發現新版本已經發布成功了:
[root@web ~]# ll /usr/share/nginx/
總用量 20
lrwxrwxrwx 1 root root 8 5月 13 16:09 html -> web-v4.0
drwxr-xr-x 8 root root 4096 5月 13 16:05 web-
drwxr-xr-x 8 root root 4096 5月 13 15:00 web-v1.0
drwxr-xr-x 8 root root 4096 5月 13 15:00 web-v2.0
drwxr-xr-x 8 root root 4096 5月 13 15:37 web-v3.0
drwxr-xr-x 8 root root 4096 5月 13 16:09 web-v4.0