基于.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架构:
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方式
注册过程和结果请参考下图:
第二部分:基于docker-compose的Gitlab-CI 实践
① 项目架构图
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 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 - build3 - build_image4 - deploy5 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: build15 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:tagdocker_host=172.16.1.1COMPOSE_PROJECT_NAME=EqidManagerDOCKER_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
基于.NetCore结合docker-compose实践Gitlab-CI/CD 排坑指南相关推荐
- Gitlab CI/CD:入门指南
功能概览 CI/CD工作流 上图是基本的CI/CD工作流,与之对应的,gitlab几乎提供了上述流程节点所需的所有相关功能: 阶段 功能 1. Verify 通过持续集成自动构建和测试你的应用程序 使 ...
- winform 项目 发布后比本地运行慢_前端团队基于 GitLab CI/CD 的自动化构建、发布实践,快来学习吧...
在公司搭建内部 GitLab 平台后,前端活动项目从 SVN 迁移到 GitLab.本文介绍如何基于 GitLab CI/CD 实现自动化构建及发布. 在从 SVN 迁移到 GitLab 和接入 Gi ...
- 基于OpenStack+Docker设计与实现CI/CD
本文所述内容的背景是,基于Docker容器技术的OpenStack研发.测试.运维及其相关的CI/CD.DevOps等活动.思想是相通的,读者可以取其可用部分用于自己的业务需求中. IaaS云和容器云 ...
- 基于docker-compose的Gitlab CI/CD实践排坑指南
长话短说 经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解. 看过博客园<docker ...
- git原理详解与实操指南_基于dockercompose的Gitlab CI/CD实践amp;排坑指南
长话短说 经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解. 看过博客园<docker ...
- 晨光科力普基于GitLab CI/CD持续集成服务的应用
科力普省心购是晨光文具集团在2019年初为了拓展综合办公物资采购业务成立的B2B电商平台.随着云时代容器技术的火热发展,Docker.Kubernetes等容器化技术越来越受到研发团队的喜爱.因此,省 ...
- GitLab CI/CD 自动化构建与发布实践
流程介绍 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法.CI/CD 的核心概念是持续集成.持续交付和持续部署.这篇文章中,我将会介绍基于 GitLab CI/CD 的自动化 ...
- Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Docker + GitLab CI/CD 实现自动化部署
使用Docker+gitlab ci/cd 实现自动化部署 文章目录 使用Docker+gitlab ci/cd 实现自动化部署 1. Docker 1.1 Docker是什么? 1.2 Docker ...
最新文章
- C++:关于“error C2374: 'i' : redefinition; multiple initialization”
- Zero Quantity Maximization
- CNN几种经典模型比较
- 【Android Developers Training】 6. 配置Action Bar
- MySQL 输入任何语句都提示You must reset your password using ALTER USER 解决方法
- Xshell 使用数字小键盘进行vim 写入操作.
- 美国城市_泡泡图如何揭示美国最适合居住的城市
- JAVA→HashMap、常用方法、遍历方式、底层原理、初始化性能分析
- vue中动态添加组件
- git 查看某些文档的历史版本_10分钟了解git
- Python答题并统计的小程序
- matlab调用com组件出现错误求解决,matlab在生成COM组件编译时出现错误
- 等级保护三级基本要求
- Altium Designer 详细入门教程-原理图绘画-AD2016
- html怎么画虚线空心圆,PS怎么画虚线圆圈 一个工具轻松搞定
- Unable to prase template Class Error message: Index 0 out of bounds for length 0
- Android Fragment already added 解决方式
- php薄饼,厦门薄饼
- LCD1602液晶显示屏学习笔记
- 清华应届程序员同时被5家公司录取,晒出工资,网友:羡慕