一、Jenkins簡介
在閱讀此文章之前,你需要對Linux、Docker、Git有一定的了解和使用,如果還未學習,請閱讀我前面發布的相關文章進行學習。
1、概念了解:CI/CD模型
CI全名Continuous Integration,啥意思?就是我們經常聽到的持續集成概念。 當開發每天會提交多次代碼到主干上,會做一些重復性的動作時,就可以用持續集成環境來操作。有集成了,就肯定少不了它的好基友,沒錯就是CD。
CD全名是Continuous Deployment,是持續部署。CD還有個小號,交持續交付,英文全稱是Continuous delivery,縮寫也是CD。
CI/CD優點是,重復的工作用自動化來代替、減少時間成本、版本發布時間減短了。現在很多公司都有做持續集成,Jenkins就是一個持續集成的工具,開源的,基於 JAVA語言的。
2、首先咱們先了解下為什么要使用Jenkins??
未使用 Jenkins 部署項目流程
coding -> 代碼管理器(git、svn) -> 編譯 -> 拷貝到目標服務器 -> 構建鏡像 -> 容器化部署 -> 上線成功、訪問
使用 Jenkins 之后 部署項目流程
coding -> Jenkins 自動化部署 -> 上線成功、訪問
看到這里,好處顯而易見,真香系列~~
3、工作流程

ok,看到這里我們步入正題,開始進入正式的學習吧
二、安裝Jenkins與插件
1、拉取jenkins鏡像
[root@hw-81969 ~]# docker pull jenkins/jenkins
2、查看鏡像
[root@hw-81969 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins latest 93d377dce516 2 days ago 441MB
3、運行docker鏡像
[root@hw-81969 ~]# docker run -d -u root -p 1000:8080 -v /jenkins:/var/jenkins_home --name jenkins1 鏡像id
# 然后查看鏡像是否運行起來
4、訪問jenkins http://ip地址:1000/ 開端口別忘了!

5、獲取密碼,根據它的提示到指定目錄尋找,或者通過查看日志獲取,妥善保存
[root@hw-81969 ~]# docker logs 鏡像id

獲取密碼的第二種方法
## 進入容器
docker exec -it [容器名稱] /bin/bash
## 查看密碼
cat /var/jenkins_mount/secrets/initialAdminPassword
## 退出
exit
6、輸入密碼后進入插件選擇的界面,推薦安裝就行
7、設定管理員賬號,這里我們直接用admin賬號


8、我們進入系統管理-->插件管理來安裝我們下方用到的插件
Localization:Chinese(Simplified) 漢化插件
Gitee Plugin 對接gitee的插件
Publish Over SSH 遠程連接訪問的插件
Email Extension 發送郵件插件
NodeJS 構建Vue等項目
Docker Docker插件
Generic Webhook Trigger 觸發構建任務
thinbackup 數據定期備份
等待其安裝完畢,就可以開始使用,默認的站點比較慢,在【高級頁面】更換為這個
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

安裝完成,開始使用!
9、擴展一些會用到的鏈接
# 停止jenkins
url/stop
# 重啟
url/restart
# 重新加載配置文件
url/reload
三、新建任務與配置
新建任務
進入【新建任務】頁面,輸入名稱選擇【構建一個自由風格的軟件項目】,保存。保存之后配置先不用配,進入下一步
Gitee鏈接配置
1、到【系統管理】->【系統配置】配置我們的gitee插件,因為使用的為gitee,用其他的也行,自己選擇。

生成令牌
路徑:在gitee個人頁面->【設置】->【私人令牌】->【生成新令牌】即可。生成完成后記得及時保存,后面不在展示
填充令牌
2、在Jenkins面板點擊【添加】,選擇下圖選項:成功之后記得保存


3、進入【我的視圖】,找到剛新建的任務,進入配置頁面
4、對這個任務的構建進行配置
設置鏡像名稱參數

設置版本

然后點擊【保存】 查看構建

源碼管理
1、進入我們的gitee要部署的倉庫項目的頁面,把地址復制下來,比如:


觸發構建器

配置webHooks
在Gitee官網進入你的項目 -> 右上管理 -> WebHooks -> 添加WebHook

查看

此處應該有鮮花 6️⃣ 6️⃣6️⃣
四、配置遠程服務器連接
我們要用 Pushlish over SSH: 用來連接遠程服務器,作為倉庫服務器。下面開始配置
1、首先進入【系統管理】-> 【系統配置】,往下滑找到【Publish over SSH】,然后點擊新增


成功之后,連接服務器的配置就完成了。
至此,這些是下面各種項目的基礎,需要完成后面項目的部署前四步必不可少!!!
五、配置郵箱通知信息
必要的配置
1、選擇要通知的郵箱,開啟smtp服務,我用的QQ郵箱,點擊生成授權碼保存下來。

2、到【系統管理】->【系統配置】配置我們的郵箱信息,共有3個地方需要填寫




測試!

需要填寫的信息
SMTP服務器: smtp.qq.com
用戶默認郵件后綴 @qq.com
勾選【使用SSL協議】
SMTP端口 465
郵箱整合項目
1、首先呢先在具體任務的【構建后操作】去配置




通用主題模板
${PROJECT_NAME}項目第${BUILD_NUMBER}次構建通知
通用內容模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sansserif">
<tr>
<td>(本郵件是程序自動下發的,請勿回復!)</td>
</tr>
<tr>
<td>
<h2>
<font color="#0000FF">構建結果 - ${BUILD_STATUS}</font>
</h2>
</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">構建信息</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>項目名稱 : ${PROJECT_NAME}</li>
<li>構建編號 : 第${BUILD_NUMBER}次構建</li>
<li>Git版本 : ${GIT_REVISION}</li>
<li>觸發原因: ${CAUSE}</li>
<li>構建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>構建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>項目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
</td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">構建之后的變化</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>歷史變更記錄 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
</ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true,format="Changes for Build #%n\n%c\n",showPaths=true,changesFormat="%a%m",pathFormat="\\t%p\\n"}
</td>
</tr>
<tr>
<td>
<br />
<b><font color="#0B610B">失敗的測試結果</font></b></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td><pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica,
sans-serif">${FAILED_TESTS}</pre>
<br /></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">構建日志</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td><textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG}</textarea>
</td>
</tr>
</table>
</body>
</html>
全局使用模板
修改【系統配置】中默認的郵箱設置可以達到復用效果

六、定期備份數據
Jenkins的所有數據文件都存在文件中,Jenkins備份就是備份JENKINS_HOME目錄。其中 workspace, builds 和 fingerprints目錄是不需要備份的。

1、安裝插件,在【系統管理】下方有【thinbackup】選項

2、內容從至下為備份、恢復、設置。需要設置的地方:


| 時間縮寫 | 等價寫法 | 描述 |
|---|---|---|
| @daily 或 @midnight | 0 0 * * * | 每天午夜0點執行 |
| @hourly | 0 * * * * | 每個整點0分執行 |
| @monthly | 0 0 1 * * | 每月1號的午夜執行 |
| @weekly | 0 0 * * 0 | 每周日午夜執行 |
3、設定完成后點擊save,保存,回到上一界面點擊Backup Now。需要的時候點擊還原備份,點擊restore
七、部署web前端項目
部署web項目有兩種類型,一種是傳統的未工程化構建的html頁面,另一種為使用Vue腳手架等構建的工程化項目,以下的這些都需要把之前的步驟全部完成(第五步看自己情況)咱們先講第一種。
傳統web項目
1、新建我們的任務,這里步驟幾乎與第三章節一致。
2、然后把html文件拷貝到目標服務器即可。


開啟Nginx或者Tomcat服務,就可以運行了。
部署Vue項目
1、需安裝插件,所有用到的插件均在第二步有所介紹
2、然后在【全局工具配置】配置node版本,

3、接下來也需要配置SSH連接遠程服務器,這個方法在第四章節專門講到,請移步
4、配置完畢后,開始新建我們的任務,這里步驟幾乎與第三章節一致,請移步
5、然后我們繼續在這個頁面繼續配置【構建環境】

6、接着開始【構建】,配置項目自動化打包,執行shell命令

cd /var/jenkins_home/workspace/文件目錄 #進入test項目目錄
npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
npm install
npm run build
cd dist
rm -rf 文件名.tar.gz #刪除上次打包生成的壓縮文件
tar -zcvf 文件名.tar.gz * #把生成的項目打包成test方便傳輸到遠程服務器
cd ../
7、最后一步,把文件發到遠程服務器上,在【構建】或者【構建后操作】選擇【send * over ssh】(因為效果是一樣的,二者都可以),類似於部署傳統web項目

SSH相關配置
dist/*.tar.gz
dist
usr/local/nginx/html/
## shell腳本
cd /usr/local/nginx/html # 打開目標文件地址
rm -rf 文件夾名 # 刪除包含目標文件的文件夾
mkdir 文件夾名 # 新建同名文件夾
tar -zxvf 文件名.tar.gz -C 文件夾名/ # 解壓文件到這個文件夾的目錄下
rm -rf 文件名.tar.gz # 刪除壓縮文件
8、這些完成后可以配置郵箱通知功能,看自己的需求~
八、部署SpringBoot項目
因為是java項目,所以我們首先要配置java環境,且用maven打包還要配置maven環境,當然你用其他的打包也行
安裝JDK
1、點擊【系統管理】-> 【全局工具配置】即可進入配置面板

點擊鏈接去輸入賬號與密碼,且用且珍惜~
oracle-02@qq.com
1211WaN!
新增Maven

修改maven鏡像源,改成阿里雲鏡像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
完成后點擊保存即可,這樣我們的jdk與maven就構建完成。 接下來就是連接我們的服務器讓Jenkins能夠做出一些操作,這一步我們第四步已經做過了,[四、配置遠程服務器連接](# 四、配置遠程服務器連接)
部署服務
1、新建任務、對gitee鏈接進行設置,前文有講到,在 [三、新建任務與配置](# 三、新建任務與配置) 這里查看
2、設置maven相關配置,然后保存

需要輸入的命令 保姆級教程......
clean package
pom.xml
3、增加shell命令,自動部署運行

4、填入命令 注意這分為直接運行jar包與運行Docker容器運行兩種類型,分別說明一下
jar包運行方式的腳本
sudo fuser -k -n tcp 項目端口號
cd 生成的jar包目錄
nohup java -jar 文件名 > 日志目錄文件地址 &

Docker容器運行的腳本
使用Docker運行首先需要制作Docker容器,在項目根目錄編寫Dockerfile文件,然后上傳到代碼倉庫
#FROM openjdk:8-jdk-alpine
FROM hub.c.163.com/dwyane/openjdk:8
MAINTAINER qinadu<郵箱地址>
EXPOSE 8080 # 對外暴露的端口
CMD ["--server.port:8080"] # 映射端口
CMD echo "---Docker容器環境配置成功,即將運行---"
copy *.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
CMD echo "---服務開啟成功,訪問端口:8080---"
接着設置maven相關配置,這里與上方不同

clean install -Dmaven.test.skip=true
最后在構建項目中執行shell腳本,保存。

mvn docker:build -t 鏡像別名
echo "當前docker 鏡像:"
docker images | grep 鏡像別名
echo "啟動容器----->"
docker run -d -p --name 容器名 鏡像別名
echo "啟動服務成功!"
5、然后開始構建我們的項目,返回上一步,進入如下頁面開始構建 (Build with Parameters)。
6、改造shell腳本,如果下次構建該項目的時候,docker鏡像和服務已存在,需要先刪除鏡像和服務。
# 先刪除之前的容器
echo "移除之前的容器>>>"
docker ps -a | grep 容器名 | awk '{print $1}'| xargs docker rm -f
# 刪除之前的鏡像
echo "移除之前的鏡像>>>"
docker rmi 鏡像別名
# 構建鏡像
mvn docker:build -t 鏡像別名
# 打印當前鏡像
echo "當前鏡像>>>"
docker images | grep 鏡像別名
# 啟動容器
echo "容器啟動中>>>"
docker run -d -p --name 容器名 鏡像別名
# 打印當前容器
echo "當前容器>>>"
docker images | grep 容器名
echo "啟動服務成功!"
ps:這里的鏡像名之類需要我們設置的也可以使用字符參數代替,字符參數在第三步中的gitee鏈接中就已經設置,怎么用看你自己。格式:
$ImageName:$Version
九、 配置鏡像容器服務
這一步如果項目中不需要搭建自己的鏡像倉庫可以忽略,一般為自己搭建的Harbor私服,這里我使用 阿里雲容器鏡像服務。
創建倉庫
1、創建命名空間

2、創建鏡像倉庫

創建完成后我們就得到了一個倉庫

為倉庫添加 訪問憑證

使用jenkins構建

IMAGE_NAME='registry.cn-beijing.aliyuncs.com/{命名空間}/{倉庫名稱}:web-demo-0.0.1-SNAPSHOT'
echo IMAGE_NAME=$IMAGE_NAME
echo '================當前docker版本=============='
echo `docker -v`
echo '================開始創建鏡像================'
docker build -t $IMAGE_NAME .
echo '================開始推送鏡像================'
docker login --username={阿里雲Registry登錄名} --password={阿里雲Registry登錄密碼} registry.cn-beijing.aliyuncs.com
docker push $IMAGE_NAME
echo '====================OK!================'
拉取鏡像也是同樣操作
IMAGE_NAME='registry.cn-beijing.aliyuncs.com/{命名空間}/{倉庫名稱}:web-demo-0.0.1-SNAPSHOT'
docker pull $IMAGE_NAME
echo '====================OK!================'
參考:

至此,Jenkins集成部署的介紹就告一段落,以上所寫,對於單體 項目而言,足夠日常使用。微服務項目與集成k8s集成請前往視頻學習
