CI/CD-Jenkins安裝與應用
Docker安裝Jenkins
docker-compose.yaml
version: "3.8"
# ========================
# 自定義網絡配置
# ========================
networks:cicd:driver: bridgeservices:jenkins:# 盡量使用新版本的Jenkins, 低版本的Jenkins的有些插件使用不了# jenkins/jenkins:lts-jdk17是長期支持版, jenkins/jenkins:jdk17是最新版image: jenkins/jenkins:jdk17container_name: jenkinsports:- 8080:8080 # WEB UI- 50000:50000volumes:# 將宿主機的Docker引擎掛載到Jenkins容器上,即Jenkins容器調用宿主機的Docker- /var/run/docker.sock:/var/run/docker.sock- /usr/bin/docker:/usr/bin/docker# 將宿主機的docker compose掛載到容器中- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose# 讓容器和宿主機時間保持一致- /etc/localtime:/etc/localtime# Jenkins工作存儲位置/var/jenkins_home, 所有插件數據配置都在次目錄下- /data/cicd/jenkins/jenkins_home:/var/jenkins_home# Docker打包Java涉及的Dockerfile, 鏡像, docker compose命令的存儲- /data/cicd/docker:/data/docker# 指定用戶, 因為Jenkins鏡像內部使用的用戶是jenkins,但是我們啟動容器時的賬號是root,導致沒有權限操作內部目錄user: rootnetworks:- cicd
初始化
配置鏡像加速
啟動容器后, 修改鏡像源
vi /var/jenkins/jenkins_home/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><!-- 華為鏡像源 --><url>https://mirrors.huaweicloud.com/jenkins/update-center.json</url></site>
</sites>
登錄Jenkins
查看初始化密碼
docker logs jenkins
輸入密碼, 點擊下一步
安裝官方推薦插件
安裝官方推薦插件
可能有部分安裝失敗(受網絡, 墻, 數據源, 插件和Jenkins版本不匹配等原因限制), 可以嘗試點多幾次重試
繼續下一步創建用戶和配置Jenkins訪問地址和端口, 然后進入Jenkins
安裝JDK, Git, Maven, Publish over ssh, Gitee插件
JDK下載插件
Git
Maven Integration plugin
publish over shh
Gitee
安裝JDK, Git, Maven
JDK
新版本Jenkins自帶了JDK, 直接使用自帶的JDK17
Git
新版本Jenkins自帶了git, 配置路徑即可
Maven
構建部署Java項目
新建Maven任務
新建任務->填寫任務名稱->選擇maven項目->點擊確定
填寫描述
設置源碼地址
根據官方提供的java demo項目地址: https://github.com/jenkins-docs/simple-java-maven-app
倉庫地址(這個是github的鏡像地址, gitcode提供的): https://gitcode.com/gh_mirrors/si/simple-java-maven-app.git
保存并構建
查看日志
發現日志構建成功
查看構建好的jar包
構建好的jar通常存放在包在**/var/jenkins_home/workspace/任務名/target**,
而我們通過docker方式啟動并進行了數據卷掛載 我們可以在宿主機進行查看
cd /data/cicd/jenkins/jenkins_home/workspace/hello-word/target
ls
運行Jar包
這里演示的Jenkins服務器和項目運行服務器是同一個的情況
不同的情況后續說明
在官方提供的demo中,實際上僅控制臺輸出了 Hello World!
字符串
java -jar運行
進入容器
docker exec -it jenkins /bin/bash
容器中運行該命令
java -jar /var/jenkins_home/workspace/hello-word/target/my-app-1.0-SNAPSHOT.jar
發現確實輸出了Hello World!
Docker打包鏡像運行
宿主機執行一下創建文件夾命令
# Dockerfile存儲地方
mkdir -p /data/cicd/docker/dockerFile
#docker-compose.yaml存儲地方
mkdir -p /data/cicd/docker/compose_script
Dockerfile
宿主機中創建Dockerfile
vim /data/cicd/docker/dockerFile/Dockerfile
FROM openjdk:17
# 設置工作目錄
WORKDIR /data/app
# 將宿主機的目錄掛載到容器的/app目錄
VOLUME /data/app/data
# 復制.jar文件到工作目錄
COPY my-app-1.0-SNAPSHOT.jar /data/app/my-app.jar
# 設置容器啟動時執行的命令
CMD ["java", "-jar", "my-app.jar"]
docker-compose.yaml
宿主機創建docker-compose.yaml
vim /data/cicd/docker/compose_script/docker-compose.yaml
version: "3.8"
services:my-app:image: my-app:v1container_name: my-app
構建鏡像
進入容器中
docker exec -it jenkins /bin/bash
容器中執行構建鏡像
# -f: 指定Dockerfile路徑
# -t: 鏡像的名字及標簽, 通常 name:tag 或者 name 格式
# /var/jenkins_home/workspace/hello-word/target/: 相對路徑
docker build -f /data/docker/dockerFile/Dockerfile --tag my-app:v1 /var/jenkins_home/workspace/hello-word/target/
如果宿主機中已經有OpenJDK17鏡像, 那么就不會重新拉取, 如果沒有, 那么此時拉取
博主這里已經有了JDK17鏡像, 所以這里沒有有拉去鏡像的步驟
查看構建好的鏡像
docker images my-app
運行鏡像
啟動my-app容器, 前臺模式啟動
docker-compose -f /data/docker/compose_script/docker-compose.yaml up
Jenkins自動部署
當構建成功后自動執行啟動命令(這里以啟動容器為例子)
Post steps -> 構建成功后執行 -> 執行shell
填寫啟動的shell命令
將之前構建容器, 啟動容器等命令寫入shell腳本中
# 使用docker ps和grep來檢查容器是否存在
if docker-compose ps -a | grep "my-app" > /dev/null; thenecho "容器存在"# 容器存在則停止并刪除容器docker-compose -f /data/docker/compose_script/docker-compose.yaml downdocker rm my-app:v1
elseecho "容器不存在"
fi# 構建鏡像
docker build -f /data/docker/dockerFile/Dockerfile --tag my-app:v1 /var/jenkins_home/workspace/hello-word/target/
# 運行容器(后臺啟動, 和之前的前臺啟動不一樣)
docker-compose -f /data/docker/compose_script/docker-compose.yaml up -d
重新構建, 并查看構建日志
查看容器日志
這里輸出了幾個Hello World!是因為博主啟動了幾次容器
拉取Gitee項目自動化部署
前提
- 有Gitee賬戶
- 會將SpringBoot項目推送到Gitee
創建SpringBoot項目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.whiteBrocade</groupId><artifactId>jenkins_demo</artifactId><version>0.0.1-SNAPSHOT</version><name>jenkins_demo</name><description>jenkins_demo</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.whitebrocade.jenkins_demo.JenkinsDemoApplication</mainClass><skip>false</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins><!-- 將根目錄下的Dockerfile一并打包至target目錄 --><resources><resource><directory>${project.basedir}</directory><targetPath>${project.build.directory}</targetPath><includes><include>Dockerfile</include></includes></resource><!-- maven默認會將資源目錄下的資源文件進行打包, 而如果在pom.xml中配置了resources標簽,則默認的資源打包策略就被覆蓋掉了, 只會打包resources標簽中配置的資源文件 --><resource><directory>src/main/resources</directory><includes><include>**/*</include></includes></resource></resources></build><!-- maven鏡像源 --><repositories><repository><id>public</id><name>aliyun nexus</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases></repository></repositories></project>
application.yaml
# 應用服務 WEB 訪問端口
server:port: 9999
TestController
/*** @author whiteBrocade* @version 1.0*/
@RestController
public class TestController {@GetMapping("/hello")public String hello(@RequestParam String name) {return "Hello " + name;}
}
Dockerfile
# 用的是JDK17
FROM openjdk:17
LABEL authors="whiteBrocade"
# 設置工作目錄
WORKDIR /data/app
# 將宿主機的目錄掛載到容器的/app目錄
VOLUME /data/app
# 復制.jar文件到工作目錄
COPY jenkins_demo-0.0.1-SNAPSHOT.jar /data/app/jenkins_demo.jar
# 設置容器啟動時執行的命令
CMD ["java", "-jar", "jenkins_demo.jar"]
提交代碼到gitee中
Jenkins構建任務
創建Maven任務
設置源碼地址
添加Post Steps
選擇僅構建成功執行(Run only if build succeeds), 添加下邊的shell腳本
# 默認操作在Jenkins工作目錄下的項目名目錄 即 workspace/jenkins-demo/target
cd target
# 構建鏡像
docker build -t jenkins_demo .
# 使用docker ps和grep來檢查容器是否存在
if docker ps -a | grep "jenkins_demo" > /dev/null; thenecho "容器存在"# 容器存在則停止并刪除容器docker stop jenkins_demodocker rm jenkins_demo
elseecho "容器不存在"
fi
# 運行容器
docker run -d -p 9999:9999 --name jenkins_demo jenkins_demo
保存并構建
保存后, 點擊構建, 如下圖, 構建成功
查看容器是否啟動
訪問項目
http://192.168.132.10:9999?hello=whiteBrocade
Gitee的WeHhooks觸發自動構建
WebHooks介紹
WebHooks
是一種基于HTTP協議的回調機制。當特定事件(如代碼推送、Pull Request等)發生時,源系統會向預先配置的URL發送一個HTTP請求,以通知目標系統進行相應的操作。在CI/CD流程中,WebHooks
常用于觸發Jenkins
構建任務
添加Gitee憑證
在系統管理的中配置Gitee令牌(令牌申請點擊Gitee私人令牌)
添加觸發器
選擇之前的jenkins_demo構建任務, 點擊Triggers
觸發策略為
- Push: 倉庫推送代碼, 推送/刪除分支
- Pull Request: 新建, 更新, 合并
生成隨機密碼, 這里的隨機密碼后續要復制到Gitee中的WebHooks中
Gitee添加WebHooksp
Gitee ->自己的jenkins_demo倉庫 -> 管理 -> WebHooks -> 添加webHook
從Jenkins中獲取URL
添加WebHooks
將剛剛的URL復制過來, 這里需要內網穿透, 詳細請看內網穿透工具章節
修改代碼并提交
觸發自動構建了
訪問新增的接口
遠程推送和自動部署
Publish Over SSH配置SSH Servers
如果沒有安裝Publish Over SSH, 那么先安裝
系統管理 -> 系統配置 -> Publish over SSH, 添加SSH Servers
添加推送
清空Post Steps
由于之前配置一個Post Steps會影響后續流程, 這里清空, 確保這個構建任務沒有Post Steps
Post Steps添加步驟
注意事項
- Jenkins會默認找到任務的工作目錄, 這里就是/var/jenkins/jenkins_home/workspace/jenkins_demo
- Source files可以傳遞多個文件, 文件通過英文逗號間隔
sh腳本
cd /data/storage
# 構建鏡像
docker build -t jenkins_demo .
# 使用docker ps和grep來檢查容器是否存在
if docker ps -a | grep "jenkins_demo" > /dev/null; thenecho "容器存在"# 容器存在則停止并刪除容器docker stop jenkins_demodocker rm jenkins_demo
elseecho "容器不存在"
fi
# 運行容器
docker run -d -p 9999:9999 --name jenkins_demo jenkins_demo
構建項目
效果
查看容器
進入192.168.132.11主機
查看容器
測試請求
訪問http://192.168.132.11:9999/hello?whiteBrocade
內網穿透工具
natapp實現內網穿透
neutrino-proxy沒有實現
natapp
這個免費的隧道過一段時間會失效, 所以有時候不行的話, 可以重新啟動一個natapp, 用新分配的地址重新配置一個WebHooks
- 下載[NATAPP]客戶端(https://natapp.cn/#download)
- 進入NATAPP注冊
- 選擇免費隧道
- 點擊免費購買
- 復制authtoken
- 修改本機地址為VM內網地址
- natapp.exe同級目錄下新建config.ini
#將本文件放置于natapp同級目錄 程序將讀取 [default] 段
#在命令行參數模式如 natapp -authtoken=xxx 等相同參數將會覆蓋掉此配置
#命令行參數 -config= 可以指定任意config.ini文件
[default]
authtoken=3xxxxxxxxxxx3 #對應一條隧道的authtoken
clienttoken= #對應客戶端的clienttoken,將會忽略authtoken,若無請留空,
log=none #log 日志文件,可指定本地文件, none=不做記錄,stdout=直接屏幕輸出 ,默認為none
loglevel=ERROR #日志等級 DEBUG, INFO, WARNING, ERROR 默認為 DEBUG
http_proxy= #代理設置 如 http://10.123.10.10:3128 非代理上網用戶請務必留空
- 點擊natapp.exe啟動
neutrino-proxy
啟動服務端
配置
創建文件夾
# 服務端
# 配置
mkdir -p /data/neutrino-proxy/server/config
# 運行數據
mkdir -p /data/neutrino-proxy/server/data
# 日志
mkdir -p /data/neutrino-proxy/server/logs
服務端app.yml
創建app.yml配置
vim /data/neutrino-proxy/server/config/app.yml
server:# 服務端web端口,用于支持HTTP接口,管理后臺頁面訪問port: 8888
# 日志級別
solon.logging:logger:"root":level: infoappender:file:level: infoneutrino:proxy:# 隧道相關配置-用于維持服務端與客戶端的通信tunnel:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 2work-thread-count: 10# 隧道非SSL端口port: 9000# 隧道SSL端口ssl-port: 9002# 隧道SSL證書配置key-store-password: 123456key-manager-password: 123456jks-path: classpath:/test.jks# 是否開啟隧道傳輸報文日志(日志級別為debug時開啟才有效)transfer-log-enable: false# 是否開啟心跳日志heartbeat-log-enable: falseserver:tcp:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 5work-thread-count: 20# http代理端口,默認80(不配置不支持)http-proxy-port: 80# https代理端口,默認443 (不配置不支持,同時需要配置域名、證書)https-proxy-port: 443# 是否開啟代理服務報文日志(日志級別為debug時開啟才有效)transfer-log-enable: falseudp:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 5work-thread-count: 20# 是否開啟代理服務報文日志(日志級別為debug時開啟才有效)transfer-log-enable: falsedata:db:# 數據庫類型,目前支持h2、mysql、mariadbtype: h2# 數據庫連接URLurl: jdbc:h2:file:./data/db;MODE=MySQL;AUTO_SERVER=TRUE# 數據庫用戶名username:# 數據庫密碼password:
docker-compose.yaml
version: '3.8'networks:npServer:driver: bridge
services:# 服務端npServer:image: aoshiguchen/neutrino-proxy-server:latestcontainer_name: npServerhostname: npServerrestart: alwaysenvironment:TZ: Asia/ShanghaiLANG: zh_CN.UTF-8volumes:- /data/neutrino-proxy/server/config:/root/neutrino-proxy/config- /data/neutrino-proxy/server/data:/root/neutrino-proxy/data- /data/neutrino-proxy/server/logs:/root/neutrino-proxy/logsports:- "8888:8888"- "9000:9000"- "9002:9002"- "9101-9120:9101-9120"networks:- npServer
設置內網穿透
訪問首頁
http://192.168.132.10:8888/
賬號: admin
密碼: 123456
添加License
添加一個專門用于jenkins回調穿透用的License
添加端口映射
啟動客戶端
配置
創建文件夾
# 客戶端
# 配置
mkdir -p /data/neutrino-proxy/client/config
# 日志
mkdir -p /data/neutrino-proxy/client/logs
客戶端app.yml
vim /data/neutrino-proxy/client/config/app.yml
下邊有兩個地方需要修改
- server-ip改成自己的本機的公網地址
- license-key改成后臺配置的jenkins_demo的license
solon.logging.logger:"root":level: infoneutrino:proxy:tunnel:# 線程池相關配置,用于技術調優,可忽略thread-count: 50# 隧道SSL證書配置key-store-password: 123456jks-path: classpath:/test.jks# 服務端IP(自己的公網IP)server-ip: xxx.xxx.xxx.xxx# 服務端端口(對應服務端app.yml中的tunnel.port、tunnel.ssl-port)server-port: 9002# 是否啟用SSL(注意:該配置必須和server-port對應上)ssl-enable: true# 客戶端連接唯一憑證(這里修改成服務端配置的Jenkins_demo的lin)license-key: xxxxxx# 客戶端唯一身份標識(可忽略,若不設置首次啟動會自動生成)client-id:# 是否開啟隧道傳輸報文日志(日志級別為debug時開啟才有效)transfer-log-enable: false# 是否開啟心跳日志heartbeat-log-enable: false# 重連設置reconnection:# 重連間隔(秒)interval-seconds: 10# 是否開啟無限重連(未開啟時,客戶端license不合法會自動停止應用,開啟了則不會,請謹慎開啟)unlimited: falseclient:udp:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 5work-thread-count: 20# udp傀儡端口范圍puppet-port-range: 10000-10500# 是否開啟隧道傳輸報文日志(日志級別為debug時開啟才有效)transfer-log-enable: false
docker-compose.yaml
version: '3.8'networks:npClient:driver: bridge
services:npClient:image: aoshiguchen/neutrino-proxy-client:latestcontainer_name: npClienthostname: npClientrestart: alwaysenvironment:TZ: Asia/ShanghaiLANG: zh_CN.UTF-8volumes:- /data/neutrino-proxy/client/config:/root/neutrino-proxy/config- /data/neutrino-proxy/client/logs:/root/neutrino-proxy/logsports:- "10000-10500:10000-10500/udp"networks:- npClient
參考
Jenkins中文官網
Docker安裝Jenkins
Jenkins+Docker 實現一鍵自動化部署項目!步驟齊全,少走坑路
Docker 快速安裝Jenkins完美教程 (親測采坑后詳細步驟)
【Jenkins】之配置國內鏡像加速
Jenkins安裝插件提速
實戰指南:使用Docker安裝Jenkins并結合Buildx構建跨平臺鏡像
Index of jenkins-local
Jenkins首次安裝選擇推薦插件時出現“: No such plugin: cloudbees-folder” 解決方案
Jenkins首次安裝推薦插件出錯 No such plugin: cloudbees-folder 超詳細解決方案
Index of /jenkins/plugins/cloudbees-folder/latest/r
jenkins安裝,打包,部署java項目_jenkins打包,發布,部署
更換 Jenkins 插件下載源(解決 Jenkins 插件安裝失敗)【圖文詳細教程】
jenkins安裝,打包,部署java項目
Jenkins之java代碼上線
Jenkins+Gitee 的Java項目提交自動部署
Jenkins查看版本
24年最新 Docker安裝jenkins并發布服務器,配置環境,最全,已成功驗證
Jenkins_Micro麥可樂的博客
Docker 安裝 Jenkins-jdk17
內網穿透工具neutrino-proxy
內網穿透Neutrino-Proxy的安裝部署和使用
Linux搭建NeutrinoProxy(中微子代理) 內網穿透教程
【從0開始搭建內網穿透】開源內網穿透神器
開源內網穿透神器,中微子代理(NeutrinoProxy)2.0.0重磅發布
內網穿透神器 NeutrinoProxy 1.8.0 版本發布
linux 獲取公網 IP 方法
iP地址查詢–手機號碼查詢歸屬地 | 郵政編碼查詢 | iP地址歸屬地查詢 | 身份證號碼驗證在線查詢網
jenkins自動部署代碼到多臺服務器
使用docker build命令構建鏡像時遇到警告信息 The legacy builder is deprecated and will be removed in a future release
關于maven打包時, 資源文件沒有被打包進來的問題
gitee使用webhoot觸發Jenkins自動構建
jenkins使用gitee插件自動部署webhook404問題記錄
GitEE提交代碼自動構建Jenkins項目
jenkins自動化部署構建后Publish Over SSH失敗問題解決辦法
jenkins報錯code記錄
解決 jenkins exit status not zero error (status code 125)