CI/CD

啥是CI/CD

CI: continuous integration, 持续集成。就是频繁地把开发的工作提交到主线代码。主要是为了解决集成问题。什么是集成问题呢,白话说,就是从你本地的代码pull下来的时间点开始,距离你提交时候越长,你提交时候遇到冲突的风险越大。因为别人也可能会修改。

CD: continuous delivery, 持续交付。简言之就是频繁地经过UT、静态代码分析、build过程产出release。

CD:continuous deployment, 持续部署。拿到持续交付的产出(release),自动化部署到环境,并经过自动化测试过程。

实现举例

最近项目基于Jenkins, Docker实现CI/CD,在此记录一下。

jenkins 安装

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
java -jar jenkins.war --httpPort=8889 >./jenkins.log & #初始化Jenkins时需要的密码
cat ~/.jenkins/secrets/initialAdminPassword #安装推荐的plugin
#创建Admin

在Manage Jenkins->Global Tool Configuration->Add Maven 添加一个叫M3的Maven,自动安装maven,下面pipeline脚本会用(可选,如果没此步自己要先安装好maven)

jenkins任务的配置主要是通过页面完成。

点击New Item,输入名字,选择Pipeline,点OK

General里配置一些项目描述信息

Build Triggers设置编译触发。比如勾选Build periodically表示定期编译。Schedule填写H 5,10,15,20,23 * * *表示每天的5点、10点、15点、20点和23点都编译一次。而选择Poll SCM表示有提交才编译。

Pipeline里配置pipeline脚本。(这里用我自己git的一个小项目)

node {
def mvnHome
stage('Preparation') {
git 'https://github.com/qwsdcv/Stock.git'
mvnHome = tool 'M3'
}
stage('Build') {
sh "'${mvnHome}/bin/mvn' -f SpringStuff/pom.xml -Dmaven.test.failure.ignore clean package"
}
stage('Results') {
//junit '**/target/surefire-reports/TEST-*.xml'
//archive 'SpringStuff/target/*.jar' def date = sh (script: 'date +"%Y%m%d-%H%M%S"',returnStdout: true).trim() def RELEASEDIR = "~/release/${date}" def mkdir = { dir->
sh "mkdir -p ${dir}"
}
mkdir(RELEASEDIR) sh "cp SpringStuff/target/*.war ${RELEASEDIR}"
}
}

docker

我们的Dockerfile

从一个公共的image jetty开始,把生成的war包拷贝进去

FROM jetty

COPY SpringStuff/target/*.war /var/lib/jetty/webapps

那上面的pipeline脚本就可以改成下面这样了

node {
def mvnHome
stage('Preparation') {
git 'https://github.com/qwsdcv/Stock.git'
mvnHome = tool 'M3'
}
stage('Build') {
sh "'${mvnHome}/bin/mvn' -f SpringStuff/pom.xml -Dmaven.test.failure.ignore clean package"
}
stage('Results') {
//junit '**/target/surefire-reports/TEST-*.xml'
//archive 'SpringStuff/target/*.jar' def date = sh (script: 'date +"%Y%m%d-%H%M%S"',returnStdout: true).trim() def RELEASEDIR = "~/release/${date}" def mkdir = { dir->
sh "mkdir -p ${dir}"
}
mkdir(RELEASEDIR) sh "cp SpringStuff/target/*.war ${RELEASEDIR}"
//这里我可以直接build 是因为我把Dockerfile上传到github的根路径下了
sh "docker build -t jetty_stock_${date} ./" }
}

结合docker-registry搭建一个私有仓库,每次build完成打个标签推送到私有仓库就OK啦。

后面我会写一个用来申请容器环境的web服务。

另外附加这些指令解释

#生成image
docker build -t jetty_stock ./
#运行容器, 把容器内部的8080端口映射到宿主机器的9000端口
docker run -d -p 9000:8080 jetty_stock
docker ps #列出正在运行的容器
docker ps -a #列出所有容器,包括停了的
docker stop XXXX #停止容器
docker rm XXXX #删除容器(需要先停止再删除) docker images #列出所有镜像
docker rmi XXX #删除镜像 docker rm `docker ps -a -q` #删除所有容器

CI/CD的更多相关文章

  1. CI Weekly #8 | CI/CD 技能进阶路线

    在使用 flow.ci 进行持续集成的过程中,也许你会遇到一些小麻烦.最近我们整理了一些常见问题在 flow.ci 文档之 FAQ,希望对你有用.如果你遇到其他问题,也可以通过「在线消息」或去 Git ...

  2. CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  3. CI Weekly #1 | 这份周刊,带你了解 CI/CD 、DevOps、自动化测试

    原文首次发布与 flow.ci Blog >> 链接,转载请联系:) 准备了很久,CI Weekly 第一期终于来了. CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分 ...

  4. Docker / CI / CD

    CI Weekly #6 | 再谈 Docker / CI / CD 实践经验   CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动 ...

  5. CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享

    五月一来,夏天便悄然而至.flow.ci 也带来了几个新的变化,帮你进一步优化开发工作流.一起来看看这几个重点功能: 支持 iOS 项目 Xcode8.3 构建 iOSer 们重点来了,flow.ci ...

  6. 唱吧DevOps的落地,微服务CI/CD的范本技术解读----最大的难点并不是实际业务代码的编写,而是服务的监控和调试以及容器的编排

    1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...

  7. 唱吧DevOps的落地,微服务CI/CD的范本技术解读

    1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...

  8. 好代码是管出来的——使用GitHub实现简单的CI/CD

    软件开发一般来说是一项团队作业,在本系列文章开始就提到过软件的编码是由一个团队“并行”完成的,为了保证编码任务正常完成,首先引入版本控制工具来完成代码管理,为了保证代码质量引入了代码分析器以及代码测试 ...

  9. Docker: Jenkins与Docker的自动化CI/CD流水线实战

    什么是CI/CD 持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈.持续部署(Continuous Deployme ...

  10. 什么是 CI/CD?

    什么是 CI/CD? 在软件开发中经常会提到持续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD)这几个术语.但它们真正的意思是什么呢? ...

随机推荐

  1. 虚拟机无法上网,没有eth0

    虚拟机无法上网,找不到eth0解决方案如下: Ifconfig -a 第一步,输入如下命令,编辑对应文件(使用管理员权限执行,下同) # vim /etc/default/grub 在"GR ...

  2. WiFi万能钥匙 for Macv1.1.0中文版

    wifi万能钥匙 for Mac是一款运行在Mac平台上的免费WiFi热点软件,Mac分享无线流量.管理WiFi连接的必备神器.WiFi万能钥匙Mac版内置千万Wi-Fi热点数据,随时随地轻松接入无线 ...

  3. 初始化HTML样式(转载)

    方式一 ;; } body { background:#fff; color:#555; font-size:14px; font-family: Verdana, Arial, Helvetica, ...

  4. Pytho条件判断

    def health_status(): height = float(input("请输入身高(单位:米) :")) weight = float(input("请输入 ...

  5. Eamon 埃蒙

    发售年份 1980 平台 AppleII 开发商 Donald Brown 类型 文字冒险 https://www.youtube.com/watch?v=uvZIxnIvRG8

  6. 20175202 《Java程序设计》第九周学习总结

    20175202 2018-2019-2 <Java程序设计>第九周学习总结 教材知识点总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称 ...

  7. Java 异常: SimpleDateFormat java.lang.NumberFormatException: multiple points

    Java  SimpleDateFormat 是不支持多线程的.在不同线程同时用 一个 SimpleDateFormat  实例对象做日期装换,或抛出上面的 2 种 异常,所以 用到 SimpleDa ...

  8. 友善RK3399/NanoPC-T4开发板wiringPi Python库访问GPIO外设实例讲解 -【申嵌视频】

    1 wiringPi for Python简介 wiringPi for Python是wiringPi的Python语言扩展,用于在Python程序中操作GPIO/I2C/SPI库/UART/PWM ...

  9. 交互课件用什么软件------承接教育类k12/幼儿html5交互课件/动画外包

    flash交互课件能生动表达教学内容,也深受广大教育工作者的喜爱,但是目前flash课件只能在pc电脑平台上进行展示,随着移动网络的发展,Adobe宣布2020年停止对flash更新和维护,越来越多的 ...

  10. CSS 不规则图形绘制

    基础技能1 - 神奇的border 我们先来画一个长方形: .Rectangle { height: 100px; width: 200px; background: darkgray; border ...