使用 Jenkins 的流水线方案实施 CI/CD

news/2025/9/29 20:18:11/文章来源:https://www.cnblogs.com/ljbguanli/p/19119447

使用 Jenkins 的流水线方案实施 CI/CD

一、Jenkins 环境准备(插件 + 工具配置)

       1.安装必要插件 

  • 进入 Jenkins Web 界面 → 系统管理 → 插件管理 → 可选插件

  • 搜索并安装:

    • Maven Integration(Maven 项目构建支持)。

    • Publish Over SSH(远程 SSH 部署)。

    • GitLab Plugin(若需 GitLab 触发流水线,可选)。

        2.配置 Maven 工具

  • 进入 Jenkins → 系统管理 → 全局工具配置

  • 找到 Maven 区域 → 点击 Maven 安装

    • Name:自定义(如 maven-3.9.6)。

    • 勾选 自动安装版本 选择 3.9.6 → 点击 保存

        3.配置 Publish Over SSH(远程部署到 Docker 主机)

  • 进入 Jenkins → 系统管理 → 系统配置
  • 找到 Publish over SSH 区域 → 点击 新增,配置 SSH 服务器:
    • Name:自定义(如 DockerHost)。
    • Hostname:Docker 主机的 IP / 域名(如 192.168.197.9)。
    • Username:远程主机用户名(如 root)。
    • Remote Directory:远程部署目录(如 /opt/jenkins_deploy,需提前创建)。
    • 展开 高级 → 勾选 Use password authentication → 输入远程主机 密码 → 点击 Test Configuration(验证显示 Success)→ 应用 → 保存
[root@host1 ~]# mkdir -p /opt/jenkins_deploy
[root@host1 ~]# ls -ld /opt/jenkins_deploy
drwxr-xr-x. 2 root root 6  9月 27 23:13 /opt/jenkins_deploy
[root@host1 ~]#

二、GitLab 与项目代码准备

        1.GitLab 新建空白项目

  • 登录 GitLab → New project → 选择 Create blank project

  • 项目名称:java-demo → 点击 Create project

        2.克隆仓库到本地并准备代码

[root@host1 ch07]# cd ~/ch07
[root@host1 ch07]# git clone ssh://git@gitlab.abc.com:2222/root/java-demo.git
正克隆到 'java-demo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (3/3), 完成.
[root@host1 ch07]# cd java-demo
[root@host1 java-demo]# cat > Dockerfile << EOF
FROM openjdk:18-jre
ARG app
ADD \$app app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
EOF

三、Jenkins 新建流水线项目

        1.新建流水线任务

  • 进入 Jenkins → 新建任务 → 任务名 java-demo → 选择 流水线 → 点击 确定

        2.配置源代码管理(关联 GitLab 仓库)

  • 在项目配置页 → 源代码管理 → 选择 Git

    • Repository URL:GitLab 项目的 SSH 地址(如 ssh://git@gitlab.abc.com:2222/root/java-demo.git)。

    • Credentials:选择之前配置的 GitLab SSH 凭据(若未配置,需先添加)。

    • Branches to build:改为 */main(GitLab 新仓库默认分支为 main)。

        3.配置流水线(从 Git 拉取 Jenkinsfile

  • Pipeline 区域 → 选择 Pipeline script from SCM

  • SCM 再次选择 Git → 重复仓库和凭据配置 → Script Path 填写 Jenkinsfile → 保存

四、编写 Jenkinsfile(定义 CI/CD 流程)

        在 java-demo 本地项目目录下,创建 Jenkinsfile,内容如下(需根据实际项目调整变量):

[root@host1 ~]# cd ~/ch07
[root@host1 ch07]# cd java-demo
[root@host1 java-demo]# vi Jenkinsfile
[root@host1 java-demo]# cat Jenkinsfile
pipeline {agent anytools {// 关联全局工具配置的 Maven 名称maven 'maven-3.9.6'}stages {stage('Build') {steps {// Maven 编译打包(跳过测试)sh 'mvn -B -DskipTests clean package'}}stage('Test') {steps {// Maven 执行测试sh 'mvn test'}post {always {// 生成 JUnit 测试报告junit allowEmptyResults: true, testResults: 'target/surefire-reports/*.xml'}}}stage('Docker Build & Push') {steps {// 构建并推送 Docker 镜像到私有仓库sh '''APP_JAR=$(ls target/*.jar | head -1)docker build --build-arg app=$APP_JAR -t registry.abc.com:5000/spring-boot-demo .docker push registry.abc.com:5000/spring-boot-demodocker rmi registry.abc.com:5000/spring-boot-demo'''}}stage('Deploy to Docker Host') {steps {// 通过 Publish Over SSH 远程运行 Docker 容器sshPublisher(publishers: [sshPublisherDesc(configName: 'DockerHost', transfers: [sshTransfer(cleanRemote: false,execCommand: '''docker rm -f spring-boot-demo || truedocker run -d -p 8080:8080 --name spring-boot-demo \registry.abc.com:5000/spring-boot-demo''',execTimeout: 120000,sourceFiles: '')])])}}}environment {// 定义环境变量(根据项目实际情况修改)REGISTRY_URL = 'registry.abc.com:5000'CONTAINER_NAME = 'spring-boot-demo'IMAGE_NAME = 'spring-boot-demo'}
}

五、提交代码到 GitLab

# 添加所有文件到暂存区
[root@host1 java-demo]# git add .
# 提交代码
[root@host1 java-demo]# git commit -m "Init Java project with Jenkins CI/CD"
[main 4c6ffcc] Init Java project with Jenkins CI/CD2 files changed, 67 insertions(+)create mode 100644 Dockerfilecreate mode 100644 Jenkinsfile
# 推送代码到 GitLab(首次推送需关联分支)
[root@host1 java-demo]# git push --set-upstream origin main
枚举对象中: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (4/4), 完成.
写入对象中: 100% (4/4), 1.26 KiB | 430.00 KiB/s, 完成.
总共 4(差异 0),复用 0(差异 0),包复用 0(来自  0 个包)
To ssh://gitlab.abc.com:2222/root/java-demo.git9434c2c..4c6ffcc  main -> main
分支 'main' 设置为跟踪 'origin/main'。

六、触发 Jenkins 流水线并验证

        1.手动触发构建

        进入 Jenkins 的 java-demo 项目 → 点击 立即构建

        2.查看构建日志

        点击构建任务 → 控制台输出,查看各阶段(Build、Test、Docker Build & Push、Deploy)的执行日志。

        3.验证部署结果

        在 Docker 主机执行以下命令,检查容器运行和应用访问:

[root@host1 java-demo]# curl http://192.168.197.9:8080
Hello from Spring Boot via Jenkins!

七、关键注意事项

  • 确保 registry.abc.com:5000 私有镜像仓库已启动(参考前文 Docker Registry 部署步骤)。

  • Publish Over SSH 的 configName 需与系统配置中定义的 SSH 服务器名称一致。

  • Maven 命令、Docker 镜像名、容器端口等需根据实际项目调整。

!!!部分纠错过程:

https://maven.aliyun.com/repository/public/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar
Downloaded from aliyunmaven: https://maven.aliyun.com/repository/public/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar (2.2 kB at 1.6 kB/s)
Downloaded from aliyunmaven: https://maven.aliyun.com/repository/public/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar (5.9 kB at 4.2 kB/s)
Downloaded from aliyunmaven: https://maven.aliyun.com/repository/public/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar (8.8 kB at 5.5 kB/s)
Downloaded from aliyunmaven: https://maven.aliyun.com/repository/public/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar (500 kB at 310 kB/s)
Downloaded from aliyunmaven: https://maven.aliyun.com/repository/public/com/google/guava/guava/28.2-android/guava-28.2-android.jar (2.6 MB at 1.4 MB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  52.768 s
[INFO] Finished at: 2025-09-28T01:31:32+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.12:repackage (repackage) on project java-demo: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.7.12:repackage failed: Unable to find main class -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
[root@host1 java-demo]# vi src/main/java/com/example/demo/DemoApplication.java
[root@host1 java-demo]# cat src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
[root@host1 java-demo]# git add src/main/java/com/example/demo/DemoApplication.java
[root@host1 java-demo]# git commit -m "Add Spring Boot main application class"
[main b7d9a73] Add Spring Boot main application class1 file changed, 13 insertions(+)create mode 100644 src/main/java/com/example/demo/DemoApplication.java
[root@host1 java-demo]# git push origin main
枚举对象中: 16, 完成.
对象计数中: 100% (16/16), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (4/4), 完成.
写入对象中: 100% (9/9), 732 字节 | 366.00 KiB/s, 完成.
总共 9(差异 1),复用 0(差异 0),包复用 0(来自  0 个包)
To ssh://gitlab.abc.com:2222/root/java-demo.git12fe51e..b7d9a73  main -> main
[root@host1 java-demo]# cat pom.xml4.0.0org.springframework.bootspring-boot-starter-parent2.7.12com.examplejava-demo0.0.1-SNAPSHOTjava-demoDemo project for Spring Boot1.8org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抚松做网站wordpress小程序二开

这几天公司在排查内部数据账号泄漏&#xff0c;原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub上&#xff0c;导致核心数据外漏&#xff0c;孩子还是没挨过社会毒打&#xff0c;这种事的后果可大可小。说起这个我是比较有感触的&#xff0c;之前我TM被删库…

湘潭网站建设出色磐石网络网站搭建详细教程

泛型&#xff0c;英文是generic。 泛型是一种参数化多态。就是把类型作为参数&#xff0c;使用时才指定具体类型。 这样一套代码可以应用于多种类型。比如Vec<T>&#xff0c;可以是整型向量Vec<i32>&#xff0c;也可以是浮点型向量Vec<f64>。 Rust中的泛型属…

重庆微信网站代理商把数据库wordpress

springboot注解扫描范围是由ComponentScan指定的;默认情况下为启动程序所在目录及其子包; 如果需要指定扫描路径&#xff0c;在启动程序中添加修改 ComponentScan(basePackages{"org.jstudio.a","org.jstudio.b"}) SpringBootApplication public class xxx…

平顶山市城乡建设职工培训网站花生壳官网免费域名申请

目录 一、Linux的哲学思想 1.1 基础知识 1.2 根目录下的文件夹 二、Shell 1、Shell的定义 2、Shell的作用 三、Linux命令行 1、Linux通用命令行使用格式 四、Linux命令的分类 1、内部命令和外部命令的理解 2、内部命令和外部命令的区别 3、命令的执行过程 五、编辑…

网站建设公司上海大连高端网页公司

文章目录 管道相关命令 目标 准备工作 1 cut 1.1 目标 1.2 路径 1.3 实现 2 sort 2.1 目标 2.2 路径 2.3 实现 第一步: 对字符串排序 第二步&#xff1a;去重排序 第三步: 对数值排序 默认按照字符串排序 升序 -n 倒序 -r 第四步: 对成绩排序【按照列排序】 …

婚纱定制网站哪个好如何开始做网站

redis源码剖析&#xff08;十五&#xff09;——客户端执行逻辑结构整理 加载略慢

解析网站怎么做成都网站建设招标

解决办法&#xff1a;安装laptop-mode-tools工具包。1.检查是否安装了grep laptop-mode-tools 工具包$ dpkg -l | grep laptop-mode-tools如果执行命令无结果输出&#xff0c;表示未安装(如果已安装&#xff0c;忽略第2步)2.安装laptop-mode执行命令&#xff1a;$ sudo apt-get…

怎样做网站后台iis做网站文件下载

一、源码特点 java Web火车查询管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

南昌模板建站定制个人养老金

生成的符号表达式&#xff0c;可能会存在过于冗长的问题&#xff0c;且多个符号表达式中&#xff0c;有可能存在相同的计算部分&#xff0c;如果不进行处理&#xff0c;计算过程中会导致某些算式计算多次&#xff0c;从而影响计算效率。 那么多个符号表达式生成函数时&#xf…

网站导航内链建设机加工订单网

一.Spring基础 1.Spring 框架是什么 Spring 是一款开源的轻量级 Java 开发框架&#xff0c;我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;例如&#xff0c;Spring core、Spring JDBC、Spring MVC 等&#xff0c;使用这些模块可…

递增子序列笔记

错题 leetcode 354. 俄罗斯套娃信封问题 错因和思路:1.心态:因为是自己原来做过的题目就掉以轻心了,导致情况没有考虑周全 2.思路:将宽度进行排序,高度没管,如果相同就不改变二分后找到的修改位置,显然这会少答…

MonoDETR(2)

实验结果如下:

记录---window.close()失效 + Chrome浏览器调试线上代码

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 情况说明主系统单点登录点击触发window.open()打开本系统。 是发布生产后的新需求:要求退出登录后直接关闭当前系统页面。 本地运行增加了window.close()方法实…

启发式合并 [USACO22DEC] Making Friends P

题意 \(N\) 牛 \(M\) 关系,按照编号从小到大,牛依次离开,每一头牛离开时它认识的牛会互相认识,求最后新增了多少朋友关系。 \(N,M\le 2\times 10^5\) 解法 我们将操作看成每个点边集合的合并,尝试使用启发式合并解…

ps企业站网站做多大网站建设功能覆盖范围

Truth Truth 是用于Java测试的断言框架&#xff0c;灵感来自于FEST&#xff0c;并受到一些可扩展性需求的驱动&#xff0c;几乎完全由谷歌员工在业余时间编写&#xff0c;或者作为Java核心图书馆管理员的身份做出贡献。 作用 作为工程师&#xff0c;我们花费大部分的时间来阅…

动易的网站能否静态提供o2o网站建设

#文件防泄密软件# 中科数安是一家专注于信息安全领域的高科技企业&#xff0c;其提供的防止公司内部文件资料及数据外泄的解决方案主要包括图档透明加密和源代码防泄露系统等核心服务。 中科数安 | 图档、源代码防止外泄系统 PC地址&#xff1a; www.weaem.com 1. 图档透明加…

加密的病例单

点击查看代码 #include<iostream> #include<cstring> using namespace std; char s[55]; char d[55]; int main() {gets_s(s);int len = strlen(s);s[len] = \0;d[len] = \0;for (int i = 0; i < len; …

【多线程】什么是原子操作(Atomic Operation)? - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:视频融合平台EasyCVR构筑智慧交通可视化管理与智能决策中枢

详细介绍:视频融合平台EasyCVR构筑智慧交通可视化管理与智能决策中枢pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

php高性能网站建设深圳微信网站开发公司

今日分享阿里云一面&#xff0c;给要准备就业的宝子们一点方向 1、自我介绍与项目介绍 2、八股文 Java的特性、Java的oop&#xff1f; Java有哪些方法来实现线程安全&#xff1f; 讲讲Spring中的AOP与IOC&#xff1f; synchronized锁怎么用&#xff1f; Mysql中右模糊查询用…