持续集成/部署

284 阅读10分钟

持续集成、持续部署是 代码开发到项目部署的一套自动化流程,可以大大提高开发到部署的工作效率。

流程示意图:

image.png

环境准备:

  • 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已内置于开发管道,持续交付的目标是拥有一个可随时部署到生产环境的代码库。

image.png

2.1.3 持续部署

持续部署(continuous Deployment,简称CD)。
对于成熟的CI/CD管道来说,最后的阶段是持续部署。作为持续交付--自动将生产就绪型构建版本发布到代码存储库--的延伸。持续部署可以将应用自动发布到生产环境,由于在生产之前的管道阶段没有生动门控,因此持续部署在很大程度上都得依赖精心设计的测试自动化。

2.4 工作流程

2.4.1传统的工作流

image.png 带来的问题:\

  • 重复性劳动,无效的等待变多
  • 很晚才发现缺陷,并且难以修复
  • 低品质的软件,软件交付时机无法保障
  • 项目缺少可见性

2.4.2 常见的工作流

image.png plan(任务拆分、分配)-code(编码)-build(构建)-test(测试)-release(发布)-deploy(部署)-operate(运维)-monitor(监控)

2.5效率工具对比

image.png

代码管理主要是:gitlab、github 测试和构建环节:jenkins、travis CI、circle CI CD:云平台、物理机

1、jenkins
jenkins-ci.org

image.png

2、travis CI

image.png

3、circle CI

image.png

image.png

jenkins简介

image.png

image.png 红色代表构建失败,点进去会有下面的界面

image.png

image.png

jenkins安装

image.png jdk官方地址:www.oracle.com/java/techno…

找到8u211版本下载

image.png

# 上传到 /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

image.png jdk8下载 linux-x64-tar.gz

image.png

image.png
使用ftp工具连接服务器,我使用了filezilla
我们在home目录下创建java目录,然后把下载好的jdk-8u211-linux-x64.tar.gz传到此目录
到终端工具执行以下命令查询系统版本

cat /etc/*release

image.png 进入到/home/java目录,发现有jdk压缩包

image.png

# 创建一个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

image.png 下面来添加一下环境变量

# 添加环境变量
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

image.png

image.png 下面来安装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页面打开后把初始密码复制进去

image.png

image.png

image.png 打开浏览器: image.png 登录后 image.png 别人登录后 image.png 为了演示,安装社区推荐的插件

使用jdk8-211 jenkins 2.176.1打开后

image.png 密码根据提示在下图位置可以查到

image.png

image.png

Docker 安装jenkins

image.png

image.png

image.png

image.png

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容器命令后

image.png

怎么去看jenkins的初始密码?

# docker logs 容器名
docker logs 03eb816f1327

image.png

由于我的8080端口被占用,我把宿主机的ip改成了8888

在浏览器打开 ip:8888

image.png

输入密码后

image.png 我的是英文,并且安装不上插件,别人的是中文,界面长这样:

image.png 打开blueocean

image.png jenkins插件加速:更换更新站点,再次下载插件就会比原来的快

# https://updates.jenkins.io/update-center.json (原来的地址)
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json

image.png manage jenkins---manage plugins---advanced---updatesite url

image.png 配置环境: 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)

image.png

image.png

使用jenkins配置一个自动化任务

image.png

1、在插件管理-可选插件里搜索 github
选择 GitHub integration 插件
2、 搜索gitlab,勾选 GitLab插件
3、搜索 ssh,勾选Publish Over SSHSSH AgentSSHSSH Pipeline steps  直接安装
4、勾选安装完成后重启jenkins

jenkins和git服务器做连接

这里采用 dokcer-compose.yml安装

https://github.com/sameersbn/docker-gitlab

把docker-compose.yml文件拷贝出来

image.png 拷贝出来之后,需要配置两个东西:(主要是配置git lab)

1GITLAB_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提供了很多钩子函数,触发他们就会执行相应的任务

image.png 我们在jenkins中创建一个任务:

image.png 新建一个名字叫jenkins-demo的任务

image.png 选择构建自由风格的软件项目

image.png 创建完项目后,把鬼剑触发器中的url铁道gitlab中的webhook的url中

image.png

image.png

image.png 然后点击保存
然后回到刚才的jenkins-demo项目,把链接和密钥对复制进来

image.png 这里选择允许哪些分支触发事件

image.png 构建顺序就是就是选项卡从左到右,先从git上获取源码,再构建触发器,再做一些操作(放到存储库,还是构建?),这里添加了一个shell命令

image.png 之后,编辑下代码,提交一下,就看到jenkins触发了任务,打印出 hello world

image.png

用pipeline创建自动化任务

1、先在gitlab上创建一个项目 image.png 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
创建流水线

image.png 选择git,下面输入git仓库(http或ssh)

image.png 输入用户名密码(如果是私有的),然后点击创建流水线

image.png 创建完成后,就会来到

image.png 点击进去

image.png 可以点击编辑图标,去编辑流水线

image.png 进去编辑后,最先展示的是最开始的agent,就是刚才的node脚本

image.png

image.png 还可以添加脚本

image.png 可以添加stage,串行的或并行的

image.png

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

创建流水线

image.png 选择git,输入仓库地址

image.png

image.png 然后点击创建流水线

image.png 构建成功后

image.png

在项目内创建scripts文件夹,提供两个脚本文件

image.png 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,点击小齿轮

image.png 可以把多分支构建触发器勾选起来,选择1分钟轮询,当轮询到分支有变化时,就会自动构建

image.png 然后进入blue ocean,看到在执行刚才的脚本

image.png

用jenkins配置自由风格的软件项目

推荐插件: nodejs查件,主要是用于不同版本的node打包,特别注意的是,使用jenjinsci/blueocean镜像的同学,需要运行新的容器,以便nodejs插件生效。
Publish Over SSH 用于构建完成之后,推送到远程的web服务器

在gitlab上创建一个项目

配置jenkins

系统管理-插件管理-可选插件-搜索nodejs

image.png 安装完成后,勾选jenkins自动重启;
进入系统管理-全局工具配置
给nodejs起别名,选择版本,选择安装包,然后保存

image.png 之后新建一个任务,选择构建一个自由风格的项目,点击确定

image.png

image.png 源码管理:选择用什么版本管理工具(git or svn)
构建触发器:告诉jenkins,是在什么条件下去触发这个任务
构建环境:指明环境,比如前端的nodejs是什么版本
构建:里面包含了一些打包测试的操作
构建后的操作: 比如进行一些单元测试、性能测试 \

源码管理选择git
填入仓库地址、填入账户密码、选择分支 image.png

构建触发器:选用gitlab的webhooks, 在高级里生成秘钥

image.png

在gitlab的设置-集成里就可以设置webhooks,填写jenkins提供的url,填写秘钥。

image.png 取消勾选 enable ssl verification,因为走的是本地环境,走的是http协议,没有证书,然后点击add webhook image.png 轮询scm,是指jenkins会每隔一段时间,检查代码有没有变化,有变化就触发任务
轮询会比较浪费资源,我们不使用轮询,使用比较友好的webhooks image.png

接下来在构建环境里选择 provide node & npm bin/folder to PATH

image.png

紧接着添加构建步骤,选择执行shell

image.png 点击保存

image.png