Linux使用Jenkins實(shí)現(xiàn)自動(dòng)化部署的完整指南
一、為什么選擇 Jenkins?
Jenkins 是一個(gè)開源的自動(dòng)化服務(wù)器,它可以幫助我們實(shí)現(xiàn):
- ? 持續(xù)集成(CI)
- ? 持續(xù)交付(CD)
- ? 自動(dòng)化測(cè)試
- ? 自動(dòng)化部署
- ? 多環(huán)境支持(開發(fā)、測(cè)試、預(yù)發(fā)布、生產(chǎn))
- ? 插件生態(tài)豐富(超過1800+插件)
相比 GitLab CI、GitHub Actions、CircleCI 等工具,Jenkins 在企業(yè)私有化部署、復(fù)雜流水線控制、權(quán)限管理方面具有明顯優(yōu)勢(shì)。
官方網(wǎng)站:https://www.jenkins.io
二、Linux 環(huán)境準(zhǔn)備
我們假設(shè)你有一臺(tái)運(yùn)行 Ubuntu 22.04 LTS 或 CentOS Stream 9 的服務(wù)器。以下操作均基于命令行完成。
2.1 更新系統(tǒng)包
# Ubuntu sudo apt update && sudo apt upgrade -y # CentOS sudo dnf update -y
2.2 安裝 Java 環(huán)境(Jenkins 依賴)
Jenkins 推薦使用 OpenJDK 11 或 17:
# Ubuntu 安裝 OpenJDK 17 sudo apt install openjdk-17-jdk -y # CentOS 安裝 OpenJDK 17 sudo dnf install java-17-openjdk-devel -y # 驗(yàn)證安裝 java -version
你應(yīng)該看到類似輸出:
openjdk version "17.0.9" 2023-10-17 OpenJDK Runtime Environment (build 17.0.9+8-Ubuntu-122.04) OpenJDK 64-Bit Server VM (build 17.0.9+8-Ubuntu-122.04, mixed mode, sharing)
三、安裝與配置 Jenkins
3.1 添加 Jenkins 官方倉庫
# 導(dǎo)入 GPG Key curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \ /usr/share/keyrings/jenkins-keyring.asc > /dev/null # 添加倉庫源(Ubuntu) echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \ https://pkg.jenkins.io/debian-stable binary/ | sudo tee \ /etc/apt/sources.list.d/jenkins.list > /dev/null # 更新包索引 sudo apt update
如果你是 CentOS 用戶,請(qǐng)?jiān)L問官方文檔獲取對(duì)應(yīng)安裝方式。
3.2 安裝 Jenkins
sudo apt install jenkins -y
3.3 啟動(dòng)并設(shè)置開機(jī)自啟
sudo systemctl start jenkins sudo systemctl enable jenkins sudo systemctl status jenkins
你應(yīng)該看到 active (running) 表示服務(wù)正常運(yùn)行。
3.4 防火墻配置(如啟用)
# Ubuntu 使用 ufw sudo ufw allow 8080 # CentOS 使用 firewalld sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload
3.5 獲取初始管理員密碼
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
復(fù)制輸出的密碼,稍后用于首次登錄。
四、首次訪問 Jenkins Web 控制臺(tái)
打開瀏覽器,訪問:
http://<your-server-ip>:8080
輸入剛才獲取的初始密碼,進(jìn)入插件安裝界面。
推薦選擇 “Install suggested plugins” —— 這會(huì)自動(dòng)安裝常用插件,包括 Git、Maven、Pipeline、SSH 等。
安裝完成后,創(chuàng)建第一個(gè)管理員用戶:
- 用戶名:admin
- 密碼:StrongPassword123!
- 全名:Administrator
- 郵箱:admin@example.com
然后設(shè)置 Jenkins URL(默認(rèn)即可),點(diǎn)擊 “Save and Finish”。
恭喜!Jenkins 已成功安裝并初始化!
五、基礎(chǔ)配置與插件安裝
5.1 安裝必要插件
進(jìn)入 Manage Jenkins → Plugins → Available plugins
搜索并安裝以下插件:
- ?? Git Parameter —— 支持 Git 分支參數(shù)化構(gòu)建
- ?? Publish Over SSH —— 用于遠(yuǎn)程部署
- ?? Maven Integration —— 構(gòu)建 Maven 項(xiàng)目
- ?? Pipeline Utility Steps —— 增強(qiáng) Pipeline 功能
- ?? Blue Ocean —— 現(xiàn)代化流水線視圖(可選但推薦)
安裝后重啟 Jenkins:
sudo systemctl restart jenkins
六、創(chuàng)建第一個(gè) Java 項(xiàng)目
為了演示自動(dòng)化部署,我們先創(chuàng)建一個(gè)簡單的 Spring Boot 項(xiàng)目。
6.1 創(chuàng)建 Maven 項(xiàng)目結(jié)構(gòu)
mkdir -p ~/jenkins-demo-app cd ~/jenkins-demo-app
6.2 pom.xml 文件內(nèi)容
<?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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jenkins-demo-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
<relativePath/>
</parent>
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.JenkinsDemoAppApplication</mainClass>
<finalName>${project.artifactId}-${project.version}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>6.3 創(chuàng)建主啟動(dòng)類
src/main/java/com/example/JenkinsDemoAppApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class JenkinsDemoAppApplication {
public static void main(String[] args) {
SpringApplication.run(JenkinsDemoAppApplication.class, args);
}
@GetMapping("/health")
public String healthCheck() {
return "? Jenkins Demo App is running! Version: " + getClass().getPackage().getImplementationVersion();
}
@GetMapping("/info")
public AppInfo getAppInfo() {
return new AppInfo("Jenkins Demo App", "1.0.0", System.getProperty("java.version"));
}
static class AppInfo {
private final String name;
private final String version;
private final String javaVersion;
public AppInfo(String name, String version, String javaVersion) {
this.name = name;
this.version = version;
this.javaVersion = javaVersion;
}
// Getters(省略 setter,保持不可變)
public String getName() { return name; }
public String getVersion() { return version; }
public String getJavaVersion() { return javaVersion; }
}
}6.4 創(chuàng)建單元測(cè)試(可選但推薦)
src/test/java/com/example/JenkinsDemoAppApplicationTests.java
package com.example;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class JenkinsDemoAppApplicationTests {
@LocalServerPort
private int port;
private final TestRestTemplate restTemplate = new TestRestTemplate();
@Test
void contextLoads() {
// 測(cè)試應(yīng)用是否能正常啟動(dòng)
}
@Test
void healthEndpointReturnsOk() {
ResponseEntity<String> response = restTemplate.getForEntity(
"http://localhost:" + port + "/health", String.class);
assertThat(response.getStatusCode().is2xxSuccessful()).isTrue();
assertThat(response.getBody()).contains("running");
}
@Test
void infoEndpointReturnsJson() {
ResponseEntity<String> response = restTemplate.getForEntity(
"http://localhost:" + port + "/info", String.class);
assertThat(response.getStatusCode().is2xxSuccessful()).isTrue();
assertThat(response.getBody()).contains("name");
assertThat(response.getBody()).contains("version");
}
}6.5 本地構(gòu)建測(cè)試
在項(xiàng)目根目錄執(zhí)行:
mvn clean package
如果一切順利,你會(huì)在 target/ 目錄下看到生成的 JAR 文件:
target/jenkins-demo-app-1.0.0.jar
運(yùn)行它:
java -jar target/jenkins-demo-app-1.0.0.jar
訪問 http://localhost:8080/health 應(yīng)該返回健康狀態(tài)信息。
七、將項(xiàng)目推送到 Git 倉庫
雖然我們不提供 GitHub 地址,但你可以將項(xiàng)目推送到任意支持 Git 的代碼托管平臺(tái)(如 GitLab、Gitee、Bitbucket 等)。
git init git add . git commit -m "Initial commit: Jenkins Demo App" git remote add origin <your-git-repo-url> git push -u origin main
確保 Jenkins 服務(wù)器可以訪問該倉庫(如果是私有倉庫,需配置憑據(jù))。
八、創(chuàng)建 Jenkins 自由風(fēng)格項(xiàng)目(Freestyle Project)
8.1 新建項(xiàng)目
點(diǎn)擊 New Item → 輸入名稱 jenkins-demo-app → 選擇 Freestyle project → 點(diǎn)擊 OK。
8.2 配置源碼管理
在 Source Code Management 中選擇 Git:
- Repository URL:
https://your-git-server.com/your-group/jenkins-demo-app.git - Credentials: 添加你的 Git 憑據(jù)(用戶名/密碼或 SSH Key)
8.3 配置構(gòu)建觸發(fā)器
勾選 Build periodically,填寫:
H */2 * * * # 每兩小時(shí)構(gòu)建一次
或勾選 Poll SCM:
H/5 * * * * # 每5分鐘檢查一次代碼變更
8.4 配置構(gòu)建環(huán)境
勾選 Add timestamps to the Console Output(方便查看日志時(shí)間)
8.5 添加構(gòu)建步驟
點(diǎn)擊 Add build step → 選擇 Invoke top-level Maven targets
- Maven Version: 選擇已安裝的 Maven(若未安裝,需先在全局工具配置中添加)
- Goals:
clean package
8.6 添加構(gòu)建后操作
點(diǎn)擊 Add post-build action → Archive the artifacts
- Files to archive:
target/*.jar
再添加一個(gè) → Publish JUnit test result report
- Test report XMLs:
**/target/surefire-reports/TEST-*.xml
九、配置自動(dòng)化部署(Publish Over SSH)
9.1 配置 SSH 服務(wù)器
進(jìn)入 Manage Jenkins → Configure System
滾動(dòng)到 Publish over SSH 區(qū)域:
- Passphrase: (留空或設(shè)置密鑰密碼)
- Path to key:
/var/lib/jenkins/.ssh/id_rsa(推薦使用密鑰認(rèn)證) - Key: (粘貼私鑰內(nèi)容,或留空使用文件路徑)
在 SSH Servers 下點(diǎn)擊 Add
- Name:
prod-server - Hostname:
your-production-server-ip - Username:
deploy - Remote Directory:
/home/deploy/apps
點(diǎn)擊 Test Configuration,應(yīng)顯示 “Success”。
提示:確保目標(biāo)服務(wù)器上已創(chuàng)建 deploy 用戶,并賦予相應(yīng)目錄寫入權(quán)限。
9.2 添加部署腳本
在目標(biāo)服務(wù)器(生產(chǎn)機(jī))上創(chuàng)建部署腳本:
# 登錄生產(chǎn)服務(wù)器 ssh deploy@your-production-server-ip # 創(chuàng)建部署目錄 mkdir -p /home/deploy/apps/scripts mkdir -p /home/deploy/apps/logs # 創(chuàng)建部署腳本 nano /home/deploy/apps/scripts/deploy.sh
腳本內(nèi)容如下:
#!/bin/bash
APP_NAME="jenkins-demo-app"
VERSION=$1
JAR_FILE="$APP_NAME-$VERSION.jar"
APP_DIR="/home/deploy/apps"
LOG_DIR="$APP_DIR/logs"
PID_FILE="$APP_DIR/app.pid"
# 創(chuàng)建日志目錄
mkdir -p $LOG_DIR
# 停止舊進(jìn)程
if [ -f "$PID_FILE" ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null; then
echo "Stopping existing process $PID..."
kill $PID
sleep 5
if ps -p $PID > /dev/null; then
kill -9 $PID
echo "Force killed process $PID"
fi
fi
rm -f $PID_FILE
fi
# 啟動(dòng)新應(yīng)用
echo "Starting $JAR_FILE..."
nohup java -jar $APP_DIR/$JAR_FILE \
--server.port=8081 \
> $LOG_DIR/app.log 2>&1 &
# 保存新進(jìn)程ID
echo $! > $PID_FILE
echo "Application started with PID $(cat $PID_FILE)"
sleep 3
# 檢查是否啟動(dòng)成功
if ps -p $(cat $PID_FILE) > /dev/null; then
echo "? Deployment successful!"
exit 0
else
echo "? Deployment failed!"
exit 1
fi賦予執(zhí)行權(quán)限:
chmod +x /home/deploy/apps/scripts/deploy.sh
9.3 在 Jenkins 中配置部署步驟
回到 Jenkins 項(xiàng)目配置頁面,在 構(gòu)建后操作 中添加:
Send build artifacts over SSH
- SSH Server:
prod-server - Source files:
target/jenkins-demo-app-*.jar - Remove prefix:
target/ - Remote directory:
/home/deploy/apps - Exec command:
cd /home/deploy/apps VERSION=$(echo jenkins-demo-app-*.jar | sed 's/jenkins-demo-app-\(.*\)\.jar/\1/') chmod +x scripts/deploy.sh ./scripts/deploy.sh $VERSION
保存配置。
十、手動(dòng)觸發(fā)第一次構(gòu)建
點(diǎn)擊 Build Now,觀察控制臺(tái)輸出。
如果一切順利,你應(yīng)該看到:
- 從 Git 拉取代碼 ?
- Maven 編譯打包 ?
- 單元測(cè)試通過 ?
- JAR 文件上傳到生產(chǎn)服務(wù)器 ?
- 遠(yuǎn)程執(zhí)行部署腳本 ?
- 應(yīng)用成功啟動(dòng) ?
訪問生產(chǎn)服務(wù)器上的應(yīng)用:
http://<production-server-ip>:8081/health
應(yīng)該看到:
? Jenkins Demo App is running! Version: 1.0.0
自動(dòng)化部署成功!
十一、可視化部署流程
下面是一個(gè)典型的 Jenkins 自動(dòng)化部署流程圖:

這個(gè)流程涵蓋了從代碼提交到生產(chǎn)部署的全過程,確保每次部署都是可追蹤、可驗(yàn)證、可回滾的。
十二、進(jìn)階:使用 Pipeline 替代 Freestyle 項(xiàng)目
雖然自由風(fēng)格項(xiàng)目易于上手,但在復(fù)雜場景下,Pipeline 更具優(yōu)勢(shì):
- ?? 代碼即配置(Jenkinsfile)
- ?? 支持階段化構(gòu)建(Stage)
- ?? 可視化流程圖
- ?? 支持并行任務(wù)
- ?? 更好的錯(cuò)誤處理和重試機(jī)制
12.1 創(chuàng)建 Jenkinsfile
在項(xiàng)目根目錄創(chuàng)建 Jenkinsfile:
pipeline {
agent any
tools {
maven 'Maven 3.8.6'
jdk 'OpenJDK 17'
}
environment {
APP_NAME = 'jenkins-demo-app'
SERVER_IP = 'your-production-server-ip'
DEPLOY_USER = 'deploy'
ARTIFACT_DIR = 'target'
}
stages {
stage('Checkout') {
steps {
checkout scm
script {
env.BUILD_VERSION = sh(script: 'echo ${POM_VERSION}', returnStdout: true).trim()
}
echo "Building version: ${env.BUILD_VERSION}"
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit '**/target/surefire-reports/TEST-*.xml'
}
}
}
stage('Deploy to Production') {
when {
branch 'main'
}
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'prod-server',
transfers: [
sshTransfer(
sourceFiles: "${ARTIFACT_DIR}/${APP_NAME}-${BUILD_VERSION}.jar",
removePrefix: "${ARTIFACT_DIR}/",
remoteDirectory: "/home/deploy/apps"
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
// 執(zhí)行遠(yuǎn)程部署腳本
sshCommand(
remote: 'prod-server',
command: """
cd /home/deploy/apps
VERSION=\$(echo ${APP_NAME}-*.jar | sed 's/${APP_NAME}-\\(.*\\)\\.jar/\\1/')
chmod +x scripts/deploy.sh
./scripts/deploy.sh \$VERSION
"""
)
}
}
}
post {
success {
echo '? Build and deployment completed successfully!'
// 可添加郵件、Slack、釘釘?shù)韧ㄖ?
}
failure {
echo '? Build or deployment failed!'
// 發(fā)送告警通知
}
}
}12.2 創(chuàng)建 Pipeline 項(xiàng)目
- New Item → 輸入名稱 → 選擇 Pipeline
- 在 Pipeline 區(qū)域選擇 Pipeline script from SCM
- SCM 選擇 Git
- Repository URL 填寫你的 Git 地址
- Script Path 填寫
Jenkinsfile - 保存并構(gòu)建
Pipeline 將自動(dòng)讀取 Jenkinsfile 并執(zhí)行定義的流程。
十三、多環(huán)境部署策略
真實(shí)項(xiàng)目通常需要多個(gè)環(huán)境:
- ?? 開發(fā)環(huán)境(Dev)
- ?? 測(cè)試環(huán)境(QA)
- ?? 預(yù)發(fā)布環(huán)境(Staging)
- ?? 生產(chǎn)環(huán)境(Production)
我們可以擴(kuò)展 Pipeline 支持多環(huán)境:

對(duì)應(yīng)的 Jenkinsfile 片段:
stage('Deploy') {
when {
anyOf {
branch 'develop'
branch 'main'
branch 'release/*'
}
}
steps {
script {
def targetEnv = ""
def serverConfig = ""
if (env.BRANCH_NAME == 'develop') {
targetEnv = 'qa'
serverConfig = 'qa-server'
} else if (env.BRANCH_NAME.startsWith('release/')) {
targetEnv = 'staging'
serverConfig = 'staging-server'
} else if (env.BRANCH_NAME == 'main') {
targetEnv = 'production'
serverConfig = 'prod-server'
timeout(time: 5, unit: 'MINUTES') {
input message: "確認(rèn)部署到生產(chǎn)環(huán)境?", ok: "部署"
}
}
echo "Deploying to ${targetEnv} environment..."
sshPublisher(
publishers: [
sshPublisherDesc(
configName: serverConfig,
transfers: [
sshTransfer(
sourceFiles: "${ARTIFACT_DIR}/${APP_NAME}-${BUILD_VERSION}.jar",
removePrefix: "${ARTIFACT_DIR}/",
remoteDirectory: "/home/deploy/apps"
)
]
)
]
)
sshCommand(
remote: serverConfig,
command: """
cd /home/deploy/apps
VERSION=\$(echo ${APP_NAME}-*.jar | sed 's/${APP_NAME}-\\(.*\\)\\.jar/\\1/')
./scripts/deploy.sh \$VERSION
"""
)
}
}
}這樣,不同分支的代碼會(huì)自動(dòng)部署到對(duì)應(yīng)環(huán)境,且生產(chǎn)環(huán)境部署前需要人工確認(rèn),避免誤操作。
十四、監(jiān)控與日志
14.1 Jenkins 控制臺(tái)日志
每次構(gòu)建都會(huì)生成詳細(xì)日志,可通過點(diǎn)擊構(gòu)建編號(hào) → Console Output 查看。
14.2 應(yīng)用日志收集
在部署腳本中,我們已經(jīng)將日志重定向到文件:
> $LOG_DIR/app.log 2>&1 &
你可以使用 tail -f 實(shí)時(shí)查看:
tail -f /home/deploy/apps/logs/app.log
14.3 健康檢查端點(diǎn)
我們的 Java 應(yīng)用提供了 /health 和 /info 端點(diǎn),可用于:
- ?? 自動(dòng)化健康檢查
- ?? 監(jiān)控系統(tǒng)集成(如 Prometheus + Grafana)
- ?? 故障告警
示例 curl 檢查:
curl http://localhost:8081/health # 輸出:? Jenkins Demo App is running! Version: 1.0.0
十五、安全加固建議
15.1 使用憑據(jù)管理
不要在 Jenkinsfile 或配置中硬編碼密碼。使用 Credentials Binding:
withCredentials([usernamePassword(credentialsId: 'git-credentials', usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASS')]) {
sh "git clone https://${GIT_USER}:${GIT_PASS}@your-git-server/repo.git"
}
15.2 限制訪問權(quán)限
- 啟用 矩陣授權(quán)策略(Matrix Authorization Strategy)
- 為不同團(tuán)隊(duì)分配不同權(quán)限
- 禁用匿名用戶訪問
15.3 定期備份
備份 Jenkins 主目錄:
sudo tar -czvf jenkins-backup-$(date +%Y%m%d).tar.gz /var/lib/jenkins
建議每天自動(dòng)備份并上傳到異地存儲(chǔ)。
十六、常見問題與解決方案
問題1:Maven 構(gòu)建內(nèi)存不足
現(xiàn)象:OutOfMemoryError: Java heap space
解決:
# 修改 Jenkins 啟動(dòng)參數(shù) sudo nano /etc/default/jenkins # 添加或修改: JAVA_OPTS="-Xmx2g -Xms512m"
然后重啟 Jenkins:
sudo systemctl restart jenkins
問題2:SSH 連接被拒絕
現(xiàn)象:Failed to connect to server
解決:
- 檢查目標(biāo)服務(wù)器 SSH 服務(wù)是否運(yùn)行:
systemctl status sshd - 檢查防火墻:
sudo ufw status - 測(cè)試手動(dòng) SSH 連接:
ssh deploy@server-ip - 確保 Jenkins 用戶有權(quán)限讀取私鑰文件
問題3:部署后應(yīng)用無法訪問
排查步驟:
# 1. 檢查進(jìn)程是否存在 ps aux | grep jenkins-demo-app # 2. 檢查端口監(jiān)聽 netstat -tlnp | grep :8081 # 3. 查看應(yīng)用日志 tail -f /home/deploy/apps/logs/app.log # 4. 檢查防火墻 sudo ufw status sudo ufw allow 8081 # 5. 本地測(cè)試 curl http://localhost:8081/health
十七、性能優(yōu)化技巧
17.1 使用構(gòu)建節(jié)點(diǎn)(Agent)
當(dāng)主節(jié)點(diǎn)負(fù)載過高時(shí),可以添加構(gòu)建節(jié)點(diǎn):
pipeline {
agent { label 'java-builder' }
// ... 其他配置
}
在 Manage Jenkins → Manage Nodes 中添加新節(jié)點(diǎn)。
17.2 并行構(gòu)建
對(duì)于多模塊項(xiàng)目,可以并行構(gòu)建:
stage('Parallel Build') {
parallel {
stage('Module A') {
steps {
dir('module-a') {
sh 'mvn clean package'
}
}
}
stage('Module B') {
steps {
dir('module-b') {
sh 'mvn clean package'
}
}
}
}
}17.3 緩存依賴
避免每次構(gòu)建都下載 Maven 依賴:
stage('Build with Cache') {
steps {
sh 'mkdir -p ~/.m2'
stash includes: '.m2/**', name: 'maven-cache'
sh 'mvn clean package'
unstash 'maven-cache'
}
}
或者使用 Artifact Manager 插件進(jìn)行更高級(jí)的緩存管理。
十八、集成通知系統(tǒng)
18.1 郵件通知
安裝 Email Extension Plugin,在 post 部分添加:
post {
success {
emailext (
subject: "SUCCESS: Job '${env.JOB_NAME}'",
body: """<p>構(gòu)建成功!</p>
<p>版本: ${env.BUILD_VERSION}</p>
<p><a href="${env.BUILD_URL}" rel="external nofollow" rel="external nofollow" >查看構(gòu)建詳情</a></p>""",
recipientProviders: [[$class: 'DevelopersRecipientProvider']]
)
}
failure {
emailext (
subject: "FAILED: Job '${env.JOB_NAME}'",
body: """<p>構(gòu)建失?。?lt;/p>
<p>請(qǐng)盡快修復(fù)。</p>
<p><a href="${env.BUILD_URL}" rel="external nofollow" rel="external nofollow" >查看構(gòu)建詳情</a></p>""",
recipientProviders: [[$class: 'DevelopersRecipientProvider']]
)
}
}
18.2 Slack/釘釘通知
安裝對(duì)應(yīng)插件,在 Pipeline 中調(diào)用:
// Slack 示例
slackSend channel: '#builds', message: "構(gòu)建${currentBuild.result}: ${env.JOB_NAME} #${env.BUILD_NUMBER}"
十九、自動(dòng)化測(cè)試擴(kuò)展
除了單元測(cè)試,還可以集成:
- ?? 集成測(cè)試
- ??? API 測(cè)試(Postman/Newman)
- ??? UI 測(cè)試(Selenium)
- ?? 代碼質(zhì)量檢查(SonarQube)
示例:集成 SonarQube
stage('Code Quality') {
steps {
withSonarQubeEnv('sonar-server') {
sh 'mvn sonar:sonar'
}
}
}
stage('Quality Gate') {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}二十一、總結(jié)
通過本文,你已經(jīng)掌握了:
? 在 Linux 上安裝配置 Jenkins
? 創(chuàng)建 Java Spring Boot 項(xiàng)目
? 編寫 Jenkins Pipeline 實(shí)現(xiàn)自動(dòng)化構(gòu)建
? 通過 SSH 實(shí)現(xiàn)自動(dòng)化部署到生產(chǎn)環(huán)境
? 設(shè)計(jì)多環(huán)境部署策略
? 添加監(jiān)控、日志、通知機(jī)制
? 解決常見問題和性能優(yōu)化
Jenkins 作為老牌 CI/CD 工具,雖然界面不如新興工具現(xiàn)代化,但其穩(wěn)定性、靈活性和強(qiáng)大的插件生態(tài)使其在企業(yè)環(huán)境中依然占據(jù)重要地位。
隨著云原生和 Kubernetes 的普及,Jenkins 也在不斷進(jìn)化,通過 Jenkins X、Tekton 等項(xiàng)目擁抱新時(shí)代。但對(duì)于大多數(shù)傳統(tǒng)企業(yè)應(yīng)用,標(biāo)準(zhǔn) Jenkins 仍然是最佳選擇。
二十二、未來演進(jìn)方向
當(dāng)你熟練掌握基礎(chǔ)自動(dòng)化部署后,可以考慮:
- ?? 容器化部署(Docker + Jenkins)
- ?? Kubernetes 集成
- ?? 藍(lán)綠部署 / 金絲雀發(fā)布
- ?? 集成監(jiān)控告警系統(tǒng)(Prometheus + Alertmanager)
- ?? 微服務(wù)架構(gòu)下的多服務(wù)協(xié)同部署
自動(dòng)化部署不是終點(diǎn),而是 DevOps 旅程的起點(diǎn)。持續(xù)改進(jìn)、持續(xù)交付、持續(xù)反饋,才能真正提升軟件交付效率和質(zhì)量。
記?。鹤詣?dòng)化不是為了取代人,而是讓人專注于更有價(jià)值的工作。讓機(jī)器去做重復(fù)、易錯(cuò)的任務(wù),讓開發(fā)者去創(chuàng)造、去創(chuàng)新、去解決問題。
以上就是Linux使用Jenkins實(shí)現(xiàn)自動(dòng)化部署的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Linux Jenkins自動(dòng)化部署的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux之進(jìn)程狀態(tài)&&進(jìn)程優(yōu)先級(jí)詳解
文章介紹了操作系統(tǒng)中進(jìn)程的狀態(tài),包括運(yùn)行狀態(tài)、阻塞狀態(tài)和掛起狀態(tài),并詳細(xì)解釋了Linux下進(jìn)程的具體狀態(tài)及其管理,此外,文章還討論了進(jìn)程的優(yōu)先級(jí)、查看和修改進(jìn)程優(yōu)先級(jí)的方法,以及并發(fā)相關(guān)的概念和函數(shù)的返回值2025-02-02
Linux殺不死的進(jìn)程之CPU使用率700%解決方法
這篇文章主要給大家介紹了關(guān)于Linux殺不死的進(jìn)程之CPU使用率700%的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Linux系統(tǒng)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Linux 6 修改ssh默認(rèn)遠(yuǎn)程端口號(hào)的操作步驟
這篇文章主要介紹了Linux 6 修改ssh默認(rèn)遠(yuǎn)程端口號(hào)的操作步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
linux正則表達(dá)式,反斜線加普通字符作為正則表達(dá)式詳解
這篇文章主要介紹了linux正則表達(dá)式,反斜線加普通字符作為正則表達(dá)式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
解決Linux系統(tǒng)yum安裝報(bào)錯(cuò)Cannot find a valid base
本文介紹了如何在Linux系統(tǒng)中設(shè)置本地yum源,包括修改yum配置文件、禁用默認(rèn)網(wǎng)絡(luò)源、創(chuàng)建掛載點(diǎn)以及掛載鏡像文件等步驟,操作詳細(xì),適合需要離線安裝軟件或更新系統(tǒng)的用戶參考2024-09-09
socket unix domain IPC的實(shí)例代碼
下面小編就為大家?guī)硪黄猻ocket unix domain IPC的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12

