持续集成、持续部署是 代码开发到项目部署的一套自动化流程,可以大大提高开发到部署的工作效率。
流程示意图:
环境准备:
- linux服务器(CentOS7.6/ubuntu16.04LTS)
- VSCode+插件Dockerfile
- 注册github账号
2 持续集成
2.1 集成,就是一些孤立的事物或元素通过某种方式集中在一起,并且产生联系,从而构成一个有机整体的过程。
2.1.1 持续集成
持续集成(continuous integration,简称CI)。
在软件工程中,持续集成是将所有开发者工作副本每天多次合并到主干的做法。
2.1.2 持续交付
持续交付(continuos Delivery, 简称CD)。
完成CI中构建及单元测试和集成测试的自动化流程后,持续交付可自动将以验证的代码发布到存储库,为了实现高效的持续交付流程,务必要确保CI已内置于开发管道,持续交付的目标是拥有一个可随时部署到生产环境的代码库。
2.1.3 持续部署
持续部署(continuous Deployment,简称CD)。
对于成熟的CI/CD管道来说,最后的阶段是持续部署。作为持续交付--自动将生产就绪型构建版本发布到代码存储库--的延伸。持续部署可以将应用自动发布到生产环境,由于在生产之前的管道阶段没有生动门控,因此持续部署在很大程度上都得依赖精心设计的测试自动化。
2.4 工作流程
2.4.1传统的工作流
带来的问题:\
- 重复性劳动,无效的等待变多
- 很晚才发现缺陷,并且难以修复
- 低品质的软件,软件交付时机无法保障
- 项目缺少可见性
2.4.2 常见的工作流
plan(任务拆分、分配)-code(编码)-build(构建)-test(测试)-release(发布)-deploy(部署)-operate(运维)-monitor(监控)
2.5效率工具对比
代码管理主要是:gitlab、github 测试和构建环节:jenkins、travis CI、circle CI CD:云平台、物理机
1、jenkins
jenkins-ci.org
2、travis CI
3、circle CI
jenkins简介
红色代表构建失败,点进去会有下面的界面
jenkins安装
jdk官方地址:www.oracle.com/java/techno…
找到8u211版本下载
# 上传到 /opt/jdk8目录下
# tar解压JSK安装包
mkdir -p /opt/jdk8 && cd /opt/jdk8
tar zxvf jdk-8u211-linux-x64.tar.gz -C /opt/jdk8 --strip-components 1
# vi /etc/profile
export JAVA_HOME=/opt/jdk8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
安装jenkins
mkdir -p /opt/jenkins && cd /opt/jenkins
wget -O /opt/jenkins/jenkins.war https://mirrors.jenkins.io/war-stable/latest/jenkins.war
上面命令报错,说服务器证书过期,可以用以下命令跳过验证,不推荐在生产环境跳过验证
wget --no-check-certificate https://mirrors.jenkins.io/war-stable/latest/jenkins.war
java -jar jenkins.war --httpPort=8080
jdk8下载 linux-x64-tar.gz
使用ftp工具连接服务器,我使用了filezilla
我们在home目录下创建java目录,然后把下载好的jdk-8u211-linux-x64.tar.gz传到此目录
到终端工具执行以下命令查询系统版本
cat /etc/*release
进入到/home/java目录,发现有jdk压缩包
# 创建一个jdk目录
mkdir -p /opt/jdk8
# 使用tar安装解压命令来解压jdk8压缩包
# --strip-components 1 参数意思是 解压后不要保留1级名称,不带此参数会解压出一个jdk-8u371-linux-x64文件夹,加上此参数,会把内容直接解压到jdk8目录下。
tar zxvf jdk-8u211-linux-x64.tar.gz -C /opt/jdk8 --strip-components 1
# 进入/opt/jdk8查看一下
cd /opt/jdk8
ls -la
下面来添加一下环境变量
# 添加环境变量
vi /etc/profile
# 打开编辑界后使用ctrl f滚动到页面的最下方
# 然后按 o (在下一行插入)
# 复制一下下面的环境变量,然后在光标处右键选择粘贴
export JAVA_HOME=/opt/jdk8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
# 按esc切换模式, 输入 :wq (保存退出)
# 然后让配置生效
source /etc/profile
# 验证一下,打印出java版本,代表java已经安装成功了
java -version
下面来安装jenkins
# 创建jenkins目录
mkdir -p /opt/jenkins && cd /opt/jenkins
# 用wget命令下载jenkins的war包
wget -O /opt/jenkins/jenkins.war https://mirrors.jenkins.io/war-stable/latest/jenkins.war
# 上面命令报错,说服务器证书过期,可以用以下命令跳过验证,不推荐在生产环境跳过验证
wget --no-check-certificate https://mirrors.jenkins.io/war-stable/latest/jenkins.war
# 最新版本匹配的是java11版本,这里下载2.176.1版本的jenkins包,匹配java8
wget --no-check-certificate https://mirrors.jenkins.io/war-stable/2.176.1/jenkins.war
# 下图所示,下载完的jenkins文件名被命名为jenkins.war.1了,我们把它改成jenkins.war
mv jenkins.war.1 jenkins.war
# 用java jar命令来运行jenkins的var包
java -jar jenkins.war --httpPort=8080
# 看到启动jenkins成功后的密码
860942ab5ddc4124a886e85e2a1e0acd
# 在浏览器打开 服务器ip:8080
192.168.188:100:8080
# 有可能防火墙开着,需要关闭防火墙才能打开,查一下防火墙状态
firewall-cmd --state
# 如果开着,关闭防火墙
systemctl stop firewalld.service
# jenkins页面打开后把初始密码复制进去
打开浏览器:
登录后
别人登录后
为了演示,安装社区推荐的插件
使用jdk8-211 jenkins 2.176.1打开后
密码根据提示在下图位置可以查到
Docker 安装jenkins
jenkins with Blue Ocean对pipeline提供了可视化。
# 以下两种选择一种jenkins安装即可
# 安装jenkins
docker run \
-itd \
-u root \
-p 8080:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \
--name jenkins-master \
jenkins/jenkins
# jenkins blueocean
docker run \
-itd \
-u root \
-p 8888:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \
--name jenkins-master \
jenkinsci/blueocean
jenkins的界面已经见过了,下面采用jenkinsci/blueocean
执行启动jenkinsci/blueocean容器命令后
怎么去看jenkins的初始密码?
# docker logs 容器名
docker logs 03eb816f1327
由于我的8080端口被占用,我把宿主机的ip改成了8888
在浏览器打开 ip:8888
输入密码后
我的是英文,并且安装不上插件,别人的是中文,界面长这样:
打开blueocean
jenkins插件加速:更换更新站点,再次下载插件就会比原来的快
# https://updates.jenkins.io/update-center.json (原来的地址)
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
manage jenkins---manage plugins---advanced---updatesite url
配置环境:
manage jenkins---configure system
1、配置jenkins的url
2、可以设置 环境变量
3、添加github服务器
4、添加github秘钥
5、shell
6、邮件通知
...
常用工具配置: global tool configuration
添加新的jdk
git
Maven
dokcer
jenkins用户管理 凭据管理 configure global security
凭据管理主要是一些用户管理
安全域
授权策略(选择安全矩阵,添加组,勾选权限, 再保存前一定要把用户添加进来,给他所有权限)(admin 12345678)
使用jenkins配置一个自动化任务
1、在插件管理-可选插件里搜索 github
选择 GitHub integration 插件
2、 搜索gitlab,勾选 GitLab插件
3、搜索 ssh,勾选Publish Over SSH、SSH Agent、SSH、SSH Pipeline steps 直接安装
4、勾选安装完成后重启jenkins
jenkins和git服务器做连接
这里采用 dokcer-compose.yml安装
https://github.com/sameersbn/docker-gitlab
把docker-compose.yml文件拷贝出来
拷贝出来之后,需要配置两个东西:(主要是配置git lab)
1、GITLAB_HOST 默认是localhost,可以配置成虚拟机ip(这里配置的是gitlab实例ip)
2、配置root用户密码: GITLAB_ROOT_PASSWORD=12345678
3、配置一个邮箱: GITLAB_ROOT_EMAIL=xxx@xx.com
在服务器home目录下创建一个gitlab目录,创建一个docker-compose.yml文件,将刚才修改好的内容全部放进去
# 进入home目录
cd /home
# 创建gitlab目录
mkdir gitlab
# 进入gitlab目录
cd gitlab
# 编辑并创建docker-compose.yml文件
vi docker-compose.yml
# i命令进入编辑状态,然后ctrl+v把刚复制的内容粘贴进来
# esc退出, :wq 保存退出
安装docker-compose
# 下载
sudo curl -L https://github.com/docker/compose/releases/download/1.20.0/docker/usr/local/bin/docker-compose-'uname -S'-'name -m' -o /usr/local/bin/docker-compose
# 安装
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version
# 用docker-compose运行gitlab
docker-compose up -d
我这里没有用自己的gitlab实例,因为我没有自己的gitlab实例,我直接用的外网的gitlab账号;
可以在个人偏好设置--本地化设置中文简体--再次登录就变成中文界面了.
创建一个jenkins-demo项目,设置--webhooks
webhooks提供了很多钩子函数,触发他们就会执行相应的任务
我们在jenkins中创建一个任务:
新建一个名字叫jenkins-demo的任务
选择构建自由风格的软件项目
创建完项目后,把鬼剑触发器中的url铁道gitlab中的webhook的url中
然后点击保存
然后回到刚才的jenkins-demo项目,把链接和密钥对复制进来
这里选择允许哪些分支触发事件
构建顺序就是就是选项卡从左到右,先从git上获取源码,再构建触发器,再做一些操作(放到存储库,还是构建?),这里添加了一个shell命令
之后,编辑下代码,提交一下,就看到jenkins触发了任务,打印出 hello world
用pipeline创建自动化任务
1、先在gitlab上创建一个项目
2、拉取到本地,用vscode打开,在商店搜索jenkinsfile插件,安装;
jenkins中文官网
www.jenkins.io/zh 3、项目拉取下来后,创建jenkinsfile文件,内容为
pipeline {
agent {
docker {
// 用node 10版本的镜像
image 'node:10'
// 参数 设置端口映射,宿主机20000:虚拟机8080
args '-p 20000:8080'
}
}
stages {
stage('Build') {
steps {
//
sh 'node -v'
echo 'echo "hello world!!"'
}
}
// stage('Test') {
// steps {
// //
// }
// }
// stage('Deploy') {
// steps {
// //
// }
// }
}
}
4、在jenkins界面打开 blue Ocean
创建流水线
选择git,下面输入git仓库(http或ssh)
输入用户名密码(如果是私有的),然后点击创建流水线
创建完成后,就会来到
点击进去
可以点击编辑图标,去编辑流水线
进去编辑后,最先展示的是最开始的agent,就是刚才的node脚本
还可以添加脚本
可以添加stage,串行的或并行的
pipeline + vue流水线集成
在gitlab中创建项目,创建一个git项目
在项目根目录创建jenkinfile文件
vscode装过jenkinsfile插件后,在jenkinsfile文件里输入pipeline 按tab键,会自动出现代码片段,只需要修改里面的内容。
jenkinsfile:
pipeline{
// 媒介
agent{
docker {
image 'node'
args '-p 20000:8080'
}
}
stages{
// 构建-阶段
stage("Build"){
steps{
// 安装依赖
sh 'yarn install'
}
}
// 部署-阶段
stage("Deploy"){
steps{
// 打印一下当前文件夹下的文件(检查一下脚本执行)
sh 'ls -la'
// 打印一下(进入构建阶段)
sh 'echo "deploy stage"'
}
}
}
}
然将代码提交上去
进入jenkins打开blue ocean
创建流水线
选择git,输入仓库地址
然后点击创建流水线
构建成功后
在项目内创建scripts文件夹,提供两个脚本文件
deploy.sh
运行项目,把输出的pid文件放到后缀为.pidfile的文件
#!/usr/bin/env sh
set -x
npm run serve &
sleep 1
echo $! > .pidfile
set +x
kill.sh 杀死之前的文件进程
set -x
kill $(cat .pidfile)
然后更改原来的jenkinsfile文件内容
pipeline {
// 媒介
agent{
docker {
image 'node'
args '-p 20000:8080'
}
}
stages {
// 构建-阶段
stage("Build") {
steps{
// 安装依赖
sh 'yarn install'
}
}
// 部署-阶段
stage("Deploy") {
steps {
// 首先给两个scripts执行权限
sh 'chmod +x ./scripts/*.sh'
// 执行deploy.sh脚本命令
sh './scripts/deploy.sh'
// 做一个交互的事情(相当于前端的confirm)
input '是否使用web网站?(点击继续)'
// 执行kill.sh脚本
sh './scripts/kill.sh'
}
}
}
}
之后把代码提交,来到jenkins,点击小齿轮
可以把多分支构建触发器勾选起来,选择1分钟轮询,当轮询到分支有变化时,就会自动构建
然后进入blue ocean,看到在执行刚才的脚本
用jenkins配置自由风格的软件项目
推荐插件:
nodejs查件,主要是用于不同版本的node打包,特别注意的是,使用jenjinsci/blueocean镜像的同学,需要运行新的容器,以便nodejs插件生效。
Publish Over SSH 用于构建完成之后,推送到远程的web服务器
在gitlab上创建一个项目
配置jenkins
系统管理-插件管理-可选插件-搜索nodejs
安装完成后,勾选jenkins自动重启;
进入系统管理-全局工具配置
给nodejs起别名,选择版本,选择安装包,然后保存
之后新建一个任务,选择构建一个自由风格的项目,点击确定
源码管理:选择用什么版本管理工具(git or svn)
构建触发器:告诉jenkins,是在什么条件下去触发这个任务
构建环境:指明环境,比如前端的nodejs是什么版本
构建:里面包含了一些打包测试的操作
构建后的操作: 比如进行一些单元测试、性能测试 \
源码管理选择git
填入仓库地址、填入账户密码、选择分支
构建触发器:选用gitlab的webhooks, 在高级里生成秘钥
在gitlab的设置-集成里就可以设置webhooks,填写jenkins提供的url,填写秘钥。
取消勾选 enable ssl verification,因为走的是本地环境,走的是http协议,没有证书,然后点击add webhook
轮询scm,是指jenkins会每隔一段时间,检查代码有没有变化,有变化就触发任务
轮询会比较浪费资源,我们不使用轮询,使用比较友好的webhooks
接下来在构建环境里选择 provide node & npm bin/folder to PATH
紧接着添加构建步骤,选择执行shell
点击保存