持续集成、持续部署、持续交付、持续发布

概念

持续 (Continuous):不断的获取反馈,响应反馈。
集成 (Integration):编译、测试、打包;
部署 (Deployment):应用组件或基本设施的代码或配置变更在产品环境生效称为“部署”;
发布 (Release):具有业务影响的功能变化对最终用户可见称为“发布”。
交付 (Delivery):可以理解为从 Deployment 到 Release之间的阶段,更多的强调的是一种能力。开发有能力频繁的部署,业务有能力随时发布。

相关连接:
知乎:如何理解持续集成、持续交付、持续部署?
阮一峰:持续集成是什么?
使用Jenkins进行持续集成
coding.net:ci
使用 Jenkins 构建 Coding 项目

达到的目标

名词说的那么多,扯的天花乱坠也没什么卵用,达到实际的效果才行。

我要达到的目的:开发人员提交代码到git,剩下的事情软件自动完成,打开浏览器可以直接看到程序界面

开始搭建持续集成环境

这里讲两种,1.Java语言,Springboot框架为主开发时Jenkins持续集成,2.Js或Ts语言,以angualr框架或nodejs等为主开发,Jenkins集成。
当然持续集成软件有很多,比如git-ci等等,这里选Jenkins因为全面而且方便。

第一种:记录使用Jenkins,Git私库进行持续集成一个Java语言项目

环境

Java版本:jdk8
框架:springboot
操作系统: centos
协同开发:Git (私库)

关于环境题外话

版本控制现在用的比较多的就是svn和git。
推荐git,使用一次就再也不想用svn了。
免费好用的厂商提供的协同工具:

githubhttps://github.com/ 毋庸置疑,老牌王牌,缺点是国内网速不好,且私有项目收费,听说最近被微软收购了,不知道会不会有大的改动。

码云https://gitee.com/ 开源中国git版,国内速度快,缺点是私有项目只能有5个人,超过收费。

codinghttps://coding.net/ 服务器在香港,国内外访问速度都挺好,私有项目可以达到20人,目前还是比较不错的选择。小公司可以选择这个,基本不花钱。

自建git,很多公司为了代码安全,都是找台服务器自建git服务。大公司或者纯粹为了安全,推荐这种。

安装持续部署环境 Jenkins

创建新用户

好习惯是给每一个特殊的服务提供一个新的linux用户,当然你可以选择root

-- 添加用户
adduser  ci
-- 修改密码 
passwd ci 
-- 输入密码ci
--切换到ci默认目录
cd /home/ci

安装jdk

有时候一天linux服务器可能跑多个版本的jdk,你可能会遇到,解决办法有两种,第一,安装最高版本的jdk,第二,安装多个版本的jdk。考虑到你可能会遇到问题,这里记录单系统装多个版本jdk。
Linux 卸载JDK并安装新版本JDK (rpm,tar)
ubuntu或者linux下卸载和安装多个jdk版本,1.6,1.7和1.8版本
oracle官网下载JDK地址

安装jenkins

首先,我们从Jenkins官方网站https://jenkins.io/下载最新的war包。虽然Jenkins提供了Windows、Linux、OS X等各种安装程序,但是,这些安装程序都没有war包好使。我从未见过Jenkins这样把Java包做得如此简单的项目。只需要运行命令:

java -jar jenkins.war

Jenkins就启动成功了!它的war包自带Jetty服务器,剩下的工作我们全部在浏览器中进行。
假如你想让该程序后台运行

-- 设置为后台运行并修改端口
nohup java -jar jenkins.war --httpPort=8888 &

安装过程

第一次启动Jenkins时,出于安全考虑,Jenkins会自动生成一个随机的按照口令。注意控制台输出的口令,复制下来,然后在浏览器输入:
http://IP地址:端口/
比如: http://localhost:8080/

运行成功后,打开浏览器,一般要粘贴口令,安装插件,如果你第一次安装不是懂的很多,这里选择默认的推荐安装插件即可,安装完成后可以在设置中增删插件,登陆后创建用户,一般是admin超级管理员即可,这里也是登陆成功后可以进行用户管理,不喜欢的后边随时可以改。然后点击下一步下一步,基本就完成了安装。
安装成功后可以大体浏览下界面。

配置Springboot项目持续化集成

配置Maven插件


然后,在Jenkins首页选择“新建”,输入名字,选择“构建一个maven项目”:

new-job

在配置页中,源码管理选择Git,填入地址:

git-config

私钥配置

复制你私钥的文本粘贴在此即可。
私钥生成代码:

一 、

设置Git的user name和email:

$ git config --global user.name "xuhaiyan"
$ git config --global user.email "haiyan.xu.vip@gmail.com"


二、生成SSH密钥过程:
1.查看是否已经有了ssh密钥:cd ~/.ssh
如果没有密钥则不会有此文件夹,有则备份删除
2.生存密钥:
$ ssh-keygen -t rsa -C “haiyan.xu.vip@gmail.com”
按3个回车,密码为空。


Your identification has been saved in /home/tekkub/.ssh/id_rsa.
Your public key has been saved in /home/tekkub/.ssh/id_rsa.pub.
The key fingerprint is:
………………



最后得到了两个文件:id_rsa和id_rsa.pub



默认使用master分支。如果需要口令,在Credentials中添加用户名/口令,或者使用SSH Key。

构建触发器指定了触发一次构建的条件。推荐使用最简单的配置“Poll SCM”,它的意思是,定时检查版本库,发现有新的提交就触发构建。这种方式对git、SVN等所有版本管理系统都是通用的。

我们在日程表中填入:

* * * * *

trigger

表示每分钟检查一次。如果你觉得太频繁,可以改成“每3分钟检查一次”:

*/3 * * * *

在“Build”中,默认的Root POM是pom.xml。如果pom.xml不在根目录下,就填入子目录,例如:wxapi/pom.xml

在Goals and options中,填入需要执行的mvn命令:clean package,Jenkins将执行如下命令,或者不填

mvn clean package
特殊参数也在这里填写,如`-DskipTests=true clean package`。

保存后,就可以执行自动化构建了。

点击一个构建任务,可以在Console Output中看到控制台详细输出,便于出错排查:

console-output

如何部署

如果要部署构建好的war包,可以在Post Steps中填上shell命令,直接用脚本部署。

另一种方式是创建另外一个构建项目,手动触发部署。

无论用哪种方式,都是为了确保编译、部署是通过CI服务器完成的,而不是某台开发机器。
由于Springboot项目打包为jar,运行非常方便,这里就使用jar包发布。为了方便,我写了几段脚本,脚本如下:

shell方式

--启动脚本start.sh
#!/bin/bash
nohup java -jar ../../apidoc-1.0.0.jar &


--停止脚本stop.sh
#!/bin/bash
PID=$(ps -ef | grep apidoc-1.0.0.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
    echo Application is already stopped
else
    echo kill $PID
    kill $PID
fi


--run.sh集成启动和停止的sh
#!/bin/bash
echo "停止应用"
source ./stop.sh
echo "启动应用"
source ./start.sh


--为jennkins专门使用,主要原因是他必须使用绝对路径,run4jenkins 为jenkins的run.sh
#!/bin/bash
cd /home/ci/.jenkins/workspace/apidoc/target/classes/shell 这里是你的项目的绝对路径
echo "停止应用"
source ./stop.sh
echo "启动应用"
source ./start.sh


-- 注意防止杀死进程 and 必须用绝对路径
BUILD_ID=DONTKILLME
sh /home/ci/.jenkins/workspace/apidoc/target/classes/shell/run4jenkins.sh 

几个注意点

jenkins运行shell脚本必须使用绝对路径,这个跟linux是一致的,如果你想用相对路径,可以先cd切换到目录下在运行shell脚本。

jenkins启动的进程会被默认杀死,防止进程被杀死可以加这个参数BUILD_ID=DONTKILLME
我第一构建项目的时候,由于项目为Maven多模块,Jenkins不熟悉,构建了36次才成功,哈哈,所以你别急。编程开发,踩坑太正常了。
jenkins默认工作路径为/home/user/.jenkins,做迁移时,拷贝这个目录即可。
记录一个问题,我这里使用阿里云服务器,默认home文件夹为20G磁盘大小,后来磁盘满了,做了一次迁移。被耽误好多时间。
修改Jenkins默认工作路径:

vim /etc/profile
-- 增加 JENKINS_HOME 即可
JENKINS_HOME=/local/jenkins
export JENKINS_HOME

如何创建Linux服务

有了Jenkins,我们就可以在内网或者租用一台EC2服务器来搭建CI环境,每月费用不到¥100。推荐Ubuntu Linux系统。因为我们不想每次登录到Linux去启动Jenkins,也不想写脚本来启动服务。推荐安装JDK后,配合supervisor,把Jenkins直接变成一个服务。

可以在Linux上创建一个ci用户,然后,用supervisor启动并指定9001端口:

# /etc/supervisor/conf.d/ci.conf

[program:ci]
command=java -jar /home/ci/jenkins.war --httpPort=9001
user=ci
autostart=true
autorestart=true
startsecs=30
startretries=5

Jenkins默认在当前用户的主目录下创建.jenkins目录,所有的配置文件、数据库都存放在里面,只需要备份这个目录就备份了整个CI配置。

这样,一个CI环境就搭建完毕。

构建Angular等前端开发项目的持续集成

安装angular运行环境

这里可以使用docker,一个命令就可以启动一个运行环境,推荐使用。
我这台服务器有其他用途,所以我安装angular开发环境。

安装nodejs

centos6.5安装nodejs有些坑,我踩过了你就不要踩了。
1.yum源安装,nodejs没用最新版,angualr无非运行
2.官方推荐下载源代码,自动编译安装,但是centos6.5的c++变压器版本过老,无法编译最新版nodejs源码,需要替换c++编辑器,想想替换过程就操蛋。干脆放弃。
3.下载官方编译好的安装包。配置环境变量,我采用的这种

下载最新版 https://nodejs.org/en/download/

cd /local/src
mkdir nodejs
cd nodejs
wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz
-- 解压
xz -d ***.tar.xz
tar -xvf  ***.tar

--配置环境变量
vim /etc/profile
--增加如下
# nodejs
export NODE_HOME=/local/nodejs/node-v8.11.2-linux-x64
export PATH=$NODE_HOME/bin:$PATH
保存退出,刷新生效
source /etc/profile

--测试
node -v 
npm -v
输出版本信息,即安装成功

做一些优化配置

npm太慢, 淘宝npm镜像使用方法

淘宝 npm 地址: http://npm.taobao.org/

如何使用 有很多方法来配置npm的registry地址,下面根据不同情境列出几种比较常用的方法。以淘宝npm镜像举例:

1.临时使用

npm --registry https://registry.npm.taobao.org install express

2.持久使用

npm config set registry https://registry.npm.taobao.org

  • 配置后可通过下面方式来验证是否成功 npm config get registrynpm info express

3.通过cnpm使用

npm install -g cnpm --registry=https://registry.npm.taobao.org

  • 使用 cnpm install express

安装anglular-cli

anglular-cli是angular的开发手脚架,使用cli开发angular程序非常方便,不得不说google的工程师真的是非常牛!

升级安装npm
npm install npm -g
查看npm版本
npm -v
安装TypeScript
npm install -g typescript
查看TypeScript版本
tsc -v
安装 angular-cli
npm install -g @angular/cli
查看angular-cli 版本
ng -v

看到如下信息表示成功


备注:

图省事的话,其实就安装nodejs和angular-cli即可
到此,angular运行环境搭建完成。

配置Jenkins持续集成任务

新建一个 ‘自由风格的任务’



配置git


配置nodejs插件



配置触发器和定时扫描,这里是每分钟检测git一次,随你改



保存,然后构建任务

等待输出成功,查看日志打印如下


然后登陆linux,进入jenkins的工作目录,类似这里
/local/jenkins/workspace/cloud_front
执行项目初始化,这里跟angular开发操作无异,不展开细讲

npm install
然后运行项目
ng server

编译成功后,访问http:ip:4200 查看没什么错误,就可以知道构建脚本怎么写了
如果安装失败,请删除node_modules,重写npm install

rm -rf node_modules/

-- 如果你使用了scss而不是css,安装scss编译环境可能会出错
请尝试如下操作
-- 安装node编译c++扩展的工具dode-gyp
npm install -g node-gyp
-- 安装时尝试跳过错误
npm install  --unsafe-perm
--测试是否成功,可以单独安装node-scss
删除
npm uninstall node-sass
重新安装
npm install node-sass
-- node-sass安装失败,多少是网络原因,国内被墙了
首先要知道的是,安装 node-sass 时在 node scripts/install 阶段会从 github.com 上下载一个 .node 文件,
大部分安装不成功的原因都源自这里,因为 GitHub Releases 里的文件都托管在 s3.amazonaws.com 上面,
而这个网址在国内总是网络不稳定,所以我们需要通过第三方服务器下载这个文件
尝试cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org

# cnpm install node-sass@4.5.3 --save
或者在项目下建一个文件.npmrc 输入如下代码
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
phantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjs/
electron_mirror=https://npm.taobao.org/mirrors/electron/
registry=https://registry.npm.taobao.org

# 或者这样解决

npm install  --registry http://registry.npmjs.org/ -unsafe-perm
mac或者linux安装报错可能要带这个参数  -unsafe-perm

踩坑和问题

enkins下执行 ng build 命令会提示“命令未找到”,但是执行如 ls 等原生命令没有任何问题。在Linux主机是通过修改 /etc/profile 文件来配置环境变量,则问题可能是Jenkins在执行shell脚本时没有加载 /etc/profile 文件,因此找不到 ng 命令,会提示“命令未找到”。

● Jenkins默认情况下执行shell脚本是使用非登录方式,然而非登录方式不会加载 /etc/profile 文件,在 Execute shell 中 添加如 #!/bin/sh -l 命令修改为登录方式即可解决问题。
搞了好久,还是报错命令找不到,各种费劲。于是机智的我把这个问题跳过了,先凑合用吧。

这段你就当看不到就行了

啊,呸,让你费劲,我跳过这一步。
分析:angular-cli提供了各种方便的编译环境,我为什么不能用一下。
比如使用其下优势:
1.自动代理插件 ,解决跨域问题
2.服务器功能,解决另外部署服务器功能
3.自动检测文件改动,自动编译后拉起浏览器。使用这个功能,就不需要jenkins构建完了执行shell脚本了。直接ng server后,有文件更新cli会自动编译,万一有重大更新,比如增加了node 的依赖库或者依赖插件,那么登陆服务器执行如下脚本即可

cd /local/jenkins/workspace/cloud_front
npm install

nohup sh run.sh >run.log 2>1 &

其中run.sh脚本如下
#!/bin/sh -l
ng serve --port 4201 --base-href  --proxy-config proxy.conf.json --host 0.0.0.0

运行的日志就在run.log中,如果你想查看可以tail
tail -f run.log
# 机智如我,呵呵。啊,呸,浪费我两个小时解决命令行找不到

-- 扩展命令
查看关闭/后台任务
jobs
kill %job进程号

4.记得修改端口,防止占用或冲突,综上所述,ng脚本如下 ng serve --port 4201 --base-href --proxy-config proxy.conf.json --host 0.0.0.0

2018年6月18号补充

服务器阿里云 npm不稳定,我猜测是网络的问题,比如node-sass经常安装失败,切换淘宝源也不行,随改为yarn,相关脚本记录如下

关于yarn https://yarn.bootcss.com/

yarn
# 杀死进程
PID=$(netstat -nlp | grep :4203 | awk '{print $7}' | awk -F"/" '{ print $1 }')
if [ -z "$PID" ]
then
    echo Application is already stopped
else
    echo kill $PID
    kill $PID
fi

#启动
 nohup  yarn start-prod >log.log 2>1 & 

jenkins maven构建速度慢

加大jvm内存
-Xms800m -Xmx800m -XX:MaxNewSize=512m  -XX:MaxPermSize=512m

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容