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. JavaScript如何让1+1=11;{ } + { } = 2

    delete (          ) delete (          ) ;var  n = new Number( 1 ) console.log( n + 1 )   // 2  #请在括号 ...

  2. auto-encoder小记

    1.使用auto-encoder生成手写数字 2.中间code层使用二维向量,使用L2norm处理中间层数据 3.从[-1,1]的矩形框中等间隔选取100个坐标点 作为code值 最终生成图像 后期应 ...

  3. java的几种模式以及如何实现的

    创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: &l ...

  4. Python之进度条及π的计算

    Python之进度条及π的计算 文本进度条 1.  简单的开始 这是利用print()函数来实现简单的非刷新文本进度条.它的基本思想是按照任务执行百分比将整个任务划分为100个单位,每执行N%输出一次 ...

  5. 2018-2019-2 20165313 Exp2 后门原理与实践

    实践基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 应用程序设定后门,用户安装后,后门就可以进入.例如课堂上讲到的百度. (2)例举你知道的后门如何启动起来(win及linux) ...

  6. ERROR: cannot launch node of type [turtlebot_teleop/turtlebot_teleop_key] 问题解决

    当遇到问题

  7. ios-键盘回收

    对输入的UITextField 控件设置完代理,然后粘上两种方法,即可. #pragma mark- 键盘收回 -(void)textFieldDidEndEditing:(UITextField * ...

  8. windows下Redis的安装和使用

    1.要安装Redis,首先要获取安装包.Windows的Redis安装包需要到以下GitHub链接找到.链接:https://github.com/MSOpenTech/redis.打开网站后,找到R ...

  9. 目标文件obj的各段 2

    #程序的自我修养  page68

  10. install rust

    Step 1. Trial 1 Download rustup-init.exe exec rustup-init.exe SW hangs 2. Trial 2 install rust-1.33. ...