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

引言

         看过docker-compose真香的园友可能留意到当时是【把部署dll文件拷贝到生产机器】,即时打包成镜像并启动容器,并没有完成CI/CD。

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

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

        第二部分:Gitlab CI/CD 实践:

  •      宏观项目架构图

  •     .gitlab-ci.yml 文件

  •      项目部署目录

第一部分:gitlab CICD原理

       ① Gitlab CI/CD架构:

640?wx_fmt=png

  • Gitlab CI/CD   存储【构建】和【构建状态】的api应用程序, 提供友好的管理界面,  构建过程由 .gitlab-ci.yml文件定义,而这个文件一般置于代码仓库的根目录。

  • Gitlab Runner 执行构建过程的应用程序,可与Gitlab Server 形成分布式部署, 如上图所示, 其通过api 与Gitlab Server交互

   

  ② Gitlab CI/CD 配置界面 & Gitlab Runner 安装

           Gitlab CICD的界面配置权限取决于你在Gitlab Server 中的角色,我的角色是maintainer, 足够创建自定义的runner。

           本次演示【自定义Runner】,gitlab runner安装------> gitlab runner注册 (与Gitlab Project建立联系的过程)

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

  •     tags  可理解为与这个Runner有关的Pipeline任务, 在.gitlab-ci.yml用到

  •     runner  executor:可理解为执行的初始环境,这里使用shell方式

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

640?wx_fmt=png

 

第二部分:基于docker-compose的Gitlab-CI  实践

     ①  项目架构图

      640?wx_fmt=png

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

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

640?wx_fmt=png

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

  •      Pipeline对git: tag会执行build_Image任务,自动构建至deploy_staging任务,这样就能形成基于git:tag的部署版本管理(部署出错,也能很快回滚到上次的部署tag)

本处使用Gitlab Runner 服务器作为staging部署机器;原则上不允许自动随意部署Prod(实践中登陆到 Prod机器上执行部署命令,以下GitLab-CD也没有完成Prod的自动部署过程,自行补上登陆终端的脚本即可)   

  ③ .gitlab-ci.yml 文件

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

  更多Gitlab-CI的资料

 1 stages:
2 - build
3 - build_image
4 - deploy
5
6 variables:
7 #CI_DEBUG_TRACE: "true" # 增加调试追踪
8 deploy_path: "/home/xxxx/eqidmanager"
9
10 before_script:
11 - "docker info"
12
13 build:
14 stage: build
15 script:
16 - "for d in $(ls src);do echo $d;prog=$(pwd)/src/$d/$d.csproj; dotnet build $prog; done"

17 tags:

18 - another-tag

19
20build_image:EqidManager:
21stage: build_image
22script:
23 - dotnet publish src/EqidManager/EqidManager.csproj -c release -o ../../container/app/publish/
24 - docker build --pull -t $CI_REGISTRY_USER/eqidmanager:$CI_COMMIT_REF_NAME container/app
25 - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
26 - docker push $CI_REGISTRY_USER/eqidmanager:$CI_COMMIT_REF_NAME
27tags:
28 - another-tag
29 only:                             # Pipeline Job构建策略
30 -tags
31
32build_image:EqidReceiver:
33stage: build_image
34script:
35 - dotnet publish src/EqidReceiver/EqidReceiver.csproj -c release -o ../../container/receiver/publish
36 - docker build -t $CI_REGISTRY_USER/eqidreceiver:$CI_COMMIT_REF_NAME container/receiver
37 - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
38 - docker push $CI_REGISTRY_USER/eqidreceiver:$CI_COMMIT_REF_NAME
39tags:
40 - my-tag
41only:
42 -tags
43
44deploy:staging:
45stage: deploy
46script:
47 -cd $deploy_path
48 - export TAG=$CI_COMMIT_REF_NAME          # 引入本次CI的git:tag名称,覆盖.env 文件默认配置
49 - "docker-compose build"         # 根据docker-compose命令用法, 会自动merge docker-compose.yml和override文件
50 - "docker-compose up -d"
51tags:
52 - my-tag
53
54deploy:prod:
55stage: deploy
56script:
57 -# TODO 需要写脚本登陆到Prod机器上
58 - export TAG=$CI_COMMIT_REF_NAME
59 -cd $deploy_path
60 - "docker-compose build"
61 - "docker-compose up -d"
62tags:
63 - my-tag
64 when: manual

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

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

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

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

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

   - 密钥变量CI_REGISTRY_USER、CI_REGISTRY_PASSWORD ,可在GitLab-CI 界面配置

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

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

第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 之后的结果)。

  ③ Continous Deploy

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

├── appsettings.secrets.json
├── docker-compose.override.yml
├── docker-compose.yml
├── .env
├── EqidManager.db
├── nginx
│   ├── Dockerfile
│   └── nginx.conf
└── receiver.secrets.json
  • 最佳实践:定义docker-compose.yml、docker-compose.override.yml 两个yml文件,前者定义相对易变的容器服务,后者定义基础容器服务,docker-compose 命令在执行时会自动merge

  • 软件工作有种最佳实践, 密钥文件不要进入代码管理,因此我们定义appsetting.secrets.json 和 receiver.secrets.json密钥文件,又dccker-compose.yml挂载进入容器

  • .env文件存储相对固定、与本次docker-compose命令相关的环境变量,dockee-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=***

  依据.gitlab-ci.yml 文件定义的 deploy_staging脚本:

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

原文链接:https://www.cnblogs.com/JulianHuang/p/11346615.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51 NOD 1227 平均最小公倍数(杜教筛)

1227 平均最小公倍数 推式子 S(n)∑i1n∑j1ilcm(i,j)i∑i1n∑j1iijigcd(i,j)∑i1n∑j1ijgcd(i,j)∑i1n∑d1i∑j1ijd(gcd(i,j)d)∑i1n∑d1i∑j1idj(gcd(j,id)1)∑i1n∑d1iidϕ(id)(id1)2∑d1n∑i1ndiϕ(i)(i1)2接下来就是杜教筛求∑i1niϕ(i)了,g(1)S(n)∑i1n(f∗g)…

【BZOJ3512】DZY Loves Math IV(杜教筛)

【BZOJ3512】DZY Loves Math IV(杜教筛) https://www.cnblogs.com/cjyyb/p/10165338.html

.NET Core很酷,你不得不知

我一直回想我的第一篇博文,那是关于多个服务的服务器平台的详细教程,它使用 GitLab CI 在 AWS 上,当时使用单个命令行进行部署, 至今回想,令人感觉很酷。前几天,我偶然听说一些软件公司的 HR 在招聘原则上拒…

51 NOD 1363 最小公倍数之和 (欧拉函数思维应用)

1363 最小公倍数之和 推式子 ∑i1nlcm(i,n)n∑i1nigcd(i,n)n∑d∣n∑i1nid(gcd(i,n)d)n∑d∣n∑i1ndi(gcd(i,nd)1)n∑d∣ndϕ(d)(d1)2\sum_{i 1} ^{n} lcm(i, n)\\ n\sum_{i 1} ^{n} \frac{i}{gcd(i, n)}\\ n \sum_{d \mid n} \sum_{i 1} ^{n} \frac{i}{d}(gcd(i, n) d)…

【BZOJ3930】选数(莫比乌斯反演倍数形式,杜教筛)

【BZOJ3930】选数 https://www.cnblogs.com/cjyyb/p/8303813.html

程序员修神之路--高并发系统设计负载均衡架构

点击上方“蓝字”关注,酷爽一夏菜菜哥,上次你给我讲的分库分表策略对我帮助很大有帮助就好,上次请我的咖啡也很好喝~呵呵,不过随着访问量的不断加大,网站我又加了nginx做负载均衡好呀,看来要进阶高级工程师…

类欧几里得算法详细推导过程(附带模板)

类欧几里得算法推导 初识 给出三种形式: f(a,b,c,n)∑i0n⌊aibc⌋f(a, b, c, n) \sum_{i 0} ^{n} \lfloor\frac{ai b}{c}\rfloorf(a,b,c,n)∑i0n​⌊caib​⌋g(a,b,c,n)∑i0ni⌊aibc⌋g(a, b, c, n) \sum_{i 0} ^{n}i \lfloor \frac{ai b}{c}\rfloorg(a,b,c…

【Luogu3768】简单的数学题(莫比乌斯反演/杜教筛/欧拉函数)

【Luogu3768】简单的数学题 https://www.cnblogs.com/cjyyb/p/8298339.html

【学习笔记】Docker - 01. Docker是啥

我只是把之前的学习笔记整理一下,贴到这里,可能会显得比较凌乱。。。1.1 啥是Docker?Docker 是一个开源项目,它被用来做构建、打包和运行程序。它是一个命令行程序,一个后台进程,也是一组使用逻辑方法来解决常见软件问…

使用 .NET CORE 创建 项目模板,模板项目,Template

场景:日常工作中,你可能会碰到需要新建一个全新的解决方案的情况(如公司新起了一个新项目,需要有全新配套的后台程序),如果公司内部基础框架较多、解决方案需要DDD模式等,那么从新起项目到各种依…

【BZOJ4916】神犇和蒟蒻(杜教筛)

【BZOJ4916】神犇和蒟蒻(杜教筛) https://www.cnblogs.com/cjyyb/p/8297338.html 杜教筛技巧

E. Number Challenge

E. Number Challenge 推式子 ∑i1a∑j1b∑k1cσ(ijk)∑i1a∑j1b∑k1c∑x∣i∑y∣j∑z∣k(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑x1a∑y1b∑z1c⌊ax⌋⌊by⌋⌊cz⌋(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑d1aμ(d)∑x1⌊ad⌋⌊adx⌋∑y1⌊bd⌋⌊bdy⌋∑z1c⌊cd⌋(gcd(x,z)1)(gcd(y,z…

时间表(日记)

2021/1/14 今天白天学习还算成功,但是晚饭后拿起手机就开始颓废了,特别是因为听相声实在是无聊而且低俗,所以又忍不住诱惑下载了b站,相比于相声b站的确是有营养的多,但是一旦激起了我的好奇心,尤其是吸引了…

谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

一、前言surging是基于.NET CORE 服务引擎。初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务架构的技术栈,覆盖了从服务注册、服务发现、中…

2019-ACM-ICPC-南京区网络赛-E. K Sum(莫比乌斯反演 + 杜教筛)

K Sum 推式子 Fn(k)∑l11n∑l21n⋯∑lk1n(gcd(l1,l2,…,lk))2∑d1nd2∑l11nd∑l21nd⋯∑lk1nd(gcd(l1,l2,…,lk)1)∑d1nd2∑l11nd∑l21nd⋯∑lk1nd∑t∣gcd(l1,l2,…,lk)μ(t)∑d1nd2∑t1ndμ(t)(ntd)2另Ttd∑T1n(nT)k∑d∣Td2μ(Td)∑i2nFn(i)∑T1n∑i2k(nT)i∑d∣Td2μ(Td)到…

【BZOJ4028】[HEOI2015]公约数数列(分块/数量级很小法)

【BZOJ4028】[HEOI2015]公约数数列 https://www.luogu.com.cn/problem/P4108 求解最靠前的一个位置前缀gcd和前缀异或的乘积恰好等于x,并且要求支持单点修改 首先我们可以发现这个问题没法使用线段树维护,因为不仅前缀没有单调性,而且修改也…

GuGuFishtion(2018 Multi-University Training Contest 7)

GuGuFishtion 推式子 ∑a1m∑b1nϕ(a,b)ϕ(a)ϕ(b)∑a1m∑b1ngcd(a,b)ϕ(gcd(a,b))∑d1mdϕ(d)∑a1md∑b1mdgcd(a,b)1∑d1mdϕ(d)∑a1md∑b1md∑k∣gcd(a,b)μ(k)我们约定n,m&#xff0c;满足n<m∑d1ndϕ(d)∑k1ndμ(k)⌊nkd⌋⌊mkd⌋\sum_{a 1 } ^{m} \sum_{b 1 } ^{n} …

奇淫巧技-Flutter调用C#

前言众所周知&#xff0c;Xamarin应该是.net下的跨平台开发工具。2016年之前还处于收费状态&#xff0c;后被微软收购后开源。但似乎有个现象&#xff0c;开源后的Xamarin发展似乎有些停滞&#xff0c;而且维护Xamarin的团队又很固执不愿变通。社区多次建议UI层应该统一绘图引擎…

【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

【UOJ#33】【UR #2】树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演&#xff0c;那么利用倍数形式&#xff0c;我们只需要求解是i的倍数的对数。 考虑枚举lca&#xff0c;这个问题就和深度有关&#xff0c;那么可以长链剖分&…

.NET World——gPRC概览

官方的定义&#xff1a;gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authen…