【Jenkins】调整到实战教程

引言
>Jenkins是开源自动化服务器,主司持续集成与交付。插件丰富,兼Git/Maven/Docker/K8s
文章目录
一、环境部署
1.1 Gitlab安装
通过docker容器安装比较快捷和高效,命令如下:
mkdir /opt/gitlab/
vim docker-compose.yml
# docker-compose.yml
version: "3.8"
services:
gitlab:
image: registry.gitlab.cn/omnibus/gitlab-jh:latest
container_name: gitlab
hostname: 192.168.88.160 # 对应 --hostname
restart: always # 对应 --restart always
shm_size: '256m' # 对应 --shm-size 256m
ports:
- "80:80"
- "443:443"
volumes:
- /opt/gitlab/config:/etc/gitlab:Z
- /opt/gitlab/logs:/var/log/gitlab:Z
- /opt/gitlab/data:/var/opt/gitlab:Z
给宿主机的/opt/gitlab目录打上标签,才能让SELinux允许容器操作该目录
yum install -y policycoreutils-python
semanage fcontext -a -t container_file_t "/opt/gitlab(/.*)?"
restorecon -Rv /opt/gitlab
完成上述步骤,启动容器即可,第一次运行大约需要5分钟左右。
docker compose up -d
容器成功运行后,查看文件获取密码
cat /opt/gitlab/config/initial_root_password

1.2 Jenkins安装
步骤基本保持不变,命令如下:
mkdir /opt/jenkins_home
sudo chown -R 1000:1000 /opt/jenkins_home
建议使用我们自己上传的JDK8和Maven3.9.8,不推荐直接使用Jenkins内部自带的

Dockerfile配置如下:
# 使用 ARG 定义版本,方便管理和修改
ARG JDK_VERSION=8u202
ARG MAVEN_VERSION=3.9.8
ARG JENKINS_SHA=81b3abcc0f24cea48e74effe152f69dc5f0d880edc0c2737c61446b3c5992c00
# 第一阶段:构建工具镜像
FROM eclipse-temurin:21-jdk as builder
USER root
# 安装基础工具,确保 tar 已安装
# 此阶段也替换为正确的Ubuntu国内源以加速
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
apt-get update && apt-get install -y tar && apt-get clean
WORKDIR /opt/downloads
# 从本地复制并安装您宿主机的 JDK
COPY jdk-8u202-linux-x64.tar.gz ./jdk.tar.gz
RUN mkdir -p /usr/lib/jvm && \
tar -xzf jdk.tar.gz -C /usr/lib/jvm/ && \
# 使用更通配的 mv 命令,因为解压后的目录名可能不同
mv /usr/lib/jvm/jdk1.8* /usr/lib/jvm/jdk8 && \
rm jdk.tar.gz
# 从本地复制并安装您宿主机的 Maven
COPY apache-maven-3.9.8-bin.tar.gz ./maven.tar.gz
RUN mkdir -p /usr/share/maven && \
tar -xzf maven.tar.gz -C /usr/share/maven --strip-components=1 && \
rm maven.tar.gz
COPY settings.xml /usr/share/maven/conf/settings.xml
# 第二阶段:运行时镜像
FROM eclipse-temurin:21-jdk
# 这里的值已无实际作用,但保留 ARG 声明是好习惯
ARG JENKINS_SHA
# 安装基础依赖,包括 git 和 docker-cli,并全部切换为国内镜像源
RUN \
# 步骤 1: 替换 Ubuntu APT 源为阿里源
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
\
# 步骤 2: 更新apt缓存并安装基础工具
apt-get update && \
apt-get install -y --no-install-recommends \
git \
ca-certificates \
curl \
gnupg && \
\
# 步骤 3: 添加 Docker 官方 GPG 密钥 (使用阿里源 for Ubuntu)
install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
chmod a+r /etc/apt/keyrings/docker.gpg && \
\
# 步骤 4: 设置 Docker 的 apt 仓库 (使用阿里源 for Ubuntu)
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null && \
\
# 步骤 5: 更新 apt 包索引并安装 Docker CLI
apt-get update && \
apt-get install -y --no-install-recommends docker-ce-cli && \
\
# 步骤 6: 清理apt缓存,保持镜像整洁
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/lib/jvm/jdk8 /usr/lib/jvm/jdk8
COPY --from=builder /usr/share/maven /usr/share/maven
ENV JAVA_HOME=/usr/lib/jvm/jdk8 \
JAVA21_HOME=/opt/java/openjdk \
MAVEN_HOME=/usr/share/maven \
JENKINS_HOME=/var/jenkins_home \
PATH="/usr/share/maven/bin:/usr/lib/jvm/jdk8/bin:/opt/java/openjdk/bin:$PATH"
RUN mkdir -p /var/jenkins_home
WORKDIR /opt
# 从本地复制 jenkins.war 并使用您提供的 SHA 值进行校验
COPY jenkins.war .
RUN echo "${JENKINS_SHA} jenkins.war" | sha256sum -c -
EXPOSE 8080 50000
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s \
CMD curl -fsS http://localhost:8080/login > /dev/null || exit 1
CMD ["/opt/java/openjdk/bin/java", "-Djava.awt.headless=true", "-jar", "/opt/jenkins.war", "--httpPort=8080"]
docker-compose.yml配置如下:
version: "3.8"
services:
gitlab:
image: registry.gitlab.cn/omnibus/gitlab-jh:latest
container_name: gitlab
hostname: 192.168.88.160
restart: always
shm_size: '256m'
ports:
- "80:80"
- "443:443"
volumes:
- /opt/gitlab/config:/etc/gitlab:Z
- /opt/gitlab/logs:/var/log/gitlab:Z
- /opt/gitlab/data:/var/opt/gitlab:Z
jenkins:
build:
context: .
dockerfile: Dockerfile
container_name: jenkins
restart: always
user: root
privileged: true
ports:
- "8081:8080"
- "50000:50000"
volumes:
- /opt/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
environment:
- JAVA_OPTS=-Duser.timezone=Asia/Shanghai
运行成功后,查看初始密码
cat /opt/jenkins_home/secrets/initialAdminPassword
成功访问后,初次会安装一些对应的插件,时间有点长

插件安装成功后,会提示你新建一个管理员用户,这里我设置了admin/admin

二、基本构建
2.1 初步配置
先在插件市场安装Maven的插件

指定我们自己的jdk

指定我们自己的Maven

2.2 案例运行
这里新建一个任务 -- demo

Root POM的指定,需要和工作空间的目录保持一致。这里我的pom文件正好位于/var/jenkins_home/workspace/demo目录下


点击构建运行,至此入门案例成功

2.3 远程传输
当我们在jenkins构建完成后,想通过SSH将构建后的jar传输到远程测试服务器。
安装SSH插件

在“系统配置”里设置远程服务器的信息

任务的配置更改:

这里仅作简单的演示,一般也很少直接运行jar包,下面介绍docker镜像的操作
三、构建触发
3.1 远程触发
先安装插件,支持未登录状态下可以通过Token直接触发访问

在配置中定义token

保存后,直接访问url即可以去触发自动构建。将job和token更换成你自己的任务
http://192.168.88.160:8081/buildByToken/build?job=demo&token=123456
当你的 Webhook 目标地址是内部网络中的服务,需要勾选下面的选项

在项目的Wenhooks上配置触发来源和url即可

此时我们推送了代码,创建合并请求,审核通过合并请求,会触发三次构建

这里还有第二种方法,对比第一种相对安全一些。
首先就是安装插件

触发器配置



3.2 定时构建
顾名思义,就是写一个cron表达式,定时去构建触发

H代码任务名的hash值,是一个伪随机数,可以避免多个项目同时触发,导致占用大量资源
下面是多种构建方式的总结

3.3 邮件通知
在网易邮箱开启SMTP功能

在系统配置里面设置发送方的邮箱




邮箱内容可以自定义,或者使用我的:
(Jenkins构建邮件,无需回复!)
项目名称:$PROJECT_NAME
项目描述:$JOB_DESCRIPTION
运行编号:$BUILD_NUMBER
运行结果:$BUILD_STATUS
触发原因:${CAUSE}
构建日志地址:${BUILD_URL}console
构建地址:$BUILD_URL
详情:${JELLY_SCRIPT,template="html"}
系统邮箱设置:

任务的构建后配置


注意:如果出现控制台提示邮箱发送成功,但是实际却并没有收到邮箱。不要怀疑,80%是你的Credentials没有正确配置!
四、容器构建
4.1 镜像构建
先在当前的项目中建立一个Dockerfile文件,基本的配置如下:
FROM openjdk:8-jre-alpine
WORKDIR /app
ADD target/jenkins_version1-0.0.1-SNAPSHOT.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
指定构建的jdk版本,如果没有该选项去下载JDK Parameter插件

在shell里面去编写构建镜像,删除旧镜像,运行新镜像的命令

点击构建,查看控制台可以看见构建镜像成功

4.2 流水线构建
流水线就是将上面可视化的UI,变成代码的形式,便于复用和转移。在ai时代,直接让ai生成一份带注释的pipeline再对应改一下就行。

其余的任务参数都可以不用配置,只改一下script代码就行

这里是我的案例代码,需要的话自行修改就可以
pipeline {
agent any
tools {
maven 'maven'
}
environment {
IMAGE_NAME = 'jenkins-demo'
CONTAINER_NAME = 'jenkins-demo'
}
stages {
stage('拉取代码') {
steps {
cleanWs()
// 所有的脚本逻辑都必须放在 script 块中
script {
def scmVars = git branch: 'main',
url: 'http://192.168.88.160/root/jenkins_version1.git'
def commitHash = scmVars.GIT_COMMIT
echo "成功捕获到 Git Commit ID: ${commitHash}"
// 核心修正点 2: 将 Commit ID 写入文件,然后 stash 它
writeFile file: 'COMMIT_ID.txt', text: commitHash
stash name: 'commit-info', includes: 'COMMIT_ID.txt'
}
}
}
stage('执行构建') {
steps {
sh "mvn --version"
sh "mvn clean package -DskipTests=true"
echo 'Maven 构建成功!'
stash name: 'jar-file', includes: 'target/*.jar'
}
}
stage('构建并部署Docker镜像') {
steps {
// 取出 JAR 包和 Commit ID 文件
unstash 'jar-file'
unstash 'commit-info'
script {
// 读取文件内容来获取 Commit ID
def gitCommitHash = readFile('COMMIT_ID.txt').trim()
echo "开始处理容器: ${CONTAINER_NAME}"
def existingContainer = sh(
script: "docker ps -a -q -f name=${CONTAINER_NAME}",
returnStdout: true
).trim()
if (existingContainer) {
echo "发现正在运行的旧容器: ${existingContainer},正在停止并删除..."
sh "docker stop ${CONTAINER_NAME}"
sh "docker rm ${CONTAINER_NAME}"
echo "旧容器已清理。"
} else {
echo "没有发现正在运行的旧容器,无需清理。"
}
def IMAGE_TAG = gitCommitHash.take(8)
def imageNameWithTag = "${IMAGE_NAME}:${IMAGE_TAG}"
echo "开始构建镜像: ${imageNameWithTag}"
sh "docker build -t ${imageNameWithTag} ."
echo "启动新容器..."
sh "docker run -d -p 8090:8080 --name ${CONTAINER_NAME} ${imageNameWithTag}"
echo "部署成功!"
}
}
}
}
post {
always {
// 清理本次 stash 的文件,保持工作区干净
cleanWs()
echo '流水线执行完毕。'
}
success {
echo '部署成功!'
}
failure {
echo '流水线失败,请检查日志!'
}
}
}
扩展:推荐在jenkins下载使用Blue Ocean插件。同时使用VSCode编写脚本,下载ai插件和jenkins插件,写流水线代码比较方便。



浙公网安备 33010602011771号