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: '''<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title> </head> <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif"> <h3>本邮件由系统自动发出,请勿回复!</h3> <tr> <br/> 各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br> <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td> </tr> <tr> <td><br /> <b><font color="#0B610B">构建信息</font></b> <hr size="2" width="100%" align="center" /></td> </tr> <tr> <td> <ul> <li>项目名称 : ${PROJECT_NAME}</li> <li>构建编号 : 第${BUILD_NUMBER}次构建</li> <li>触发原因: ${CAUSE}</li> <li>构建状态: ${BUILD_STATUS}</li> <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li> <li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li> <li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li> </ul> <h4><font color="#0B610B">最近提交</font></h4> <ul> <hr size="2" width="100%" /> ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"} </ul> 详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/> </td> </tr> </table> </body> </html>''', subject: '${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志', to: 'xxxxx@163.com' } } } //后置处理过程 post { failure { echo "这个阶段 完蛋了.... $currentBuild.result" } success { echo "这个阶段 成了.... $currentBuild.result" } } }
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包以数据卷方式挂载到宿主机 } }