Skip to content

一、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, 将自动配置代理的namesecret,不需要对容器进行任何特殊配置。
  • 镜像中封装了常见的工具,可自行选择
  • 为了提高构建速度,可将/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

参数化构建的项目,需要先构建一次(忽略第一次构建报错),才能在参数化构建中选择。

最近更新

采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟