【Jenkins】配置到实战教程
引言
>Jenkins是开源自动化服务器,主司持续集成与交付。插件丰富,兼Git/Maven/Docker/K8s
文章目录
引言
一、环境部署
1.1 Gitlab安装
1.2 Jenkins安装
二、基本构建
2.1 初步配置
2.2 案例运行
2.3 远程传输
三、构建触发
3.1 远程触发
3.2 定时构建
3.3 邮件通知
四、容器构建
4.1 镜像构建
4.2 流水线构建
一、环境部署
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:latestcontainer_name: gitlabhostname: 192.168.88.160 # 对应 --hostnamerestart: always # 对应 --restart alwaysshm_size: '256m' # 对应 --shm-size 256mports:- "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 builderUSER 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.gzCOPY 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 CLIapt-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/mavenENV 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_homeWORKDIR /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:latestcontainer_name: gitlabhostname: 192.168.88.160restart: alwaysshm_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:Zjenkins:build:context: .dockerfile: Dockerfilecontainer_name: jenkinsrestart: alwaysuser: rootprivileged: trueports:- "8081:8080"- "50000:50000"volumes:- /opt/jenkins_home:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.sockenvironment:- 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功能
在系统配置里面设置发送方的邮箱
邮箱内容可以自定义,或者使用我的:
<hr/>(Jenkins构建邮件,无需回复!)<br/><hr/>项目名称:$PROJECT_NAME<br/><br/>项目描述:$JOB_DESCRIPTION<br/><br/>运行编号:$BUILD_NUMBER<br/><br/>运行结果:$BUILD_STATUS<br/><br/>触发原因:${CAUSE}<br/><br/>构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><br/>构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><br/>详情:${JELLY_SCRIPT,template="html"}<br/><hr/>
系统邮箱设置:
任务的构建后配置
注意:如果出现控制台提示邮箱发送成功,但是实际却并没有收到邮箱。不要怀疑,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 anytools {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_COMMITecho "成功捕获到 Git Commit ID: ${commitHash}"// 核心修正点 2: 将 Commit ID 写入文件,然后 stash 它writeFile file: 'COMMIT_ID.txt', text: commitHashstash 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 IDdef 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插件,写流水线代码比较方便。