从零构建企业CICD工作流,以springboot+vue项目为例
CICD的解释
通用解释
CICD 是 持续集成(ContinuousIntegration)和持续部署(ContinuousDeployment)简称,指在开发过程中自动执行一系列脚
本来减低开发引入 bug的概率,在新代码从开发到部署的过程中,尽量减少人工的介入。
关于Devops思想可以参考一篇不错的文章:
(转载)https://www.zhihu.com/tardis/sogou/art/32822063
最初是瀑布模型,后来是敏捷开发,现在是DevOps,这是现代开发人员构建出色的产品的技术路线。随着DevOps的兴起,
出现了持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(ContinuousDepl
oyment) 的新方法。传统的软件开发和交付方法正在迅速变得过时。从历史上看,在敏捷时代,大多数公司会每月,每
季度,每两年甚至每年发布部署/发布软件。然而,现在,在DevOps时代,每周,每天,甚至每天多次是常态。当SaaS正
在占领世界时,尤其如此,您可以轻松地动态更新应用程序,而无需强迫客户下载新组件。很多时候,他们甚至都不会意
识到正在发生变化。开发团队通过软件交付流水线(Pipeline)实现自动化,以缩短交付周期,大多数团队都有自动化流
程来检查代码并部署到新环境。
今天,我们将介绍什么是CI / CD /CD,以及现代软件公司如何使用工具将部署代码的流程自动化。
持续集成的重点是将各个开发人员的工作集合到一个代码仓库中。通常,每
天都要进行几次,主要目的是尽早发现集成错误,使团队更加紧密结合,更
好地协作。
持续交付的目的是最小化部署或释放过程中固有的摩擦。它的实现通常能够
将构建部署的每个步骤自动化,以便任何时刻能够安全地完成代码发布(理
想情况下)。
持续部署是一种更高程度的自动化,无论何时对代码进行重大更改,都会自
动进行构建/部署。
对软件的每次更改,都会在发布过程中经历一个复杂的过程。该过程涉及构建软件,然后通过多个测试和部署阶段进行
这些构建。反过来,这需要许多人之间的合作,也许需要几个团队之间的合作。部署管道对此过程进行建模,并且它在
持续集成和发布管理工具中的实现,使您能够在从版本控制转移到各种测试和部署,以向用户发布时查看和控制每个
更改的进度。
个人解释
作为一个合格的开发者,不只是写代码那么简单,而应该对自己的所有产出负责。也就是所谓的开发、测试、部署、运维
一体化。在产出代码的同时,也需要负责自己的功能模块和依赖如何打包、部署、维护。而一个团队多个开发者之间则需
要统一这种打包部署方式,并简化加速这个过程,使大家的核心还是能够聚焦在业务构建和功能对接上。
同样,客户与团队之间,产品和开发之间,都需要及时尽早的需要看到开发的效果,进行修正,以免南辕北辙。
大体流程
文档简介
第一部分:准备工作。各项服务的安装
一、安装Docker
二、安装Gitlab
三、安装Nexus
四、安装Jenkins
五、安装Harbor
第二部分:环境配置。主要讲安装服务间协调配置,使用规范。
一:服务器上的gitlab配置:
用户、分组、项目管理、分支管理
二:服务器上的nexus配置:
用户、仓库、代理管理
三:服务器上的maven配置:
对接私服
四:服务器上的jenkins配置:
java、maven、docker、git、node、ssh、资产、秘钥、插件
第三部分:开发测试对接。开发时如何利用这一套加快开发效率。
springboot项目:
本地maven配置
项目pom配置
vue项目:
webpack配置
公共部分:
docker的使用
DockerFile编写
docker-compose.yml编写
利用Jenkins自动发布
第四部分:运维管理。如何更方便的维护这一套。
docker-compose编排
Portainer监控
k8s(感觉中型项目都没必要去搞这玩意儿)
准备工作
从流程图上看我们需要准备的是:
docker gitlab nexus harbor nas(非必要) jenkins 以及服务器若干 springboot项目 vue项目
一:安装Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
找到一台服务器,安装docker
1、卸载旧版本Docker(没安装过的可跳过)
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
$ find / -name docker
$ rm -rf [上个命令列出来的的路径及文件]
2、安装Docker工具包
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3、配置镜像仓库
$ sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、安装Docker CE
$ sudo yum install docker-ce
5、启动Docker服务
$ sudo systemctl start docker
6、测试是否成功
$ sudo docker run hello-world
7、配置国内加速器
$ vi /etc/docker/daemon.json
写入如下内容:
{
"registry-mirrors": ["https://unwchefq.mirror.aliyuncs.com"]
}
$ service restart docker
二、安装Gitlab
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
这里直接用了docker命令去部署、也存在无法使用ssh协议的问题。
后续会整改成docker-compose的形式部署,并且修复ssh支持的问题。
拉取镜像
docker pull beginor/gitlab-ce:11.0.1-ce.0
创建数据映射目录
mkdir -p /data/gitlab/etc
mkdir -p /data/gitlab/log
mkdir -p /data/gitlab/data
启动镜像
docker run \
--detach \
--publish 8443:443 \
--publish 8088:80 \
--name gitlab \
--restart unless-stopped \
-v /data/gitlab/etc:/etc/gitlab \
-v /data/gitlab/log:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
beginor/gitlab-ce:11.0.1-ce.0
配置GitLab主机名
vim /data/gitlab/etc/gitlab.rb
external_url "[ip地址]"
vim /data/gitlab/data/gitlab-rails/etc/gitlab.yml
gitlab:
host: [ip地址]
port: 8088
修改端口
vim /data/gitlab/etc/gitlab.rb
nginx['listen_addresses'] = ['*']
nginx['listen_port'] = 8088
#tomcat端口占用的情况下
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 8082
修改Gitlab数据存储路径
#防止数据过大
vim /data/gitlab/etc/gitlab.rb
git_data_dirs({ "default" => { "path" => "/data/gitlabData" } })
配置并启动GitLab
docker exec -ti gitlab /bin/bash
gitlab-ctl reconfigure #花时间比较多
gitlab-ctl restart #改IP重启就可以了
gitlab-ctl status
访问gitlab
http://{host}:8081/
三、安装nexus
nexus是指maven私服或者说工件库。代码编译出来结果的一个公共存储库。
这里直接用了docker命令去部署,后面会整改成docker-compose的形式
拉取镜像
docker image pull sonatype/nexus3
启动容器
docker run \
-d -p 8081:8081 \
-v /data/nexus-data:/nexus-data \
--name nexus3 \
--restart always \
sonatype/nexus3
#先解释下这条命令:
#-d:表示在docker守护线程运行这个镜像;
#-p:表示绑定端口,前面的端口表示宿主机端口,后面的表示容器端口,如果宿主机的8081端口已经被占用了,那么可以改为8082:8081,为什么后面的是8081端口?这是Nexus服务自己设定的,可以修改,但是跑docker的话没必要了,下面都是以8081为nexus的端口;
#--restart=always:这个指定docker重启启动容器,当服务器或者docker进程重启之后,nexus容器会在docker守护进程启动后由docker守护进程启动容器,容器#--name :这里是指定了容器建立后的名称;
#-v 代表数据映射目录
#最后面的sonatype/nexus3是镜像名。
检查nexus3运行情况
curl -u admin:admin123 http://localhost:8081/service/metrics/ping
#nexus3初次运行需要几分钟,不一定马上启动马上响应
#上面的用户名和密码根据自己本机的用户名密码修改即可
#得到pong响应即表示nexus3启动完成
访问nexus页面
http://{host}:8081/
管理Nexus容器
docker container start nexus3
docker container stop nexus3
docker container restart nexus3
设置nexus容器自动启动
docker update --restart=always nexus3
四、安装Jenkins
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台
因涉及到配置时各种环境、目录等因素。jenkins采用本地安装的形式,不采用docker
安装java8
yum install -y wget 或者 apt-get install wget
mkdir /usr/local/java
cd /usr/local/java
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"
tar zxvf jdk-8u141-linux-x64.tar.gz
vi /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_141
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
安装maven
mkdir /usr/local/maven
cd /usr/local/maven
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar zxvf apache-maven-3.6.3-bin.tar.gz
vi /etc/profile
export M2_HOME=/usr/local/maven/apache-maven-3.5.0
export CLASSPATH=$CLASSPATH:$M2_HOME/lib
export PATH=$PATH:$M2_HOME/bin
source /etc/profile
安装node
mkdir /usr/local/node
cd /usr/local/node
wget https://npm.taobao.org/mirrors/node/v12.14.0/node-v12.14.0-linux-x64.tar.xz
tar -xvf node-v12.14.0-linux-x64.tar.xz
mv node-v6.10.0-linux-x64 nodejs-6.10.0
ln -s /usr/local/node/nodejs-6.10.0/bin/npm /usr/bin/
ln -s /usr/local/node/nodejs-6.10.0/bin/node /usr/bin/
node -v
npm -v
安装git
cenos
yum -y install git
ubuntu
sudo apt install git
安装Jenkins
ubuntu
#添加官方软件仓库的秘钥到本地的apt秘钥中
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
#将地址添加进本地的软件源列表
deb https://pkg.jenkins.io/debian-stable binary/
sudo apt-get update
sudo apt-get install jenkins
sudo vi /etc/default/jenkins
#修改启动端口
HTTP_PORT=8089
#修改用户
JENKINS_USER=root
service jenkins start/stop/restart
cenos
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
yum install -y jenkins
vi /etc/sysconfig/jenkins
#修改如下内容
JENKINS_PORT="8089"
#修改用户
JENKINS_USER="root"
service jenkins start/stop/restart
访问jenkins
http://{host}:8089/
五、安装Harbor
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器。是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装,除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库
安装docker-compose
cenos
yum -y install epel-release
yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose version
ubuntu
apt-get install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose version
安装Harbor
mkdir /usr/local/harbor
cd /usr/local/harbor
wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz
tar -zxvf harbor-offline-installer-v1.5.0.tgz
vi harbor.cfg
#修改hostname 为自己的ip或者域名
hostname = *.*.*.*
#修改系统登录密码
harbor_admin_password = *******
vi docker-compose.yml
#修改启动端口
proxy:
image: vmware/nginx-photon:v1.4.0
container_name: nginx
restart: always
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
ports:
- 81532:80
- 81533:443
- 81534:4443
添加docker环境信任
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://unwchefq.mirror.aliyuncs.com"]
"insecure-registries" : ["{ip或者域名}:81532"]
}
登录
docker login {ip或者域名}:81532
用户名:admin
password:见配置文件
浏览器访问
http://{ip或者域名}:81532
未完待续。。。