长话短说

经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解。

看过博客园《docker-compose真香》一文的园友留意到文中[把部署dll文件拷贝到生产机器],现场打包成镜像并启动容器,并没有完成CI/CD.

P1:Gitlab CI/CD原理和Gitlab Runner安装(这里使用shell执行器)

P2:基于Docker-compose的Gitlab CI/CD 实践:

  • 宏观业务架构图

  • .gitlab-ci.yml文件

  • 项目部署文件

Gitlab CI/CD部署准备

Gitlab CI/CD原理

  • Gitlab CI/CD   存储[构建]、[构建状态]的api应用程序, 提供友好的管理界面,  构建过程由 .gitlab-ci.yml文件定义(该文件一般置于代码仓库的根目录)

  • Gitlab Runner 执行构建任务的应用程序,可独立部署,如上图所示其通过api与Gitlab Server交互

搭建Gitlab CI/CD环境

Gitlab CI/CD提供配置界面(项目菜单栏-设置-CI/CD),可指定

将要使用何种形式的Runner

配置Runner要用到环境变量

界面配置权限取决于你在Gitlab Server的角色 + https://docs.gitlab.com/ee/user/permissions.html

本次手动设置特定Gitlab Runner

Runner安装完毕,注册Runner(与Gitlab Projects实例建立绑定关系)

注册时要关注的两个配置:

  • Tags    与此Runner相关的任务标签, 用于在共享Runner中区分不同的Project,.gitlab-ci.yml会用到

  • Runner Executor    执行构建任务的方式,这里使用shell方式

Shell是最简单的配置执行器,需要将构建所需的所有依赖项手动安装在安装了Runner的同一台计算机上。

注册过程和结果请参考下图:

Gitlab CI/CD实践

宏观业务架构图

原则上不允许自动部署Prod,本次使用Gitlab Runner服务器作为Gitlab CD的部署机器。

Gitlab-CI Pipeline构建ReceiverAPP、webAPP镜像(附带本次git:tag)并推送到hub.docker.com;

Gitlab-CD docker-compose拉取远端nginx、ReceiveAPP、webapp镜像,启动容器。

  • Pipeline对每一次提交或合并都会执行build任务,形成Continous Intergation

  • Pipeline对git: tag会触发build_Image任务,成功之后构建deploy:staging任务,这样就能形成基于git:tag的部署版本管理(部署出错,也能很快回滚到上次的部署tag)

.gitlab-ci.yml文件

以上Gitlab Pipeline定义build->build_image->deploy3个任务,某些任务还包括不同分支Job,写.gitlab-ci.yml 的过程就是将以上执行动作脚本化。

stages:- build- build_image- deployvariables:
# CI_DEBUG_TRACE: "true"                                         deploy_path: "/home/xxxx/eqidmanager"     # CI变量,用于配置部署目录before_script:- "docker info"build:stage: buildscript: - "for d in $(ls src);do echo $d;prog=$(pwd)/src/$d/$d.csproj; dotnet build $prog; done"tags:                                                 - another-tagbuild_image:EqidManager:stage: build_imagescript:- dotnet publish src/EqidManager/EqidManager.csproj  -c release -o ../../container/app/publish/    - docker build --pull  -t $CI_REGISTRY_USER/eqidmanager:$CI_COMMIT_REF_NAME  container/app- docker login -u $CI_REGISTRY_USER  -p $CI_REGISTRY_PASSWORD      - docker push $CI_REGISTRY_USER/eqidmanager:$CI_COMMIT_REF_NAME     tags:    - another-tagonly:                #Pipeline Job构建策略,代码仓库打tag会执行该任务, 支持正则- tagsbuild_image:EqidReceiver:stage: build_imagescript:- dotnet publish src/EqidReceiver/EqidReceiver.csproj  -c release -o ../../container/receiver/publish- docker build -t $CI_REGISTRY_USER/eqidreceiver:$CI_COMMIT_REF_NAME container/receiver- docker login -u $CI_REGISTRY_USER  -p $CI_REGISTRY_PASSWORD- docker push $CI_REGISTRY_USER/eqidreceiver:$CI_COMMIT_REF_NAMEtags: - my-tagonly:- tagsdeploy:staging:stage: deployscript:- cd $deploy_path- export TAG=$CI_COMMIT_REF_NAME        # 引入本次CI的git:tag名称,覆盖.env文件默认配置- "docker-compose -f docker-compose.yml -f docker-compose.prod.yml build"                        - "docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d" tags: - my-tagdeploy:prod:stage: deployscript:- # TODO 需要写脚本登陆到Prod机器上- export TAG=$CI_COMMIT_REF_NAME        - cd $deploy_path- "docker-compose -f docker-compose.yml -f docker-compose.prod.yml build"- "docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d" tags:- my-tagwhen: manual

这里有些知识点、坑位需要指出:

第8行:预先定义的环境变量,该变量定义gitlab CD的部署目录

第16行: 对src开发目录下两个程序执行dotnet build命令

第17行:tags定义具备该tags的Runner可以执行该任务,注意这里的tags必须是字符串数组

第23-26行:构建镜像并推送到镜像仓库的过程,用到两类CI变量

 - 密钥变量CI_REGISTRY_USERCI_REGISTRY_PASSWORD,可在Gitlab-CI界面配置

- 预定义变量CI_COMMIT_REF_NAME,该变量标记构建项目的git:branch或git:tag名称,用于生成Image:Tag

注意变量可被重写,重写优先级:http://www.ttlsa.com/auto/gitlab-cicd-variables-zh-document/

第29行:only定义此Job只在产生git:tag时被触发,与上面我们使用CI-COMMIT_REF_NAME 变量相呼应

第47行:Gialab-CI pipeline每个Job会重新拉取git源码执行Job任务(可登录到Gitlab Runner工作目录下观察Runner执行过程),CD时需要选择合适目录,这是deploy_staging上使用deploy_path CI变量的原因

第48行:注入本次Gitlab-CI git:tag名称,实际上是覆盖了.env同名环境变量

第49行:若存在docker-compose.yml、docker-compose.override.yml 两个文件,docker-compose命令会自动merge这2个文件(使用docker-compose config命令查看merge之后的结果)。

第64行:前置任务未出错,会自动执行后继任务;而when指令定义该任务需要界面上手动执行

部署目录

在Gitlab Runner服务器的{deploy_path}路径下建立了如下部署文件:

├── appsettings.secrets.json
├── docker-compose.prod.yml
├── docker-compose.yml
├── .env
├── EqidManager.db
├── nginx
│   ├── Dockerfile
│   └── nginx.conf
└── receiver.secrets.json
  • 部署目录定义docker-compose.yml、docker-compose.prod.yml 两个yml文件,前者定义常规容器服务,后者定义适用于本部署环境的附加服务

  • 密钥文件不要进入代码管理,因此我们定义appsetting.secrets.json 和 receiver.secrets.json密钥文件,由dccker-compose.yml挂载进入容器

  • env文件存储相对固定且与本次docker-compose命令相关的环境变量,docker-compose命令默认寻找同级目录下.env文件

------.env 文件----
TAG=master    # 该TAG变量会在Pipeline:deploy_staging任务中被覆盖,形成基于git:tag的imageName:tag
docker_host=172.16.1.1
COMPOSE_PROJECT_NAME=EqidManager
DOCKER_REGISTRY=***

Project打上git:tag之后,触发Gitlab Runner CI/CD Pipeline:

跳转到部署目录->应用本次git:tag->执行docker-compose命令拉取指定tag镜像并启动容器。

That'all, 本次应用Gitlab Runner(shell执行器)实践CI/CD, Gitlab菜单界面有所有构建构成的日志(便于排查构建问题);另外上文对于关键知识均附带传送门,可进一步对比研究。

+ https://www.cnblogs.com/JulianHuang/p/10919346.html

+ https://docs.gitlab.com/runner/register/index.html

+ https://docs.gitlab.com/runner/executors/README.html

往期精选

实例解读Docker Swarm

docker stack,docker-compose前世今生

据说点赞的朋友2020都加薪了

基于docker-compose的Gitlab CI/CD实践排坑指南相关推荐

  1. git原理详解与实操指南_基于dockercompose的Gitlab CI/CD实践amp;排坑指南

    长话短说 经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解. 看过博客园<docker ...

  2. GitLab CI/CD实践

    使用gitlab实现CI/CD流程分为两步: 确保你有一个runner去运行你的job 在仓库根目录,创建 .gitlab-ci.yml文件去定义运行的流程 gitlab-runner的安装与使用 进 ...

  3. winform 项目 发布后比本地运行慢_前端团队基于 GitLab CI/CD 的自动化构建、发布实践,快来学习吧...

    在公司搭建内部 GitLab 平台后,前端活动项目从 SVN 迁移到 GitLab.本文介绍如何基于 GitLab CI/CD 实现自动化构建及发布. 在从 SVN 迁移到 GitLab 和接入 Gi ...

  4. GitLab CI/CD 自动化构建与发布实践

    流程介绍 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法.CI/CD 的核心概念是持续集成.持续交付和持续部署.这篇文章中,我将会介绍基于 GitLab CI/CD 的自动化 ...

  5. 基于.NetCore结合docker-compose实践Gitlab-CI/CD 排坑指南

    引言 看过docker-compose真香的园友可能留意到当时是[把部署dll文件拷贝到生产机器],即时打包成镜像并启动容器,并没有完成CI/CD. 经过长时间实操验证,终于完成基于Gitlab的CI ...

  6. iHealth基于Docker的DevOps CI/CD实践

    本文由1月31日晚iHealth运维技术负责人郭拓在Rancher官方技术交流群内所做分享的内容整理而成,分享了iHealth从最初的服务器端直接部署,到现在实现全自动CI/CD的实践经验. 作者简介 ...

  7. 基于 GitLab CI 的前端工程CI/CD实践

    CI/CD 是 Gitlab 提供的一整套持续集成.持续交付解决方案. 概念:「持续集成(Continuous Integration)」.「持续交付(Continuous Delivery)」和「持 ...

  8. 超长干货:基于Docker的DevOps CI/CD实践——来自iHealth的分享

    前言 相信我,一切事情的发生都是赶鸭子上架,没有例外.人类所有伟大的变革都是迫不得已,可又是那么顺其自然.比如容器(docker)技术的诞生,比如箭在弦上的创业,比如野心勃勃的kubernetes,比 ...

  9. 基于OpenStack+Docker设计与实现CI/CD

    本文所述内容的背景是,基于Docker容器技术的OpenStack研发.测试.运维及其相关的CI/CD.DevOps等活动.思想是相通的,读者可以取其可用部分用于自己的业务需求中. IaaS云和容器云 ...

最新文章

  1. HBase 在京东人资数据预处理平台中的实践!
  2. Anaconda入门使用指南(一)
  3. Git分支合并:Merge、Rebase的选择
  4. Android开发之”再按一次退出程序“的实现
  5. linux编译llvm代码
  6. 开始入坑深度学习(DeepLearning)
  7. 博客目录(python相关)
  8. Zabbix配置模板监控指定服务器主机
  9. java调试报告_java实验一报告
  10. 使用阿里云集成包快速搭建LAMP+FTP教程
  11. 最新黑马java十次方社交项目教程
  12. iOS视频播放器MPMoviePlayerController
  13. MPB:中科院微生物所蔡磊组-​基于扩增子数据的系统发育树的构建和展示
  14. 财富管理技术服务商NewBanker完成千万级美元 Pre-C 轮融资
  15. java怎么求平方怎么求指数?
  16. 关于键盘方向键的ASCII的问题解释
  17. 《JavaEE初阶》HTTP协议和HTTPS
  18. 脑机接口数据分析工具EEGLAB04---绘制通道光谱图
  19. python 圆形的词云
  20. 操作系统 之 进程 学习总结

热门文章

  1. 下拉框控件、列表控件、ComboBox
  2. 60个高质量的CSS、XHTML网页布局模板下载
  3. python3 tkinter电子书_Python3 Tkinter-Text
  4. latex插入gif_如何将照片和GIF插入Google幻灯片
  5. 找到特定ip地址 修改ip_您如何找到网站的IP地址?
  6. android 更改软键盘_如何在Android的Google键盘上更改声音和振动
  7. java测试开发_测试开发系类之Java常用知识点
  8. Optaplanner终于支持多线程并行运行 - Multithreaded incremental solving
  9. JavaScript 开发的45个经典技巧
  10. 反射调用 java bean的set和get方法