Jenkins 流水线全流程实战笔记

ps:两种形式,一种是构建jar 、一种是构建docker镜像image 按需实现,全栈项目同理。

Jenkins 流水线全流程实战笔记

核心架构思路

  1. 宿主机 (VPS):只安装 Docker,作为底层基座。
  2. Jenkins 容器 :作为"指挥官"。
    • 特权 :挂载 /var/run/docker.sock,使其拥有调用宿主机 Docker 的能力(即 Docker-in-Docker)。
    • 环境 :通过自定义 Dockerfile,内置 JDK 8 (用于编译旧项目) 和 Maven。
  3. 应用容器:由 Jenkins 指挥宿主机 Docker 生成并运行的最终服务。

第一阶段:搭建 Jenkins 基础设施

这一步的目标是构建一个**"全能版"**的 Jenkins 镜像,解决官方镜像没有 Maven 和 JDK 8 的问题。

1. 编写 Jenkins 基座 Dockerfile

文件名:Dockerfile (位于 Jenkins 部署目录)

Dockerfile

复制代码
# 基础镜像:官方最新 Jenkins LTS
FROM jenkins/jenkins:lts

USER root

# 1. 换源并安装基础工具 (Maven, Docker CLI)
# 注意:这里安装 Docker CLI 是为了在容器内能敲 docker 命令
RUN apt-get update && \
    apt-get install -y maven docker.io wget tar

# 2. 【关键】手动安装 JDK 8
# 原因:Jenkins 新版运行需要 JDK 11/17,但我们的项目需要 JDK 8 编译
# 方案:从 Temurin 官方源下载解压,后续在流水线中通过环境变量指定路径
RUN wget -q https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u402-b06/OpenJDK8U-jdk_x64_linux_hotspot_8u402b06.tar.gz -O /tmp/jdk8.tar.gz && \
    mkdir -p /opt/jdk8 && \
    tar -xzf /tmp/jdk8.tar.gz -C /opt/jdk8 --strip-components=1 && \
    rm /tmp/jdk8.tar.gz

# 3. 验证环境安装
RUN /opt/jdk8/bin/java -version && mvn -v && docker -v

2. 编排服务 docker-compose.yml

文件名:docker-compose.yml

YAML

复制代码
version: '3.8'

services:
  jenkins:
    # "build: ." 表示使用当前目录的 Dockerfile 构建镜像,而不是直接拉取
    build: .
    container_name: jenkins-pro
    restart: always
    ports:
      - "9090:8080"   # 面板端口:宿主机 9090 -> 容器 8080
      - "50000:50000" # 如果有从节点连接需要此端口
    volumes:
      - ./jenkins_data:/var/jenkins_home          # 数据持久化
      - /var/run/docker.sock:/var/run/docker.sock # 【核心】挂载 Docker 守护进程
      - /usr/bin/docker:/usr/bin/docker           # 映射 Docker 二进制文件

3. 启动与初始化

复制代码
# 构建镜像并后台启动容器(串行执行:先 build 后 up)
docker compose up -d --build
  • 解锁与安装
    1. 查看初始密码:docker logs -f jenkins-pro
    2. 访问 http://<你的IP>:9090,输入密码。
    3. 选择 "安装推荐插件"
    4. 安装 Gitee Plugin (系统管理 -> 插件管理)。
    5. 配置 Gitee 凭证 (API 令牌或账号密码) 和全局配置。

第二阶段:项目配置 (Git 仓库端)

这一步体现了 Pipeline as Code (流水线即代码) 的思想,将构建逻辑存放在代码仓库中。

1. 项目应用 Dockerfile

文件名:Dockerfile (位于项目根目录)

Dockerfile

复制代码
# 运行阶段只需要 JRE,使用 alpine 版本体积最小
FROM eclipse-temurin:8-jre-alpine

WORKDIR /app
VOLUME /tmp

# 拷贝编译后的 jar 包 (注意:这是 Jenkins 在上一阶段 maven package 生成的)
COPY target/*.jar app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

2. 流水线脚本 Jenkinsfile

文件名:Jenkinsfile (位于项目根目录)

Groovy

复制代码
pipeline {
    agent any

    // 【环境变量】强制指定使用我们在 Jenkins 容器里装好的 JDK 8
    environment {
        JAVA_HOME = "/opt/jdk8"
        PATH = "/opt/jdk8/bin:$PATH"
        APP_NAME = "my-boot-app"
    }

    stages {
        stage('1. 环境检测') {
            steps {
                sh "java -version" // 确认是 1.8
                sh "mvn -v"
            }
        }

        stage('2. 拉取代码') {
            steps {
                // 读取 Jenkins 任务配置的 Git 地址和凭证   ,scm代替了git clone 
                checkout scm
            }
        }

        stage('3. 编译打包') {
            steps {
                // 跳过测试,利用外网环境快速下载依赖并打包
                sh "mvn clean package -DskipTests"
            }
        }

        stage('4. Docker发布') {
            steps {
                script {
                    // 利用挂载的 docker.sock,在宿主机上构建镜像
                    sh "docker build -t ${APP_NAME}:latest ."

                    // 清理旧容器 (|| true 防止首次运行报错)
                    sh "docker rm -f ${APP_NAME} || true"

                    // 启动新容器,映射端口到宿主机
                    sh "docker run -d -p 8080:8080 --name ${APP_NAME} ${APP_NAME}:latest"
                }
            }
        }
    }
}

第三阶段:触发自动化 (Webhook)

实现 Git Push -> 自动发布 的闭环。

  1. Jenkins 端
    • 新建 Item -> 选择 Pipeline (流水线)
    • 流水线定义 :选择 Pipeline script from SCM -> Git -> 填入仓库地址。
    • 构建触发器 :勾选 Gitee webhook 触发构建,生成并复制 WebHook 密码
  2. Gitee 端
    • 仓库管理 -> WebHooks -> 添加。
    • 填入 Jenkins 给出的 URL 和 密码。
    • 事件勾选 Push

总结:数据流向图

  1. 开发提交 :你本地 IDEA git push 代码。
  2. 触发通知:Gitee 通过 Webhook 通知 Jenkins "有新代码了"。
  3. 环境准备:Jenkins 启动流水线,加载 JDK 8 环境。
  4. 编译构建 :Jenkins 执行 mvn package,生成 target/xxx.jar
  5. 镜像制作 :Jenkins 调用宿主机的 Docker,读取项目 Dockerfile,把 jar 包打成镜像。
  6. 服务部署:Jenkins 销毁旧容器,启动新容器(端口 8080)。

最终效果:代码提交后,喝杯水的功夫,服务器上的应用已经自动更新为最新版本。

相关推荐
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
ouliten2 小时前
cuda编程笔记(36)-- 应用Tensor Core加速矩阵乘法
笔记·cuda
孞㐑¥3 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
mango_mangojuice4 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
工程师老罗4 小时前
YOLOv1 核心知识点笔记
笔记·yolo
半壶清水6 小时前
[软考网规考点笔记]-软件开发、项目管理与知识产权核心知识与真题解析
网络·笔记·压力测试
tq10866 小时前
先探索,后设计
笔记
hnult6 小时前
2026 在线培训考试系统选型指南:核心功能拆解与选型逻辑
人工智能·笔记·课程设计
AI视觉网奇6 小时前
ue 角色驱动衣服 绑定衣服
笔记·学习·ue5
三水不滴7 小时前
计网ping原理
经验分享·笔记·计算机网络