云原生 从docker、Jenkins、Kubernetes从入门到精通系列
1. 环境检查&分段代理问题
环境检查阶段,使用 mvn -v 无法输出maven环境信息。
这里使用分阶段代理,
注意:
- 如果使用阶段代理,需要安装插件,
Docker pipeline插件 - 插件下不下来 需要更换 jenkins插件源 ->
http://mirror.xmission.com/jenkins/updates/update-center.json - 上面的代理,没必要是none,如果是none,下面每一个stage都必须指定自己的。
stage('Back-end') {
# 这个agent,即当前阶段的代理。
agent {
docker { image 'maven:3-alpine' }
}
steps {
sh 'mvn --version'
}
}
2. 自定义maven代理,使用自定义配置文件
分段代理问题解决之后,使用下面的指令去部署服务,会发现,这里是从maven中央仓库拉取jar包,而不是阿里云镜像源,或者说是,在某些情况下,我们需要从我们的私服中拉取jar包,这个时候,就需要自定义maven代理。
配置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 仓库
}
}
重新构建,即可。
jenkins使用docker去构建,其实也是在外部docker构建一个同等级的容器,所以有两种方式去构建,第一种是直接外部容器挂载,第二种是在jenkins的挂载目录中添加文件,使用jenkins流水线去指定绝对路径,这样对移植性也比较好。
第一种方式的实现【不推荐使用】:
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包的,所以不需要重新拉取。
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参数,允许我们选择分支进行构建
- 解析git参数,允许我们选择分支进行构建
- Active Choices
- 可以做到参数的级联选择
- 可以做到参数的级联选择
- Generic Webhook Trigger
- 通用的webhook触发器,构建更强大的webhook功能
- 通用的webhook触发器,构建更强大的webhook功能
- Role-based Authorization Strategy
- RBAC权限指定,给一个用户精确指定权限
- 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 "成了..."
}
}
如果要配置邮箱,则可以参考流水线语法,配置部分如下:
注意:1. 登录自己邮箱,开启POP3/SMTP邮件服务
2. 配置完这部分之后,先保存,然后再测试发送邮件,之前没有保存点击发送,没成功