Jenkins持續集成與部署


一、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、工作流程

image-20210917081605144

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/ 開端口別忘了!

image-20210917103713466

5、獲取密碼,根據它的提示到指定目錄尋找,或者通過查看日志獲取,妥善保存

[root@hw-81969 ~]# docker logs  鏡像id

image-20210917103950705

獲取密碼的第二種方法

## 進入容器
docker exec -it  [容器名稱] /bin/bash

## 查看密碼
cat /var/jenkins_mount/secrets/initialAdminPassword

## 退出
exit

6、輸入密碼后進入插件選擇的界面,推薦安裝就行

7、設定管理員賬號,這里我們直接用admin賬號

image-20210917111759872

image-20210917111857577

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

image-20210917133401408

安裝完成,開始使用!

9、擴展一些會用到的鏈接

# 停止jenkins
url/stop
# 重啟
url/restart
# 重新加載配置文件
url/reload

三、新建任務與配置

新建任務

進入【新建任務】頁面,輸入名稱選擇【構建一個自由風格的軟件項目】,保存。保存之后配置先不用配,進入下一步

Gitee鏈接配置

1、到【系統管理】->【系統配置】配置我們的gitee插件,因為使用的為gitee,用其他的也行,自己選擇。

image-20210918084258782

生成令牌

路徑:在gitee個人頁面->【設置】->【私人令牌】->【生成新令牌】即可。生成完成后記得及時保存,后面不在展示

填充令牌

2、在Jenkins面板點擊【添加】,選擇下圖選項:成功之后記得保存

image-20210918091337425

image-20210918091519190

3、進入【我的視圖】,找到剛新建的任務,進入配置頁面

4、對這個任務的構建進行配置

設置鏡像名稱參數

image-20210918092914843

設置版本

image-20210918092950407

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

image-20210918093257952

源碼管理

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

image-20210919091633790

image-20210918095701897

觸發構建器

image-20210918100651527

配置webHooks

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

image-20210918101704982

查看

image-20210918102526137

此處應該有鮮花 6️⃣ 6️⃣6️⃣

四、配置遠程服務器連接

我們要用 Pushlish over SSH: 用來連接遠程服務器,作為倉庫服務器。下面開始配置

1、首先進入【系統管理】-> 【系統配置】,往下滑找到【Publish over SSH】,然后點擊新增

image-20210918221427854

image-20210918221541551

成功之后,連接服務器的配置就完成了。

至此,這些是下面各種項目的基礎,需要完成后面項目的部署前四步必不可少!!!


五、配置郵箱通知信息

必要的配置

1、選擇要通知的郵箱,開啟smtp服務,我用的QQ郵箱,點擊生成授權碼保存下來。

image-20210920151705038

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

image-20210920154434440

image-20210920154655771

image-20210920154957178

image-20210920155237798

測試!

image-20210920155354168

需要填寫的信息

SMTP服務器:	smtp.qq.com
用戶默認郵件后綴	@qq.com
勾選【使用SSL協議】
SMTP端口	465

郵箱整合項目

1、首先呢先在具體任務的【構建后操作】去配置

image-20210920163416594

image-20210920163739984

image-20210920163931090

image-20210920165119096

通用主題模板

${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>項目名稱&nbsp;:&nbsp;${PROJECT_NAME}</li>
                    <li>構建編號&nbsp;:&nbsp;第${BUILD_NUMBER}次構建</li>
                    <li>Git版本&nbsp;:&nbsp;${GIT_REVISION}</li>
                    <li>觸發原因:&nbsp;${CAUSE}</li>
                    <li>構建日志:&nbsp;<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>構建&nbsp;&nbsp;Url&nbsp;:&nbsp;<a href="${BUILD_URL}">${BUILD_URL}</a></li>
                    <li>工作目錄&nbsp;:&nbsp;<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                    <li>項目&nbsp;&nbsp;Url&nbsp;:&nbsp;<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>

全局使用模板

修改【系統配置】中默認的郵箱設置可以達到復用效果

image-20210921221344485

六、定期備份數據

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

image-20210921221941225

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

image-20210921223041533

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

image-20210921224047305

image-20210921224105121

時間縮寫 等價寫法 描述
@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文件拷貝到目標服務器即可。

image-20210919131309266

image-20210919132019241

開啟Nginx或者Tomcat服務,就可以運行了。

部署Vue項目

1、需安裝插件,所有用到的插件均在第二步有所介紹

2、然后在【全局工具配置】配置node版本,

image-20210920213025865

3、接下來也需要配置SSH連接遠程服務器,這個方法在第四章節專門講到,請移步

4、配置完畢后,開始新建我們的任務,這里步驟幾乎與第三章節一致,請移步

5、然后我們繼續在這個頁面繼續配置【構建環境】

image-20210920214341858

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

image-20210920215335993

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項目

image-20210920221127723

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、點擊【系統管理】-> 【全局工具配置】即可進入配置面板

image-20210919112051215

點擊鏈接去輸入賬號與密碼,且用且珍惜~

oracle-02@qq.com
1211WaN!

新增Maven

image-20210919112547134

修改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相關配置,然后保存

image-20210919122503141

需要輸入的命令 保姆級教程......

clean package
pom.xml

3、增加shell命令,自動部署運行

image-20210919124449066

4、填入命令 注意這分為直接運行jar包與運行Docker容器運行兩種類型,分別說明一下

jar包運行方式的腳本

sudo fuser -k -n tcp 項目端口號
cd 生成的jar包目錄
nohup java -jar 文件名 > 日志目錄文件地址 &

image-20210919124941151

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相關配置,這里與上方不同

image-20210921092025769

clean install -Dmaven.test.skip=true

最后在構建項目中執行shell腳本,保存。

image-20210921092906791

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、創建命名空間

image-20210921204025109

2、創建鏡像倉庫

image-20210921204258514

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

image-20210921210347793

為倉庫添加 訪問憑證

image-20210921213859638

使用jenkins構建

image-20210921215756842

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!================'

參考:

image-20210922150847810


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

相關視頻教程:微服務持續集成與持續部署 基於Docker+Jenkins+Git 實現企業持續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM