近期因为工做缘由须要学习jenkins持续化集成。对于一个好学又帅气的我来讲。学习他还不是手到擒来。公司为一个中小型创业公司,在部署代码上面,不多用gitlab、jenkins等等,也没有清晰的生产环境-测试环境-线上环境之分。惟一有的就是写完代码-登录服务关闭服务,上传代码-开启服务。这样每每会到来不少问题,同时也会给程序员带来不少繁琐的工做。这不,公司内部整顿,须要一套清晰的流程,并且为了减轻程序员的负担,因而就但愿采用gitlab+jenkins来部署代码。php
程序员经过提交代码到gitlab上;触发jenkins自动部署触发器;部署到测试服务器,若是正常,提交到正式线上环境html
Ubuntu18.04 :python
网络:内网环境 服务:gitlab环境
Ubuntu16.04:mysql
网络:内网环境 服务:jenkins
Centos 7 :nginx
网路:公网环境 服务:php+nginx+mysql
公网环境为一个测试环境,这里没有线上环境,引一个环境就能够,测试成功上线是同理的道理。git
为何从1到自动化部署呢?是由于我不太想写安装部署的过程。过程很是简单,没有坑点和难点。稍稍百度一下就有不少。程序员
前提条件:
一、你要有本身的gitlab帐号和本身的项目,固然用别人的项目也行,不过在后面设置一些权限信息的时候,可能会很麻烦别人。因此本身的才是最方便的。
二、你的公网服务器必定要能访问到内网gitlab的项目,由于为了减小出错,采用的是公网服务器pull gitlab的代码。具体的咱们后面聊。
三、有一个不怕困难的心,和帅气的脸。web
点击系统管理-插件管理,经过搜索框便可下载你想要对插件。这个在刚初始化jenkins的时候也有一次安装插件的步骤,尽可能装,使劲装。根据本身的需求哈!sql
一、新建任务
二、输入任务名称-选择-选择流水线-肯定
简要介绍一下这几个项目的优缺点shell
Freestyle Job
需在页面添加模块配置项与参数完成配置
每一个Job只能实现一个功能
没法代码化,不利于迁移与版本控制流水线项目
全部参数均可以体现为一个pipeline脚本
能够定义多个stage构建一个管道工做集
配置代码化,方便Job配置迁移与版本控制
脚本写在Jenkins项目里多分支流水线
优势同流水线
脚本写在GitLab项目里(Jenkinsfile)
关于多分支的流水线,推荐博客https://blog.51cto.com/12639039/2352222
三、进入到job的配置界面-点击构建触发器
General不须要配置
由于需求是程序员向gitlab提交了新的代码,jenkins触发。因此在构建触发器的时候选择下面这个选项
这里请不要忽略Gitlab webhook URL:。这个webhook就是用来触发jenkins自动构建的。
点击高级,建立 Secret token
四、gitlab上添加步骤3 的webhook
在url处填写webhook;Secret Token处填写步骤三随机生成的字符串。完成过,点击添加便可。
在这里能够进行测试连通性。
注意到这里的时候,你可能会遇到一个问题:有些用户添加的时候会报这样一个错误,
说是不容许本地网络请求。这是因为新版本安全性的问题形成的,很是容易解决!
解决方法:使用gitlab管理员帐户登录。
将那两个所有勾选。而后回去从新添加便可。
五、编写pipeline脚本
这里有两个选择,第一个是在这里直接写入脚本(舒适提示,脚本在本身电脑上的编辑器上写好粘贴到这里,由于这里的编辑器像吃了翔同样难用!太难了。。。)第二个是使用jenkinsfile文件。我使用了第一个(由于演示操做简单,易懂!嘿嘿)。
写完后点击保存。便可完成一个job的建立
你觉得这就完了。最重要的才刚刚开始!!!!!!!!!!!!!!!!!!!!!!!!!!!
让咱们再来回顾一下需求:
程序员经过提交代码到gitlab上;出发jenkins自动部署触发器;部署到测试服务器,若是正常,提交到正式线上环境。不过,我以为这个没有任何挑战性。我想本身加点难度,无论部署过程是否成功,都要有个钉钉消息发到程序员小哥哥的群里,给他们个警示!
话很少说,上代码一点点解释:
舒适提示:这是我为了知足自身须要而编写的代码,请不要照搬,固然与我有一样需求的随意喽。同时中间的解释也根据个人代码去解释,没有刻意去讲解语法,请谅解!
pipeline{ agent any stages{ stage("拉去代码"){ steps { echo "STEP 1 :clone code" } } stage("打包代码"){ steps { echo "step 2 : code package" sh label: '', script: '/usr/bin/ssh -p 62322 root@*.*.*.* "cd /var/www/html/pipeline/mytest && git pull && chmod -R 777 /var/www/html/pipeline/mytest/storage && composer install"' } } stage("上线发布"){ steps { echo "step 3 :deploy package" } } } post { success { dingTalk accessToken:'钉钉机器人的token', imageUrl:'图片的url', jenkinsUrl:'http://192.168.5.194:8080/', message:'pipeline-test代码部署成功。', notifyPeople:'' } failure { dingTalk accessToken:'钉钉机器人的token', imageUrl:'图片的url', jenkinsUrl:'http://192.168.5.194:8080/', message:'pipeline-test代码部署失败'。, notifyPeople:'' } } }
详解:
agent
指示 Jenkins 为整个流水线分配一个执行器(在 Jenkins 环境中的任何可用代理/节点上)和工做区。
echo
写一个简单的字符串到控制台输出。注意这里不是shell命令行的echo或php语法。和他们做用相同而已。
stage
定义了在整个流水线的执行任务的概念性地不一样的的子集(好比 "Build", "Test" 和 "Deploy" 阶段), 它被许多插件用于可视化 或Jenkins流水线目前的 状态/进展.
可能这句话不太形象(我第一次看官文也是蒙蔽),来张图
其中最后一个是post处理的状态。
在打包代码的stage块中
sh label: '', script: '/usr/bin/ssh root@*.*.*.* "cd /var/www/html/pipeline/mytest && git pull && chmod -R 777 /var/www/html/pipeline/mytest/storage && composer install"'
这是经过jenkins的片断生成器生成的符合语法的命令,能够在shell中去执行的命令
那么,如何使用jenkins片断生成器?
(1)、点击流水线语法
(2)、从实例步骤中选择sh:shell script。在文本框输入须要生成的shell命令,
(3)、点击生成流水线脚本 按钮便可成成相应的流水线语法
Post
相似于python中try语句。如何根据stage执行的结果而进行特定处理则是实际Pipeline使用中常常会碰到的问题。因此这里post就是来作对异常处理的功能。同时,你也能够理解为自由风格中的构建后的操做步骤(在自由风格中发钉钉能够下载dingding的插件)。而这个post块,就是我要知足本身加的钉钉反馈的需求。说到这里为了让你们更明白post的使用方法想再多解释一下:
使用限制:
须要写在pipeline或者stage块中
注意:post块的位置必定要遵循这个原则,不然不会执行。
支持的条件预置:
always: 不管pipeline或者stage的执行结果如何,此块中的预置操做都会执行。
changed:只有当pipeline或者stage的执行后,当前状态与以前发生了改变时,此块中的预置操做才会执行。
fixed:前一次运行为不稳定状态或者失败状态,并且本次运行成功结束,这两个条件同时知足时,此块中的预置操做才会执行。
regression: 本次运行状态为不稳定状态,失败状态或者是停止状态,并且前一次运行成功结束,这两个条件同时知足时,此块中的预置操做才会执行。
aborted:当前pipeline或者stage的状态为aborted时,此块中的预置操做才会执行。一般是因为流水线被手工中会致使此状态产生,而产生此状态后,一般在Jenkins的UI界面会显示为灰色。
failure:当前pipeline或者stage的状态为failed时,此块中的预置操做才会执行。而产生此状态后,一般在Jenkins的UI界面会显示为红色。
success:当前pipeline或者stage的状态为success时,此块中的预置操做才会执行。而产生此状态后,一般在Jenkins的UI界面会显示为绿色。
unstable: 当前pipeline或者stage的状态为unstable时,此块中的预置操做才会执行。一般状况下测试失败或者代码规约的违反都会致使此状态产生,而产生此状态后,一般在Jenkins的UI界面会显示为黄色。
unsuccessful:当前pipeline或者stage的状态不是success时,此块中的预置操做才会执行。
cleanup:不管pipeline或者stage的状态为什么种状态,在post中的其余的条件预置操做执行以后,此块中的预置操做就会执行。
我用到了两个,分别是success和failure,在成功时应该作什么操做,在失败时应该作什么操做。
dingTalkaccessToken:'钉钉机器人的token', 若是不知道如何添加钉钉机器人,去隔壁百度便可
imageUrl:'在发送的信息里会附加这个图片',
jenkinsUrl:'本身jenkins的访问地址', 发送的信息就是这个连接,能够直接跳转到咱们的jenkins
message:'发送的文本信息、提示信息',
notifyPeople:'须要通知的人'
到这里个人脚本的大概状况也就介绍完毕。若是想了解详细的jenkins语法,推荐学习地址
https://jenkins.io/zh/doc/book/pipeline/ 中文的,并且挺详细。我这里写的脚本仅仅是知足个人我的需求,有相似需求的伙伴能够参考!
再来一个舒适提示:初学者必定注意好代码块的书写,尽可能作到规范,由于这样才好容易排错。 Groovy 语法大都代码块可能由于一个花括号就能找个半天。因此尽可能规范。若是有 Groovy 语法高亮的编辑器就更好了。
4、测试job运行状况
点击当即构建
执行完毕后,经过控制台输出能够看到整个过程
钉钉消息
到此便大功告成,让大家的程序员小哥哥去推代码试试吧!