对于Jenkins的使用,我感觉只用到其中一小部分功能,但也就是这一小部分功能,也推动了整个CI/CD的过程,Jenkins的使用方式有很多中,可能我用到的只是其中一种,但是已经满足我的需求,便不再贪婪,本次要约定好Jenkins中的脚本规则,对于我的整个生成流水线来讲,约定至高无上,遵从约定,或许会出现错误,但出现的几率肯定低于不遵从约定,随意设计好的多。

  

一、Jenkins安装及项目配置

  1、Jenkins安装

  在以前的博客中已经介绍过Jenkins的安装,我使用的是在Docker中安装Jenkins,利弊明显,在容器中安装方便,但是也带来一些问题,如不能很好的和Docker Machie结合使用,如果想在Jenkins脚本中分发服务到其他主机上,那必须要在Jenkins中额外安装SSH插件。而在主机上直接安装Jenkins,则步骤要多一点,需要安装Java环境等操作,但是可以在Jenkins中直接使用Docker Machine的功能,直接将服务分发到Swarm服务器集群中,这便带来了优势。

   Docker中完成Jenkins安装:https://www.cnblogs.com/CKExp/p/9536864

  2、Jenkins集群搭建

  对于Jenkins的作用需要重申重要一点就是,在我的整个生成流水线中Jenkins的最大目的是担任奶妈角色,也就是镜像的创建,甚至整个Jenkins集群的目的都是镜像的创建,在聊天时发现有人在自己的每一台机器上安装Jenkins,然后搭建Jenkins集群,然后将构建任务下发至子节点中并构建完毕后生成服务,我的思路在刚开始使用Jenkins时甚至也是这样,但是慢慢的我发现不对,这整个思路就是荒谬,难不成我的每一台机器上都得安装Jenkins,逐步探索,总结出来就是,Jenkins只是奶妈,最终目的只是镜像生产者。

   Jenkins集群搭建过程:https://www.cnblogs.com/CKExp/p/9541137.html

  3、Jenkins中新建项目

  在我的生成流水线中,Jenkins的主要职责便是将代码仓库中的代码拉取过来,完成镜像的构建,而对于Jenkins中,构建项目,有一些需要设置的地方,如Git地址,凭证,构建时间,构建脚本等。

   Jenkins中新建项目:https://www.cnblogs.com/CKExp/p/9940479.html

二、约定Jenkins的构建脚本

  利用在构建Jenkins脚本时加入的Docker Compose工具,可以在脚本构建时生成多个镜像,且可以有依赖关系,方便相互关联的服务部署。

  1、利用Docker Compose中的参数 -f 指定项目中的compose.yaml文件,这个文件的位置在之前约定项目结构中设置好了,在docker文件夹下,对于docker compose,会将这两个yaml文件合并为一个,因此,可以设置多个yaml文件,用于不同的作用。通过制定-p 参数来设置项目名称,down 参数将删除指定的镜像、服务、容器、网关等,对于构建镜像的命令,可以使用up命令或是build命令,两者区别是,使用up命令时会在本机上生成指定镜像的容器,而build命令则只负责构建镜像。

  约定项目文件结构:https://www.cnblogs.com/CKExp/p/9940457.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参数时以项目名称为主。

  2、镜像构建完毕,将镜像推送到镜像仓库中,指定仓库地址,用户名和密码(我这里使用的是腾讯云的镜像仓库,如果使用的私有仓库或其他云的,则需要替换),可以利用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

  3、(可选)如果需要将创建服务到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=,target= \
  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

  4、对于构建过程中生成的无效镜像等,可以利用Jenkins来定时删除,不建议在项目构建完毕去发起命令删除,原因在于,多个项目构建时,一个项目构建完毕,另一个项目正在构建过程中,可能会产生中间镜像,但这镜像或许是有作用的,当构建完毕的项目执行镜像删除时,会发生删除错误,中间镜像正在被使用,因此,最好是单独设置一个任务去定时删除无效镜像

  Jenkins定时删除无效镜像:https://www.cnblogs.com/CKExp/p/9900539.html

  至此,Jenkins在我的整个生成流水线的过程算是完整了,最后在指明一点,Jenkins在我的整个生成流水线中,最大的角色就是镜像生产者(奶妈)

 本文地址:https://www.cnblogs.com/CKExp/p/9940467.html

 欢迎关注微信订阅号,有新的文章将同步到订阅号中

 

2018-12-01,望技术有成后能回来看见自己的脚步

约定Jenkins构建脚本的更多相关文章

  1. Jenkins构建脚本中启动tomcat关键

    一.启动tomcat 来源: http://blog.csdn.net/prisonbreak_/article/details/50749576(给出方法) http://veryyoung.me/ ...

  2. Jenkins构建自动化脚本执行无界面解决方法

    场景: jenkins构建selenium自动化用例的时候,会有jenkins自带服务后台运行自动化脚本,可无界面运行IE.Chrome.Firefox. 然而运行IE浏览器时候(IE比较特殊),Je ...

  3. 使用TortoiseSVN的客户端钩子脚本触发Jenkins构建

    我们项目在开发过程中使用了Jenkins构建Windows版本,为了通过自动触发使构建的版本保持最新,可以采用的方法如下: Jenkins Poll SCM:设置Jenkins定时检查变更,在SVN版 ...

  4. Jenkins构建完成之后运行脚本可以杀掉TomCat但是起不来的解决方法

    Jenkins构建完成之后运行脚本可以杀掉TomCat但是起不来的解决方法 写了一个重启tomcat的脚本,让jenkins编译.打包.发布时调用.在本地写好重启tomcat的脚本后,本地执行脚本没有 ...

  5. 【linux】【jenkins】jenkins构建、mvn或者npm打包、docker运行、失败自动回滚脚本

    小白对jenkins运维的使用有点简单的想法,这里开个记录贴记录下. 由于未找到jenkins构建失败后执行其他脚本的插件,也暂时没有使用其他运维工具.所以想自己写一个shell脚本,一是方便其他人使 ...

  6. 用Vagrant创建Jenkins构建环境

    这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...

  7. Jenkins 构建JavaHelloWorld

    原文:http://www.cnblogs.com/itech/archive/2011/11/03/2234662.html 注意:我们知道Jenkins通过master/slave来支持分布式的j ...

  8. Gitlab自动触发Jenkins构建打包

    一.目的 在部门的测试环境中,开发人员一旦向gitlab仓库提交成功代码,gitlab就会自动触发jenkins构建项目.当然在构建后还可以添加项目部署或者自动化测试的脚本.这里只针对测试环境. 二. ...

  9. 基于Jmeter+maven+Jenkins构建性能自动化测试平台

      一.目的: 为能够将相关系统性能测试做为常规化测试任务执行,且可自动无人值守定时执行并输出性能测试结果报告及统计数据,因此基于Jmeter+maven+Jenkins构建了一套性能自动化测试平台 ...

随机推荐

  1. TCP分组交换详解

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  2. python爬虫入门(七)Scrapy框架之Spider类

    Spider类 Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作 ...

  3. Java开源生鲜电商平台-订单表的设计(源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  4. ElasticSearch本地调测环境构建

    ElasicSearch版本:6.0.0:https://github.com/elastic/elasticsearch.git 1:安装JVM(JVM1.8以上) 2:安装gradle(3.3以上 ...

  5. 洛谷 P1069 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  6. Python + Appium 环境搭建

    ---恢复内容开始--- Appium自动化公司内部测试培训1-环境搭建 课程目的 一.Python + Appium 环境搭建 课程内容 1    安装前准备工作 搭建环境所需要的安装文件已经下载好 ...

  7. js相关

    记录工作中用到的js实用方法: 1. 判断包含:indexOf "https".indexOf("http") 包含结果为0,不包含结果为-1: 通常用(&qu ...

  8. IntelliJ IDEA maven 构建简单springmvc项目

    环境: apache-tomcat-8.5.15 jdk1.8.0_172 IDEA 建立一个maven-webapp项目:Create New Project 后点击next 然后next 可以选择 ...

  9. 跨域cors方法(jsonp,document.domain,document.name)及iframe性质

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  10. Linux下gcc和g++的区别

    首先编写了第一个C++程序,Hello,world! #include <iostream> using namespace std; void main() ...{ cout < ...