一 、基础概念
软件开发中经常持续集成,持续交付,持续部署这三个概念到底是什么意思?
持续集成:
- 持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干并进程自动化测试
持续交付:
- 持续交付指的是在持续集成的环境基础之上,将代码部署到预生产环境
持续部署:
- 在持续交付的基础上,把部署到生产环境的过程自动化,持续部署和持续交付的区别就是最终部署到生产环境是自动化的
二、自动化部署流程
第一步:开发人员将代码上传到代码仓库,gitlab 根据gitlab-ci.yml中的命令,触发ci/cd逻辑,通知gitlab-runner进行构建部署
代码仓库工具:
- CVS(Concurrent Version System):
- 早期的集中式版本控制系统,现已基本淘汰
- 会出现数据提交后不完整的情况
- SVN(Subversion)--集中式版本控制系统
- 2000年开始开发,目标就是替代CVS
- 集中式管理,依赖于网络,一台服务器集中管理
- 目前很少公司在用
- Gitlib—分布式版本控制系统
- 2002年由linux内核作者Linus使用C语言开发
- 分布式版本控制系统,不依赖于服务器,离线依然可以工作
- 目前广泛适用于互联网公司
- 功能强大,使用灵活
- 目前主流的代码管理,后续篇幅主要也是通过git
第二步:gitlab-runner根据gitlab.yml脚本进行代码检测,单元测试
代码质量管理工具
- sornar-开源免费的代码质量管理工具
- 基于web浏览器访问,客户端无需任何安装
- sonar可以很方便地统计并展示单元测试覆盖率
- sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
- 程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方
- 检测注释不足或者过多
第三步: gitlab-runner根据gitlab.yml脚本进行构建打包
打包编译工具
- java语言:
- maven
- gradle
第四步:gitlab-runner根据gitlab.yml脚本将代码部署到相应的环境中
三、利用gitlab CI/CD 持续集成与部署实例讲解
下面我将如何进行docker自动化部署的整体流程以具体的例子进行讲解
运维架构流程图
gitlab安装
- 概念
Git,Gitlab,GitHub之间的关系
- git - 版本控制工具
- Git是一个免费的开源 分布式版本控制系统,可让您在本地跟踪更改并从远程资源推送或提取更改
- GitHub - 一个网站,提供给用户空间创建git仓储,保存用户的一些数据文档或者代码等
- Github目前拥有140多万开发者用户,好多用户将源代码托管到github
- GitLab - 基于Git的项目管理软件:
- GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务
gitlab CI/CD相关组件以及介绍
- GitLab CI / CD是GitLab内置的强大工具,允许您将所有连续方法(持续集成,交付和部署)应用于您的软件,而无需第三方应用程序或集成。
- GitLab CI/CD工作原理
- 在代码仓库的根目录下去创建.gitlab-ci.yml文件(注意是
.gitlab-ci.yml
) - .gitlab-ci.yml文件中需要定义要运行的脚本,定义包含和缓存依赖项,选择要按顺序运行的命令以及要并行运行的命令,定义要部署应用程序的位置等
- 每次提交代码,gitlab根据.gitab-ci.yml脚本出发对应的runner,运行脚本命令,脚本被分组到作业中,它们一起组成一个自动化部署流水线
- 在代码仓库的根目录下去创建.gitlab-ci.yml文件(注意是
- gitlab-runner
- GitLab Runner是一个开源项目,用于运行您的作业并将结果发送回GitLab
- 工具搭建
docker搭建gitlab
注意事项
1.gitlab比较占用没存,必须保证系统的内存在4GB以上,否则可能导致gitlab不能启动
2.此文章主要是讲解自动化部署,每个组件的具体使用情况就不详细介绍启动命令
docker run -d --publish 22:22 -p 80:80 -p 443:443 --name gitlab --restart unless-stopped -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab -v /var/run/docker.sock:/var/run/docker.sock twang2218/gitlab-ce-zh:10.5.4
详细说明
twang2218/gitlab-ce-zh:10.5.4:启动的镜像名称,次镜像是gtilab汉化版,镜像地址:
22端口:git端口,与本地的SSH端口冲突,我已经将本地ssh默认端口修改成其他的端口
80/443:gitlab web端口使用
登录地址:http://ip:port ,由于为我的web端口默认为80 ,直接输入http://ip即可进入gitlab界面
友情链接:gitlab管网搭建指南
gitlab-runner安装
docker启动gitlab-runner
sudo docker run -d --name gitlab-runner --restart=always -v /data/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:v10.6.0
友情链接:gitlab-runner官网安装指南
-
gitlab-runner注册到gitlab中
- 进入runner容器:
sudo docker exec -it gitlab-runner bash
- 将runner注册到gitlab中
sudo gitlab-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com ) :输入gitlab地址\
Please enter the gitlab-ci token for this runner:输入gitlab token
Please enter the gitlab-ci description for this runner:输入runner描述信息\
Please enter the gitlab-ci tags for this runner (comma separated):输入runner tag信息\
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:输入runner的类型\
Please enter the Docker image (eg. ruby:2.1):(如果选择docker需要输入镜像)
- gitlab token获取
管理员登录gitlab--->管理区域--概述---runner
- .gitlab-ci.yml脚本实例
stages:
- test
- build
- deploy
cache:
paths:
- .m2/
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2"
MAVEN_IMAGE: registry.cn-beijing.aliyuncs.com/qian/prod:maven3-jdk8
CONTAINER_NAME: daily_report_java
LAN_REPO: registry-vpc.cn-beijing.aliyuncs.com/qian/prod
WAN_REPO: registry.cn-beijing.aliyuncs.com/qian/prod
DEV_REPO: $WAN_REPO/dev
PRED_REPO: $WAN_REPO/pred
PROD_REPO: $LAN_REPO/prod
test and build image:
image: $MAVEN_IMAGE
stage: test
script:
- mvn package docker:build -q -Dmaven.test.skip=false -Dspring.profiles.active=test sonar:sonar -Dsonar.host.url=http://sonar.allhome.com.cn -Dsonar.login=admin -Dsonar.password=admin -Dsonar.projectName=$CONTAINER_NAME
tags:
- maven
only:
- release
build image:
image: $MAVEN_IMAGE
stage: test
script:
- mvn package docker:build -q -Dmaven.test.skip=true
tags:
- maven
only:
- dev
- master
push image dev:
stage: build
before_script:
- docker login --username=阿里云镜像仓库地址 --password="password" registry-vpc.cn-beijing.aliyuncs.com
script:
- echo $version
- docker tag $DEV_REPO:$CONTAINER_NAME $LAN_REPO/qianjia_dev:$CONTAINER_NAME
- docker push $LAN_REPO/qianjia_dev:$CONTAINER_NAME
tags:
- docker-run
only:
- dev
when: on_success
push image master:
stage: build
before_script:
- docker login --username=阿里云镜像仓库地址 --password="password" registry-vpc.cn-beijing.aliyuncs.com
script:
- docker tag $DEV_REPO:$CONTAINER_NAME $LAN_REPO/qianjia_pred:$CONTAINER_NAME
- docker push $LAN_REPO/qianjia_pred:$CONTAINER_NAME
tags:
- docker-run
only:
- release
when: on_success
push image prod:
stage: build
before_script:
- docker login --username=阿里云镜像仓库地址 --password="password" registry-vpc.cn-beijing.aliyuncs.com
script:
- docker tag $DEV_REPO:$CONTAINER_NAME $LAN_REPO/qianjia_prod:$CONTAINER_NAME
- docker push $LAN_REPO/qianjia_prod:$CONTAINER_NAME
tags:
- docker-run
only:
- master
when: on_success
ssh run on remote machine dev:
stage: deploy
script:
- bash ~/.local/bin/200.sh $CONTAINER_NAME 8801 8801 $DEV_REPO:$CONTAINER_NAME guojia 192.168.10.200
tags:
- shell-200
only:
- dev
when: on_success
ssh run on remote machine master:
stage: deploy
script:
- bash ~/.local/bin/deploy.sh $CONTAINER_NAME 8801 8801 $PRED_REPO:$CONTAINER_NAME zp 预生产ip地址
tags:
- shell-prod
only:
- release
when: on_success
ssh run on remote machine prod:
stage: deploy
script:
- bash ~/.local/bin/deploy.sh $CONTAINER_NAME 8801 8801 $PROD_REPO:$CONTAINER_NAME zp 生产ip地址
tags:
- shell-prod
only:
- master
when: on_success
- runner流水线
Pipelines 中文称为流水线,是分阶段执行的构建任务,一次自动发布流程就称为一次流水线,以上边脚本举例,安装依赖、运行测试、打包、部署开发服务器等整套流程叫做一次流水线
- 查看流水线:进行gitlab项目目录-----CI/CD----流水线即可查看项目部署的流水线
Stages:Stages 表示构建阶段,一次流水线包括多个stages,在脚本实例中stages定义了一次流水线的三个阶段:第一个阶段:运行测试,进行代码检测,第二个阶段:打包java程序并生成镜像,第三个阶段:执行shell脚本,把容器部署到服务器
- 每个阶段有tag制定的runner去执行
- 每个阶段按照脚本顺序进行
Jobs :表示构建的作业(或称之为任务),表示某个 Stage 里面执行的具体任务。我们可以在 Stages 里面定义多个 Jobs
- 相同 Stage 中的 Jobs 无执行顺序要求,会并行执行
- 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
- 如果任何一个 Job 失败,那么该 Stage 失败,
- 总结:
- 一次自动发布流程称为一次流水线,每个流水线有多个阶段,每个阶段有多个任务
- 上边的博客只是写了一个整体发布流程没有具体写每个工具的使用方法,请自行查阅
- 上面的脚本是还需要在项目根目录里面添加dockerfile文件,每个公司的dockerfile文件不同,不做展示,在.gitlab-ci.yml构建镜像的时候会自动使用项目根目录下的dockerfile
原文地址:https://blog.51cto.com/11750513/2422946