从多个同时执行的任务中看守吉他工作

gitlab-job-guard的Python项目详细描述


管道状态

Gitlab工作卫士

保护gitlab ci管道作业不受多个并行执行的影响。

$ PRIVATE_TOKEN="$GITLAB_API_TOKEN" gitlab-job-guard
$ my-unguarded-deployment-task --to=production

gitlab job guard如果检测到运行的其他管道 当前避免多个管道碰撞的项目 部署/环境。当作业被分配时,这尤其是一个问题 由多个Gitlab跑步者接送。

而gitlab将自动取消同一分支的冗余、挂起的管道 默认情况下-对于different中的多个管道,情况并非如此 针对特定部署/环境的分支。Gitlab没办法 检测或控制这些用户定义的分支到环境的映射 意味着环境很容易处于不安全/损坏的状态。(例如) terraform applyansible等来自同一管道上运行的不同管道 时间)

gitlab作业保护使用gitlab api确定现有管道是否 已计划并退出并重试,直到即使作业是 分布在多个跑步者之间。冲突由用户定义的 匹配管道引用名称(分支、标记等)和/或管道状态。

用法

最简单的用例可能是在 gitlab ci.yml的脚本之前部分保护所有作业(尽管这样 可能会减慢速度,对本地Gitlab操作不友好。

< Buff行情>

$gitlab_api_token是个人访问 令牌< a > 至少有api范围。

before_script:-PRIVATE_TOKEN="$GITLAB_API_TOKEN" gitlab-job-guard

尽管通常,大多数管道只需要保护共享的关键工作 公共状态/数据(即,配置/部署作业、工件构建/发布 工作等)。

deploy-production:stage:deployscript:-PRIVATE_TOKEN="$GITLAB_API_TOKEN" gitlab-job-guard-my-unguarded-deployment-task --to=production

例如,保护一些关键的东西,比如为一个标签运行的terraform作业

provision-infrastructure:stage:provisionscript:-export PRIVATE_TOKEN="$GITLAB_API_TOKEN"-gitlab-job-guard --guard-ref-regex='^v[0-9\.]+'# Regex matches tags-terraform plan  ...-terraform apply ...only:-tags

其他用法

--guard ref regex接受正则表达式来检测其他 其引用名称(分支、标记)为(部分)匹配的管道。这就允许 在复杂的用例中保护作业。

为分支/标记名上的模式匹配上的冲突保留作业。

gitlab-job-guard -c=^master$                # Match branch names matching 'master' exactly

gitlab-job-guard -c=^(master|dev(elop)?)$   # Match any of the mainline branches

gitlab-job-guard -c=^(feature|release|hotfix)/  # Match any gitflow transient branch prefixes

gitlab-job-guard -c=^[0-9]\-# Match branch names beginning with a number# and dash ignoring all other text.# e.g. a gitlab branch made from an issue

gitlab-job-guard -c=^v?[\d.]+$              # Match (semver) tags like v1.0.9, 2.0

gitlab-job-guard -c=^environment/           # Match any environment deployments?

gitlab-job-guard -c=^environment/dc1.+      # Match environment deployments to DC1?

gitlab-job-guard -c="$CI_BUILD_REF_NAME"# Match current branch name (partially).# i.e. 'master' matches 'feature/master-document'

gitlab-job-guard -c="^$CI_BUILD_REF_NAME$"# Match current branch name (exactly).# i.e. 'master' does not match 'master-deployment'

gitlab-job-guard -c='.+' -s='running|pending'# Match any pipeline in running or pending state

在ref名称的一部分(例如,在分支前缀上)上为冲突保留作业 例如feature/hotfix/release/a lagitflow)。

# Assuming current pipeline is for the 'feature/foo' branch and that# CI_BUILD_REF_NAME=feature/foo# Extract the branch prefixCI_BUILD_REF_PREFIX=$(echo"$CI_BUILD_REF_NAME"| sed -r 's@(.+/)(.+)@\1@')# CI_BUILD_REF_PREFIX now contains 'feature/'# This will now block if there are any other pipelines running or pending# for feature/ branches.
gitlab-job-guard -c="^$CI_BUILD_REF_PREFIX" -s='running|pending'

其他参数

通常gitlab job guard读取以下环境变量 组成它的论点。注意:环境变量优先 通过cli传递的参数,因此只有用户指定的 需要设置参数/环境变量。将这些设置为受保护的环境 变量避免 泄露敏感信息,每次通话都需要复制这些信息。

envvar              |  argument             | source
-------------------   ---------------------   ----------------
GUARD_REF_REGEX     | --guard-ref-regex     | user specified
GUARD_STATUS_REGEX  | --guard-status-regex  | user specified
PRIVATE_TOKEN       | --private-token       | user specified
GUARD_TIMEOUT       | --guard-timeout       | user specified
CI_PROJECT_ID       | --ci-project-id       | runner environment
CI_BUILD_REF_NAME   | --ci-build-ref-name   | runner environment
CI_API_V4_URL       | --ci-api-v4-url       | runner environment
CI_PIPELINE_ID      | --ci-pipeline-id      | runner environment

有关完整参数集和当前/默认值,请参见gitlab job guard-h

行为

gitlab作业保护程序将退出并重试,直到安全继续或 已达到超时。退出代码0表示没有其他管道冲突 这项工作可以继续下去。达到超时时(1小时by def奥特 与gitlab作业的默认超时对齐),它将返回错误以失败 这项工作。可以通过-w/--guard timeout

设置超时(秒)

如果需要Fail Fast方法,则-x/--no wait标志将导致 gitlab job guard在发生冲突时立即退出。(不过,这意味着 管道运行必须以其他方式重新启动或放弃。

待办事项

对于长时间运行的管道,此解决方案可能会产生微妙的后果 不断增长的队列和不断增加的竞争以及不可预测性 管道是第一个通过柱子的。优先于 更新的提交(如果经常不需要)和更新的管道总是获胜 可能需要。

  • 处理现有的冲突管道-取消它们或让路。
  • 将冲突缩小到作业(ci_job_name)或阶段(ci_job_stage) 因此,不共享状态的管道的其他部分被允许 自由奔跑。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像