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. python练习题3:N的多次方

    N的多次方 描述 编写一个程序,计算输入数字N的0次方到5次方结果,并依次输出这6个结果,输出结果间用空格分隔.其中:N是一个整数或浮点数. print()函数可以同时输出多个信息,采用如下方法可以使 ...

  2. edgedb 内部pg 数据存储的探索 (四) 源码编译

      edgedb 基于python开发,同时源码重包含了好多子项目,以下进行简单的源码编译 clone 代码 需要递归处理,加上recursive,比较慢稍等 git clone --recursiv ...

  3. 005-docker启动设置环境变量

    https://blog.csdn.net/wsbgmofo/article/details/79173920

  4. Kuberneteser二进制安装与配置(二)

    环境:Centos7 版本:Kubernetes v1.11.4   一.下载Kubernetes   1)下载 wget https://github.com/kubernetes/kubernet ...

  5. [JAVA]JAVA实现多线程的三种方式

    1.继承Thread类,通过start()方法调用 public class MultiThreadByExtends extends Thread { @Override public void r ...

  6. 从零开始打jar包--补充

    想试一下动态编译的功能,所以想看一下java如何编译 原文见:http://www.cnblogs.com/flashsun/p/7246260.html 但这篇文章有些错误及遗漏之处,导致有些没有办 ...

  7. Tornado异步非阻塞的使用以及原理

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...

  8. Spark环境准备

    Ubuntu: 1.下载spark-2.2.1-bin-hadoop2.7.tgz,解压即可使用. 2.下载jdk-8u151-linux-x64.tar.gz,解压. 3.执行spark-2.2.1 ...

  9. JavaBean找到项目下的文件这里是\WEB-INF\classes\下面的属性文件

    String baseinfo="/com/Bean/DBhelp.properties"; filename=getClass().getClassLoader().getRes ...

  10. MariaDB——(三) MariaDB 10.0.15 standard replication主从复制搭建

    最近看了一下MariaDB的常规复制章节,就按部就班的搭建了一下最简单的主从复制.需要的硬件环境很简单(在虚拟机VMware中搭建): 1:两台server:Master: 192.168.6.133 ...