对于Jenkins的使用,我感受只用到其中一小部分功能,但也就是这一小部分功能,也推进了整个CI/CD的过程,Jenkins的使用方式有不少中,可能我用到的只是其中一种,可是已经知足个人需求,便再也不贪婪,本次要约定好Jenkins中的脚本规则,对于个人整个生成流水线来说,约定至高无上,听从约定,或许会出现错误,但出现的概率确定低于不听从约定,随意设计好的多。html
1、Jenkins安装及项目配置java
一、Jenkins安装git
在之前的博客中已经介绍过Jenkins的安装,我使用的是在Docker中安装Jenkins,利弊明显,在容器中安装方便,可是也带来一些问题,如不能很好的和Docker Machie结合使用,若是想在Jenkins脚本中分发服务到其余主机上,那必需要在Jenkins中额外安装SSH插件。而在主机上直接安装Jenkins,则步骤要多一点,须要安装Java环境等操做,可是能够在Jenkins中直接使用Docker Machine的功能,直接将服务分发到Swarm服务器集群中,这便带来了优点。docker
Docker中完成Jenkins安装:https://www.cnblogs.com/CKExp/p/9536864
sass
二、Jenkins集群搭建bash
对于Jenkins的做用须要重申重要一点就是,在个人整个生成流水线中Jenkins的最大目的是担任奶妈角色,也就是镜像的建立,甚至整个Jenkins集群的目的都是镜像的建立,在聊天时发现有人在本身的每一台机器上安装Jenkins,而后搭建Jenkins集群,而后将构建任务下发至子节点中并构建完毕后生成服务,个人思路在刚开始使用Jenkins时甚至也是这样,可是慢慢的我发现不对,这整个思路就是荒谬,难不成个人每一台机器上都得安装Jenkins,逐步探索,总结出来就是,Jenkins只是奶妈,最终目的只是镜像生产者。服务器
Jenkins集群搭建过程:http://www.javashuo.com/article/p-dkgzmyii-s.html
微信
三、Jenkins中新建项目ssh
在个人生成流水线中,Jenkins的主要职责即是将代码仓库中的代码拉取过来,完成镜像的构建,而对于Jenkins中,构建项目,有一些须要设置的地方,如Git地址,凭证,构建时间,构建脚本等。ide
Jenkins中新建项目:http://www.javashuo.com/article/p-kkioerms-eq.html
2、约定Jenkins的构建脚本
利用在构建Jenkins脚本时加入的Docker Compose工具,能够在脚本构建时生成多个镜像,且能够有依赖关系,方便相互关联的服务部署。
一、利用Docker Compose中的参数 -f 指定项目中的compose.yaml文件,这个文件的位置在以前约定项目结构中设置好了,在docker文件夹下,对于docker compose,会将这两个yaml文件合并为一个,所以,能够设置多个yaml文件,用于不一样的做用。经过制定-p 参数来设置项目名称,down 参数将删除指定的镜像、服务、容器、网关等,对于构建镜像的命令,可使用up命令或是build命令,二者区别是,使用up命令时会在本机上生成指定镜像的容器,而build命令则只负责构建镜像。
约定项目文件结构:http://www.javashuo.com/article/p-tlnkmkfj-hp.html
#!/bin/bash # 获取短版本号 GITHASH=`git rev-parse --short HEAD` docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml -p multimap down --rmi local --remove-orphans docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml -p multimap up -d --build
# docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml -p multimap build
注意:若是不指定-p 参数,则会使用默认文件夹名,在此处为docker文件夹名,则会带来一系列问题,如对于默认网关名称,镜像名称等,都是使用docker开头,这就致使多个项目会发生冲突,都是使用docker开头的网关,多个项目只能一个有效,所以约定每一个项目在指定-p参数时以项目名称为主。
二、镜像构建完毕,将镜像推送到镜像仓库中,指定仓库地址,用户名和密码(我这里使用的是腾讯云的镜像仓库,若是使用的私有仓库或其余云的,则须要替换),能够利用docker-compose提供的push命令,将docker compose中生成的镜像都推送到镜像仓库中。
echo ---------------Push-Images...------------------ docker login -u=xxx用户名xxx -p=xxx密码xxx ccr.ccs.tencentyun.com docker-compose -f ./docker/docker-compose.yml -f ./docker/docker-compose.override.yml push
三、(可选)若是须要将建立服务到Swarm集群(或是k8s中),也能够利用Jenkins完成,若是是将Jenkins安装在宿主机上,则可使用以下命令建立服务:
首先执行登陆仓库功能:
docker-machine ssh host1 docker login -u xxx用户名xxx -p xxx密码xxx ccr.ccs.tencentyun.com
建立服务,指定服务内外端口,指定镜像,如需指定更多信息,能够查看命令帮助,指定完毕服务建立会从镜像仓库中获取最新的镜像,我使用的是latest标签,若是是生产环境须要打上数字标签,方便应用程序版本管理:
docker-machine ssh host1 docker service create \
--with-registry-auth \
--name multimapService
--publish published=32700,target=80 \
ccr.ccs.tencentyun.com/sassassin/multimap:latest
更新服务,指定镜像名称,仍然是该镜像仓库地址,若是显示没有镜像,从新使用docker login登陆,而后执行命令(登陆命令很关键)。
docker-machine ssh host1 docker service update --image ccr.ccs.tencentyun.com/sassassin/multimap:latest xxxService
四、对于构建过程当中生成的无效镜像等,能够利用Jenkins来定时删除,不建议在项目构建完毕去发起命令删除,缘由在于,多个项目构建时,一个项目构建完毕,另外一个项目正在构建过程当中,可能会产生中间镜像,但这镜像或许是有做用的,当构建完毕的项目执行镜像删除时,会发生删除错误,中间镜像正在被使用,所以,最好是单独设置一个任务去定时删除无效镜像
Jenkins定时删除无效镜像:http://www.javashuo.com/article/p-rbbrhxyf-eu.html
至此,Jenkins在个人整个生成流水线的过程算是完整了,最后在指明一点,Jenkins在个人整个生成流水线中,最大的角色就是镜像生产者(奶妈)。
本文地址:http://www.javashuo.com/article/p-udjaimda-gr.html
欢迎关注微信订阅号,有新的文章将同步到订阅号中
2018-12-01,望技术有成后能回来看见本身的脚步