主题
一、Maven构建工具实践
1.1 Maven构建工具简介
Maven是Apache软件基金会下的一个构建和项目管理工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
- Maven主要特点
- 依赖管理:自动下载和管理第三方依赖
- 统一的项目结构:标准化的目录结构和构建流程
- 生命周期管理:清晰定义的项目生命周期阶段
- 插件机制:丰富的插件生态系统
1.2 Maven配置
1.2.1 安装Maven
TIP
JDK要求: Maven 3.9+ requires JDK 8 or above to execute.
maven本地缓存目录: 默认为 ${user.home}/.m2/repository
- 配置阿里云Maven全局代理加速
bash
wget https://archive.apache.org/dist/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz
tar -xf apache-maven-3.9.9-bin.tar.gz -C /home/application && rm -rf apache-maven-3.9.9-bin.tar.gz
ls -l /home/application/apache-maven-3.9.9
总用量 48
drwxr-xr-x 2 root root 4096 6月 4 15:24 bin
drwxr-xr-x 2 root root 4096 6月 4 15:24 boot
drwxr-xr-x 3 root root 4096 8月 14 2024 conf
drwxr-xr-x 4 root root 4096 6月 4 15:24 lib
-rw-r--r-- 1 root root 18920 8月 14 2024 LICENSE
-rw-r--r-- 1 root root 5034 8月 14 2024 NOTICE
-rw-r--r-- 1 root root 1279 8月 14 2024 README.txt
bash
mkdir ~/.m2
touch ~/.m2/settings.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
</settings>
bash
cat >> /etc/profile << 'EOF'
#maven
export M2_HOME=/home/application/apache-maven-3.9.9
export PATH=$M2_HOME/bin:$PATH
EOF
#使配置生效
source /etc/profile
#验证
mvn -v
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: /home/application/apache-maven-3.9.9
Java version: 17.0.2, vendor: Oracle Corporation, runtime: /home/application/jdk-17.0.2
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "5.10.0-209.0.0.117.oe2203sp3.x86_64", arch: "amd64", family: "unix"
TIP
如果想使用其它代理仓库,可在节点中加入对应的仓库使用地址。以使用spring代理仓为例
xml
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
1.2.2 常用Maven命令
bash
mvn clean #清理构建目录
mvn clean package #打包
mvn clean install #打包部署
mvn clean test #单元测试
mvn clean package -f ../pom.xml # -f指定pom位置
mvn clean package -DskipTests / -Dmaven.test.skip=true #跳过单元测试
mvn deploy #发布包到制品库
1.3 Jenkins集成Maven
1.3.1 准备一个java项目
1.3.2 创建一个freestyle项目
- 创建JOB
- 源码管理
- 增加构建步骤/Execute shell
bash
#指定JDK
export JAVA_HOME=/home/application/jdk-17.0.2
#打印mvn版本信息
mvn -v
#打包
mvn clean package
#查看制品
ls -l target/*
- 保存,构建
1.3.3 创建一个pipeline项目
- 创建JOB
- 编写pipeline脚本
groovy
pipeline {
agent any
stages {
stage("拉取代码"){
steps {
script {
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/maven-demo.git']])
}
}
}
stage("maven构建"){
steps {
script {
sh """
export JAVA_HOME=/home/application/jdk-17.0.2
mvn -v
mvn clean package
ls -l target/**
"""
}
}
}
}
}
1.3.4 指定任务在docker-slave节点上构建
Readme
在docker-slave节点上构建 需要使用到Docker-plugin 插件,docker-slave及使用方法不在此讨论,后续单独讨论
- 编写Jenkins-slave Dockerfile文件
Readme
- 基础镜像来源于
jenkins/inbound-agent:latest-jdk17
,此镜像自带jdk17,官方Dockerfile: https://github.com/jenkinsci/docker-agent/blob/master/debian/Dockerfile jenkins slave
节点通过JNLP
的方式连接jenkins master
, 将自动配置代理的name
和secret
,不需要对容器进行任何特殊配置。- 镜像中封装了常见的工具,可自行选择
- 为了提高构建速度,可将
/root/.m2
挂载到docker宿主机上/home/application/jenkins/maven-cache
,并配置阿里云Maven
加速配置
yaml
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17
# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for maven:3.9.10"
LABEL version="1.0"
# 切换到root用户进行安装配置
USER root
# 设置环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
LANGUAGE=C.UTF-8 \
LC_ALL=C.UTF-8 \
MAVEN_HOME=/opt/maven \
MAVEN_VERSION=3.9.10
# 配置系统设置和安装必要工具
RUN set -eux; \
# 更换Debian源为腾讯云镜像
sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
# 配置时区
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
# 更新包列表并安装必要工具
apt-get update && \
apt-get install -y \
bash-completion \
bc \
cifs-utils \
curl \
dnsutils \
g++ \
gcc \
git \
git-lfs \
htop \
iftop \
iotop \
jq \
lrzsz \
nmap \
netcat-openbsd \
nethogs \
net-tools \
ntpdate \
openssh-server \
psmisc \
sysstat \
tar \
telnet \
tzdata \
unzip \
vim \
wget && \
# 安装Maven 3.9.10
mkdir -p ${MAVEN_HOME} && \
wget https://cnb.cool/srebro/docker-images/-/releases/download/V1.0.0/apache-maven-${MAVEN_VERSION}-bin.tar.gz -O /tmp/apache-maven.tar.gz && \
tar -xzf /tmp/apache-maven.tar.gz -C ${MAVEN_HOME} --strip-components=1 && \
rm -f /tmp/apache-maven.tar.gz && \
ln -s ${MAVEN_HOME}/bin/mvn /usr/bin/mvn && \
# 清理apt缓存
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# 为root用户创建Maven配置目录和文件
mkdir -p /root/.m2 && \
touch /root/.m2/settings.xml
# 切换回jenkins用户以提高安全性
USER jenkins
# 设置jenkins用户的Maven环境变量
ENV PATH="${MAVEN_HOME}/bin:${PATH}"
bash
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:maven3.9.10 .
bash
mkdir -p /home/application/jenkins/maven-cache
Docker Agent templates
- 进入
Jenkins管理界面 > 系统配置 > Clouds
- 选择
已有的cloud云节点 > configure > Docker Agent templates > 进度条拖到最下面 > Add Docker Template
- 进入
Readme
- 配置maven缓存目录
type=bind,source=/home/application/jenkins/maven-cache,target=/root/.m2
- 创建pipeline脚本
groovy
pipeline {
agent {
label 'maven-3.9.10'
}
stages {
stage('打印版本') {
steps {
sh 'java -version'
sh 'mvn -v'
}
}
stage('拉取代码') {
steps {
script {
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/maven-demo.git']])
}
}
}
stage('构建(maven)') {
steps {
script {
sh 'pwd'
sh "mvn clean package -Dmaven.test.skip=true"
}
}
}
}
}
- 构建并查看结果
1.3.5 使用不同的maven版本构建JOB
- 编写Jenkins-slave Dockerfile文件
yaml
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17
# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for maven:3.9.10"
LABEL version="1.0"
# 切换到root用户进行安装配置
USER root
# 设置环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
LANGUAGE=C.UTF-8 \
LC_ALL=C.UTF-8 \
MAVEN_HOME=/opt/maven \
MAVEN_VERSION=3.9.10
# 配置系统设置和安装必要工具
RUN set -eux; \
# 更换Debian源为腾讯云镜像
sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
# 配置时区
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
# 更新包列表并安装必要工具
apt-get update && \
apt-get install -y \
bash-completion \
bc \
cifs-utils \
curl \
dnsutils \
g++ \
gcc \
git \
git-lfs \
htop \
iftop \
iotop \
jq \
lrzsz \
nmap \
netcat-openbsd \
nethogs \
net-tools \
ntpdate \
openssh-server \
psmisc \
sysstat \
tar \
telnet \
tzdata \
unzip \
vim \
wget && \
# 安装Maven 3.9.10
mkdir -p ${MAVEN_HOME} && \
wget https://cnb.cool/srebro/docker-images/-/releases/download/V1.0.0/apache-maven-${MAVEN_VERSION}-bin.tar.gz -O /tmp/apache-maven.tar.gz && \
tar -xzf /tmp/apache-maven.tar.gz -C ${MAVEN_HOME} --strip-components=1 && \
rm -f /tmp/apache-maven.tar.gz && \
ln -s ${MAVEN_HOME}/bin/mvn /usr/bin/mvn && \
# 清理apt缓存
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# 为root用户创建Maven配置目录和文件
mkdir -p /root/.m2 && \
touch /root/.m2/settings.xml
# 切换回jenkins用户以提高安全性
USER jenkins
# 设置jenkins用户的Maven环境变量
ENV PATH="${MAVEN_HOME}/bin:${PATH}"
bash
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17
# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for maven:3.6.3"
LABEL version="1.0"
# 切换到root用户进行安装配置
USER root
# 设置环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
LANGUAGE=C.UTF-8 \
LC_ALL=C.UTF-8 \
MAVEN_HOME=/opt/maven \
MAVEN_VERSION=3.6.3
# 配置系统设置和安装必要工具
RUN set -eux; \
# 更换Debian源为腾讯云镜像
sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
# 配置时区
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
# 更新包列表并安装必要工具
apt-get update && \
apt-get install -y \
bash-completion \
bc \
cifs-utils \
curl \
dnsutils \
g++ \
gcc \
git \
git-lfs \
htop \
iftop \
iotop \
jq \
lrzsz \
nmap \
netcat-openbsd \
nethogs \
net-tools \
ntpdate \
openssh-server \
psmisc \
sysstat \
tar \
telnet \
tzdata \
unzip \
vim \
wget && \
# 安装Maven 3.6.3
mkdir -p ${MAVEN_HOME} && \
wget https://cnb.cool/srebro/docker-images/-/releases/download/V1.0.0/apache-maven-${MAVEN_VERSION}-bin.tar.gz -O /tmp/apache-maven.tar.gz && \
tar -xzf /tmp/apache-maven.tar.gz -C ${MAVEN_HOME} --strip-components=1 && \
rm -f /tmp/apache-maven.tar.gz && \
ln -s ${MAVEN_HOME}/bin/mvn /usr/bin/mvn && \
# 清理apt缓存
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# 为root用户创建Maven配置目录和文件
mkdir -p /root/.m2 && \
touch /root/.m2/settings.xml
# 切换回jenkins用户以提高安全性
USER jenkins
# 设置jenkins用户的Maven环境变量
ENV PATH="${MAVEN_HOME}/bin:${PATH}"
bash
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:maven3.9.10 .
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:maven3.6.3 .
Docker Agent templates
- 进入
Jenkins管理界面 > 系统配置 > Clouds
- 选择
已有的cloud云节点 > configure > Docker Agent templates > 进度条拖到最下面 > Add Docker Template
- 进入
Readme
- 需要配置多个Docker Agent模板,每个模板对应一个Docker镜像
- 同时,配置maven缓存目录
type=bind,source=/home/application/jenkins/maven-cache,target=/root/.m2
- 创建JOB
- 创建pipeline脚本
groovy
pipeline {
parameters {
choice choices: ['maven-3.6.3', 'maven-3.9.10'], description: 'maven版本', name: 'maven_version'
}
agent {
label "${maven_version}"
}
stages {
stage('拉取代码'){
steps {
script {
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/maven-demo.git']])
}
}
}
stage('打印版本') {
steps {
sh 'java -version'
sh 'mvn -v'
}
}
stage('构建(maven)') {
steps {
script {
sh 'pwd'
sh "mvn clean package -Dmaven.test.skip=true"
}
}
}
}
}
- 构建JOB
WARNING
参数化构建的项目,需要先构建一次(忽略第一次构建报错),才能在参数化构建中选择。