最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux使用Jenkins實(shí)現(xiàn)自動(dòng)化部署的完整指南

 更新時(shí)間:2026年04月26日 14:56:00   作者:知遠(yuǎn)漫談  
自動(dòng)化部署是現(xiàn)代 DevOps 的核心支柱之一,在 Linux 環(huán)境下,Jenkins 是最成熟、最廣泛使用的持續(xù)集成/持續(xù)交付(CI/CD)工具,本文將帶你從零開始搭建 Jenkins 環(huán)境,并通過 Java 項(xiàng)目示例演示完整的自動(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 actionArchive 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)該看到:

  1. 從 Git 拉取代碼 ?
  2. Maven 編譯打包 ?
  3. 單元測(cè)試通過 ?
  4. JAR 文件上傳到生產(chǎn)服務(wù)器 ?
  5. 遠(yuǎn)程執(zhí)行部署腳本 ?
  6. 應(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)目

  1. New Item → 輸入名稱 → 選擇 Pipeline
  2. Pipeline 區(qū)域選擇 Pipeline script from SCM
  3. SCM 選擇 Git
  4. Repository URL 填寫你的 Git 地址
  5. Script Path 填寫 Jenkinsfile
  6. 保存并構(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

解決

  1. 檢查目標(biāo)服務(wù)器 SSH 服務(wù)是否運(yùn)行:systemctl status sshd
  2. 檢查防火墻:sudo ufw status
  3. 測(cè)試手動(dòng) SSH 連接:ssh deploy@server-ip
  4. 確保 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啟動(dòng)和重啟nginx方法

    linux啟動(dòng)和重啟nginx方法

    在本篇文章里小編給大家整理了關(guān)于linux如何啟動(dòng)nginx并重啟哦的小技巧,有需要的朋友們參考下。
    2019-06-06
  • Linux之進(jìn)程狀態(tài)&&進(jìn)程優(yōu)先級(jí)詳解

    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之軟件包管理器yum詳解

    Linux之軟件包管理器yum詳解

    文章介紹了現(xiàn)代類Unix操作系統(tǒng)中軟件包管理和包存儲(chǔ)庫的工作原理,以及如何使用包管理器如yum來安裝、更新和卸載軟件,文章還介紹了如何配置yum源,更新系統(tǒng)軟件包和查看已安裝的軟件
    2025-01-01
  • Linux殺不死的進(jìn)程之CPU使用率700%解決方法

    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 read命令的使用

    Linux read命令的使用

    這篇文章主要介紹了Linux read命令的使用,幫助大家更好的理解和學(xué)習(xí)Linux,感興趣的朋友可以了解下
    2020-08-08
  • Linux 6 修改ssh默認(rèn)遠(yuǎn)程端口號(hào)的操作步驟

    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á)式詳解

    這篇文章主要介紹了linux正則表達(dá)式,反斜線加普通字符作為正則表達(dá)式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 解決Linux系統(tǒng)yum安裝報(bào)錯(cuò)Cannot find a valid baseurl for repo的問題

    解決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í)例代碼

    socket unix domain IPC的實(shí)例代碼

    下面小編就為大家?guī)硪黄猻ocket unix domain IPC的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Linux dig命令的用法解讀

    Linux dig命令的用法解讀

    dig是用于查詢DNS信息的命令行工具,比nslookup更靈活,支持A、MX等記錄類型查詢,常用選項(xiàng)如+short、+trace可精簡輸出或追蹤解析路徑,適用于調(diào)試和域名解析分析,需安裝dnsutils或bind-utils獲取
    2025-07-07

最新評(píng)論

安义县| 西乌珠穆沁旗| 云和县| 湖北省| 平泉县| 崇文区| 离岛区| 尉犁县| 乌兰察布市| 贵溪市| 平凉市| 孙吴县| 兴安县| 桂阳县| 铜鼓县| 正宁县| 清水县| 渝中区| 高雄市| 吴堡县| 霍山县| 阿合奇县| 海林市| 蛟河市| 西吉县| 德庆县| 密云县| 措勤县| 赤峰市| 阿克| 会昌县| 遵化市| 额尔古纳市| 玉田县| 吉林市| 嘉祥县| 深水埗区| 扬中市| 南乐县| 吉林省| 清河县|