DevOps实战(Docker+Jenkins+Git)
基于Docker+Jenkins+Git的CI/CD实战
与上一篇随笔:基于 Jenkins+Docker+Git 的CI流程初探 有所不同,该内容更偏向于实际业务的基础需求。
有几点需要注意:
- 该实战中没有涉及到镜像仓库,所以略去了镜像推送阶段,可以参考基于 Jenkins+Docker+Git 的CI流程初探。
- 与上一篇对比,该实战是基于外网服务器进行的,所以加入了Jenkins自动触发拉取代码以及发送构建报告功能。
- 实战中的Jenkins也是基于docker运行,对于Jenkins数据持久化是通过VOLUME实现的。
- 不再进行自建git代码仓库,选择使用Gitee管理代码。
- 实验环境均已提前准备完毕。
1、Jenkins启动
docker run \ -u root \ -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins-data:/var/jenkins_home \ -v /etc/localtime:/etc/localtime:ro \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart=always \ jenkinsci/blueocean
Jenkins重要的点
pipeline{ //全部的CI/CD流程都需要在这里定义 //任何一个代理可用就可以执行 agent any //定义一些环境信息 environment { WS = "${WORKSPACE}" } //定义流水线的加工流程 stages{ stage('环境检查'){ steps { sh 'printenv' echo "正在检测基本信息" sh 'java -version' sh 'git --version' sh 'docker version' sh 'pwd && ls -alh' } } //1、编译 "abc" stage('maven编译'){ agent { docker { image 'maven:3-alpine' args '-v /var/jenkins_home/appconfig/maven/.m2:/root/.m2' //docker run -v /var/jenkins_home/appconfig/maven/.m2:/root/.m2 } } //要做的所有事情 //jenkins不配置任何环境的情况下, 仅适用docker兼容所有场景 steps{ echo "编译..." sh 'pwd && ls -alh' sh 'cd ${WS} && mvn clean package -s "/var/jenkins_home/appconfig/maven/settings.xml" -Dmaven.test.skip=true' } } //2、打包 stage('生成镜像'){ steps{ sh 'pwd && ls -alh' sh 'docker version' sh 'docker build -t java-devops-demo .' } } //3、部署 stage('部署'){ steps{ echo "部署..." sh 'docker rm -f java-devops-demo-dev' sh 'docker run -d -p 80:8080 --name java-devops-demo-dev java-devops-demo' } } //4、推送报告 stage("发送报告"){ steps { //短信通知,购买api接口即可 // sh 'curl -i -k -X POST 'https://gyytz.market.alicloudapi.com/sms/smsSend?mobile=mobile¶m=**code**%3A12345%2C**minute**%3A5&smsSignId=2e65b1bb3d054466b82f0c9d125465e2&templateId=908e94ccf08b4476ba6c876d13f084ad' -H 'Authorization:APPCODE dddddddd'' //REST API 所有都行 // sh 'curl ' echo '准备发送报告' emailext body: ''' "UTF-8">${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志 "8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
| "#CC0000">构建结果 - ${BUILD_STATUS} |
"#0B610B">构建信息 "2" width="100%" align="center" /> |
"#0B610B">最近提交
"2" width="100%" /> ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat=" |
Dockerfile:
#这个也得有 FROM openjdk:8-jre-alpine LABEL maintainer="xxxxxxx@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" ]
Jenkinsfile与Dockerfile均位于java-devops-jemo目录下,由Jenkins从git仓库拉取。
2)
agent { docker { image 'maven:3-alpine' //用完就会杀掉 args '-v /var/jenkins_home/appconfig/maven/.m2:/root/.m2' // 将jar包映射到宿主机上/var/jenkins_home/appconfig/maven/.m2目录中 // 也可以将jar包以数据卷方式挂载到宿主机 } }注:jenkins不配置任何环境的情况下, 仅适用docker兼容所有场景。
解决方法:在临时容器内部切换到Jenkins的默认工作目录,再进行maven打包。
6、邮件推送
填写完毕,可以通过发送测试邮件进行测试。
邮件模板内容见Jenkinsfile中报告推送阶段。