Jenkins 自定义maven代理、构建镜像、邮件发送

704 阅读3分钟

云原生 从docker、Jenkins、Kubernetes从入门到精通系列

1. 环境检查&分段代理问题

环境检查阶段,使用 mvn -v 无法输出maven环境信息。

image.png

这里使用分阶段代理,
注意:

  1. 如果使用阶段代理,需要安装插件,Docker pipeline插件
  2. 插件下不下来 需要更换 jenkins插件源 ->
    http://mirror.xmission.com/jenkins/updates/update-center.json
  3. 上面的代理,没必要是none,如果是none,下面每一个stage都必须指定自己的。
stage('Back-end') {
            # 这个agent,即当前阶段的代理。
            agent {
                docker { image 'maven:3-alpine' }
            }
            steps {
                sh 'mvn --version'
            }
        }

2. 自定义maven代理,使用自定义配置文件

分段代理问题解决之后,使用下面的指令去部署服务,会发现,这里是从maven中央仓库拉取jar包,而不是阿里云镜像源,或者说是,在某些情况下,我们需要从我们的私服中拉取jar包,这个时候,就需要自定义maven代理。

image.png

配置maven加速的步骤:

  • 把maven的配置文件放在jenkins-data的某个位置
  • 默认所有的可变配置项都推荐放在jenkins-home的位置,增强移植性
  • 使用自定义maven的配置文件
  • 指定mvn的依赖目录,让其不是每次都下载

4.1 创建目录并放mvn配置文件

# 查看所有的容器
docker ps
# 查看jenkins的卷
docker volume inspect jenkins-data 
# 进入jenkins-data
cd /var/lib/docker/volumes/jenkins-data/_data
# 创建配置文件文件夹
mkdir appconfig
# 之后将所有的配置文件都放在这个文件夹下
cd appconfig
# 创建maven的配置文件的文件夹
mkdir maven
cd maven
# 将maven配置文件复制进来
vim settings.xml
# 将下面的xml文件复制进来

maven的配置文件【使用阿里云代理】

<?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">
    <!-- localRepository
    | The path to the local repository maven will use to store artifacts.
    |
    | Default: ${user.home}/.m2/repository
    <localRepository>H:\Devsoft\apache-maven-3.6.1\repository</localRepository>
    用户目录下的.m2是所有jar包的地方; maven容器内jar包的位置
    -->
    <localRepository>/root/.m2</localRepository>
    <pluginGroups>
    </pluginGroups>
    <proxies>
    </proxies>
    <servers>
    </servers>
    <mirrors>
        <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>
    <profiles>
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles>
</settings>

之后,修改jenkinsfile中的指令如下:

        stage('环境检查'){
            steps {
               sh 'printenv'
               echo "正在检测基本信息"
               sh 'java -version'
               sh 'git --version'
               sh 'docker version'
               sh 'pwd && ls -alh'
               sh "echo $hello"
               //未来,凡是需要取变量值的时候,都用双引号
               sh 'echo ${world}'
            }
        }

        stage('maven编译'){
            agent {
                docker {
                    image 'maven:3-alpine'
                 }
            }
            steps{
                sh 'pwd && ls -alh'
                sh 'mvn -v'
                // 打包,jar
                sh 'mvn clean package -s /var/jenkins_home/appconfig/maven/settings.xml  -Dmaven.test.skip=true'
                // jar包推送给 mvn 仓库
            }
        }

重新构建,即可。

image.png

jenkins使用docker去构建,其实也是在外部docker构建一个同等级的容器,所以有两种方式去构建,第一种是直接外部容器挂载,第二种是在jenkins的挂载目录中添加文件,使用jenkins流水线去指定绝对路径,这样对移植性也比较好。

image.png

第一种方式的实现【不推荐使用】:

    image 'maven:3-alpine'
    args  '-v /a/settings.xml:/app/settings.xml'
    // docker run -v /a/settings.xml:/app/settings.xml

4.2 指定mvn的依赖目录,让其不是每次都下载
我们每次构建的时候,mvn都会重新下载,这里需要在代理里面对其进行目录挂载,具体操作如下:

# 编辑jenkinsfile文件,添加 args
agent {
    docker {
        image 'maven:3-alpine'
        args '-v /var/jenkins_home/appconfig/maven/.m2:/root/.m2'
     }
}
# 重新构建项目

原理:这里声明了maven容器的卷挂载,将/root/.m2挂载到宿主机上,这样,每次启动,是新的maven容器,但是宿主机上面确是有jar包的,所以不需要重新拉取。

image.png

3. 打包 & 构建镜像 & 找不到jar包

  • 在环境检查阶段,会将我们的代码检出,并放在当前的工作目录,/var/jenkins_home/workspace/【java-devops-demo】
  • maven编译阶段,使用docker临时容器,临时容器会分配一个临时的目录/var/jenkins_home/workspace/java-devops-demo@2;
  • 在临时容器里面,运行的 mvn package命令,会在/var/jenkins_home/workspace/java-devops-demo@2进行工作
  • package到了/var/jenkins_home/workspace/java-devops-demo@2;这个位置
  • 每一次当前阶段运行开始,都会重置到默认的工作目录,而不是临时容器目录。
  • 下一步进行打包镜像,又会回到默认位置,这个位置没有运行过 mvn clean package,没有target。那么没有target就无法构建生成镜像。【这里使用Dockerfile进行构建】

问题解决:

  • 添加环境变量 WS = "${WORKSPACE}"
  • 在编译阶段,将target放在默认的工作目录sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true'
  • 打包阶段,添加sh 'docker build -t java-devops-demo .'指令 进行打包
  • 部署阶段,添加 sh 'docker rm -f java-devops-demo-dev'sh 'docker run -d -p 8888:8080 --name java-devops-demo-dev java-devops-demo'这两个部署指令
  • 部署完成,访问,http://ip:8888/hello 进行访问.

注:我的代码里面写了一个controller,所以,可以访问hello。我的代码地址:https://gitee.com/liu_lin_fang/java-devops-demo.git

dockerfile文件如下:

#这个也得有
FROM openjdk:8-jre-alpine
LABEL maintainer="123456789@qq.com"
#复制打好的jar包
COPY target/*.jar /app.jar
RUN  apk add -U tzdata; \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime; \
echo 'Asia/Shanghai' >/etc/timezone; \
touch /app.jar;

ENV JAVA_OPTS=""
ENV PARAMS=""

EXPOSE 8080

ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS" ]

4. 插件安装

以下是经常用到的插件:

  • Docker Pipeline && Docker
    • 安装Docker Pipeline会自动安装docker相关的
    • 这个允许我们自定义agent使用docker环境
  • Git Parameter
    • 解析git参数,允许我们选择分支进行构建
  • Active Choices
    • 可以做到参数的级联选择
  • Generic Webhook Trigger
    • 通用的webhook触发器,构建更强大的webhook功能
  • Role-based Authorization Strategy
    • RBAC权限指定,给一个用户精确指定权限
  • List Git Branches Parameter
    • 列出分支参数
  • Build With Parameters
    • 基于自定义参数构建

5. 邮件发送

在每个阶段完成之后,可以根据成功或者失败写后置执行的代码。当然也可以写在和stages同级。

    //后置执行
    post {
      failure {
        // One or more steps need to be included within each condition's block.
        echo "炸了.. ."
      }

      success {
        echo "成了..."
      }
    }

如果要配置邮箱,则可以参考流水线语法,配置部分如下:

image.png

image.png

image.png

注意:1. 登录自己邮箱,开启POP3/SMTP邮件服务
2. 配置完这部分之后,先保存,然后再测试发送邮件,之前没有保存点击发送,没成功