CI/CD
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的更多相关文章
- CI Weekly #8 | CI/CD 技能进阶路线
在使用 flow.ci 进行持续集成的过程中,也许你会遇到一些小麻烦.最近我们整理了一些常见问题在 flow.ci 文档之 FAQ,希望对你有用.如果你遇到其他问题,也可以通过「在线消息」或去 Git ...
- CI Weekly #6 | 再谈 Docker / CI / CD 实践经验
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- CI Weekly #1 | 这份周刊,带你了解 CI/CD 、DevOps、自动化测试
原文首次发布与 flow.ci Blog >> 链接,转载请联系:) 准备了很久,CI Weekly 第一期终于来了. CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分 ...
- Docker / CI / CD
CI Weekly #6 | 再谈 Docker / CI / CD 实践经验 CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动 ...
- CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享
五月一来,夏天便悄然而至.flow.ci 也带来了几个新的变化,帮你进一步优化开发工作流.一起来看看这几个重点功能: 支持 iOS 项目 Xcode8.3 构建 iOSer 们重点来了,flow.ci ...
- 唱吧DevOps的落地,微服务CI/CD的范本技术解读----最大的难点并不是实际业务代码的编写,而是服务的监控和调试以及容器的编排
1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...
- 唱吧DevOps的落地,微服务CI/CD的范本技术解读
1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...
- 好代码是管出来的——使用GitHub实现简单的CI/CD
软件开发一般来说是一项团队作业,在本系列文章开始就提到过软件的编码是由一个团队“并行”完成的,为了保证编码任务正常完成,首先引入版本控制工具来完成代码管理,为了保证代码质量引入了代码分析器以及代码测试 ...
- Docker: Jenkins与Docker的自动化CI/CD流水线实战
什么是CI/CD 持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈.持续部署(Continuous Deployme ...
- 什么是 CI/CD?
什么是 CI/CD? 在软件开发中经常会提到持续集成Continuous Integration(CI)和持续交付Continuous Delivery(CD)这几个术语.但它们真正的意思是什么呢? ...
随机推荐
- bootstrap研究感想1
我—>新人,特纯的新人,受到方大神的建议,开始写博客,写一些工作时敲代码时的感受,学习模仿大神时的感悟. -------------------------------------------- ...
- VUE路由携带参数的三种方式
vue 通过路由在进行页面跳转时,会经常携带参数用于同步页面间的数据 路由中携带参数的方式总结如下: 路由定义示例: { name: 'list', path: '/list', component: ...
- javascript 创建节点和新增节点
createElement(tabName) 创建一个为tagName的新元素节点 ANode.appendChild(BNode)把B节点追加至A节点的末尾 insertBefore(ANode,B ...
- [Jave - JDBC] executeUpdate & executeQuery & execute
1. executeUpdate 用於執行INSERT.UPDATE.DELETE語法,以及 DDL語句(如CREATE TABLE 和DROP TABLE). 返回值為受影響的行數or更新計數(整數 ...
- Poj2688cleaningrobot
这道题让我们求一个地图上的各个点之间的最短路径说白了旅行商问题. 那么我们先用一个裸的BFS求出各个点之间的最短距离,然后我们再枚举各个点的全排列即可 这道题的细节很多,详见注释 上代码~ #incl ...
- Cobbler全自动批量安装部署Linux系统
说明: Cobbler服务器系统:CentOS 5.10 64位 IP地址:192.168.21.128 需要安装部署的Linux系统: eth0(第一块网卡,用于外网)IP地址段:192.168.2 ...
- 工控随笔_07_西门子_WinCC利用命令行实现操作log日志
在WinCC中可以通过报警纪录来实现操作员纪录,这个需要WinCC的消息系统进行组态和配置. 利用消息系统进行实现上诉功能不但复杂而且时间久啦也不方便查询.那么有没有一种简单的方法来 实现操作员纪录呢 ...
- 未来-IOT-Aliyun:ICA 联盟
ylbtech-未来-IOT-Aliyun:ICA 联盟 ICA联盟介绍 为解决IoT标准体系不完善,场景复合或者分散,不同领域端云连接.通信组网.数据属性.端到端安全.测试标准缺乏或不统一等痛点问题 ...
- 一个tomcat下部署不同端口多个应用
通过配置tmcat的server.xml来实现多端口多应用: <?xml version='1.0' encoding='utf-8'?> <Server port="80 ...
- sql查询统计
SELECT TOP 50 (select text from sys.dm_exec_sql_text(sql_handle)) as [SQL], CAST( ((qs.total_elapsed ...