如何在Gitlab流水线中对部署进行控制?
让我们看一下如何使用受保护的环境来设置生产部署和流水线的访问控制。这个功能目前在Gitlab Silver / Premium版本可用。
在我们的自动化世界中,为什么要手动做一些事情?手动几乎已成为低效率的代名词。但是,对于CI/CD管道,正确的配置手动作业可能是控制部署并满足合规性要求的好方法。让我们看一下如何定义手动作业以服务于两个重要的场景:控制谁可以去部署,设置手动批准作业。
部署环境保护
部署到生产环境是一项非常关键的任务,我们应该加以保护。具有Kubernetes集群的项目可以从迁移到持续部署(CD)模型中受益,在该模型中,分支或合并请求一旦合并,就会自动部署到生产中,并且无需人工干预。但是,对于尚未配置CD的项目,让我们考虑以下场景:想象一个带有手动作业的管道,该手动作业可以控制产品部署,任何有权访问提交代码的用户都可以触发该管道,可以想象生产部署的意外风险是非常大的。
幸运的是,可以使用受保护的环境来防止任何人都能部署到生产环境。在配置受保护的环境时,您可以定义授予部署访问权限的角色,组或用户。然后,可以在手动作业中定义受保护的环境以进行部署,从而限制可以运行它的人员。配置如下所示:
deploy_prod:
stage: deploy
script:
- echo "Deploy to production server"
environment:
name: production
url: https://example.com
when: manual
only:
- master
在上面的示例中,关键字environment
用于引用受保护的环境(在项目设置中配置),该环境包含可以运行作业的用户列表,在这种情况下,该用户可以将产品部署到指定的环境。没有访问权限的用户将看到禁用的按钮,并且无法执行作业。
添加批准步骤
可能会指定工作流中的某些活动需要批准后才能运行,即使从技术上讲它们本身并不是部署步骤。在此场景中,还可以在流水线中添加批准步骤,以提示授权用户采取措施以继续。这可以通过approve
阶段来实现,例如,在部署之前插入批准阶段,如下所示:
stages:
- build
- approve
- deploy
build:
stage: build
script:
- echo Hello!
approve:
stage: approve
script:
- echo Hello!
environment:
name: production
url: https://example.com
when: manual
allow_failure: false
only:
- master
deploy:
stage: deploy
script:
- echo Hello!
environment:
name: production
url: https://example.com
only:
- master
在上面的YAML中,allow_failure: false
(将手动作业定义为阻断),这将导致Pipeline暂停,直到授权用户通过单击开始按钮以继续进行批准为止。只有该环境列表的用户部分才能执行此操作。在这种情况下,以上示例CI配置中管道的UI视图将如下所示:
如上面的YAML示例和上图所示,使用受保护的环境和阻止属性定义的手动作业是处理合规性需求以及确保对生产部署进行适当控制的有效工具。
扩展内容
什么是GitOps?
从概念上讲,GitOps与用代码描述基础设施或持续交付没有什么不同。实际上,在许多方面,是这两个概念的融合。开发人员和运营团队都可以共享一个通用的代码存储库,而GitOps则可以为开发人员提供类似的管理应用程序及其底层基础架构的体验。这样,您可以将GitOps用作现代基础架构(如Kubernetes,Serverless和其他云原生技术)的操作模型。
版本控制和持续集成是持续可靠地部署软件的基本工具。GitOps通过使存储库成为运行应用程序所需的所有基础架构的真实来源,将这两种软件最佳实践投入运营。使用GitOps,对基础架构的任何更改都会与应用程序的更改一起提交到git存储库。
这使开发人员和运维人员可以使用熟悉的开发模式和分支策略。合并请求提供了协作和建议更改的场所。合并到主干后,应配置CI/CD以自动部署应用程序和基础架构更改。这是开发人员和运维人员之间实现同步的方式,对于作为DevOps的下一个迭代的GitOps来说,可能会非常吸引人。
为什么选择GitOps?
为什么这么多大小的组织都在考虑转向更注重GitOps的文化?
随着软件吞噬了世界,卓越的业务运营已与快速交付高质量软件的能力直接挂钩。业务生存取决于适应性和高效的软件开发实践。这些实践需要新的流程和变更管理方式。随着GitOps将这一概念进一步发展,并将管道直接集成到git和合并请求工作流程中,将其集成到生产中,这已成为一个热门话题,并将成为高效软件组织的常规工作流程。
- c++ list, vector, map, set 区别与用法比较
- 前台开发从头说起:谈谈CSS选择符
- dedecms无法登录提示本页面禁止返回
- 前台开发从头说起:理解css盒模型
- 两个js冲突怎么解决?试试这四个方法
- dedecms如何去除后台登陆验证码
- DEDECMS自定义表单unix时间戳转换成常规时间方法及增加表单添加时间方法
- dedecms自定义表单发布成功后返回当前页面
- 前端构建工具 Gulp.js 上手实例
- dedecms数据库内容替换安全确认码不显示怎么解决
- 利用宏避免发送确认邮件时忘记添加附件
- dateDiff在Objective-C中的实现
- 禁用Firefox自带的元素查看工具
- 容易被误解的overflow:hidden
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- thinkphp3.2框架中where条件查询用法总结
- Android10自动连接WiFi问题的解决
- Android写一个实时输入框功能
- android自定义view用path画长方形
- 机器学习:如何快速从Python栈过渡到Scala栈
- Android studio实现加法软件
- 解决php extension 加载顺序问题
- Android 获取drawable目录图片 并存入指定文件的步骤详解
- php基于 swoole 实现的异步处理任务功能示例
- PHP中Session ID的实现原理实例分析
- php5.6.x到php7.0.x特性小结
- android自定义加减按钮
- php链式操作的实现方式分析
- php中的依赖注入实例详解
- Android通知栏前台服务的实现