从多个同时执行的任务中看守吉他工作
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 apply
或ansible
等来自同一管道上运行的不同管道
时间)
gitlab作业保护
使用gitlab api确定现有管道是否
已计划并退出并重试,直到即使作业是
分布在多个跑步者之间。冲突由用户定义的
匹配管道引用名称(分支、标记等)和/或管道状态。
用法
最简单的用例可能是在
在
gitlab ci.yml的
脚本之前
部分保护所有作业(尽管这样
可能会减慢速度,对本地Gitlab操作不友好。
$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
) 因此,不共享状态的管道的其他部分被允许 自由奔跑。