了解新的极狐GitLab旗舰版功能如何强制执行标准化流水线以提升合规性。
流水线执行策略是极狐GitLab DevSecOps平台的新功能,作为强大机制可在适用项目中强制执行CI/CD任务。该策略使平台工程或安全团队能够将任务注入开发者的YAML流水线定义文件中,确保无论开发者在.gitlab-ci.yml
文件中如何定义,特定CI/CD任务都会执行。
本文将阐述如何利用流水线执行策略为开发者在流水线定义中可使用的阶段或任务创建防护机制。在受监管环境中,这能确保开发者在极狐GitLab流水线中遵循标准任务或阶段集。若开发者添加不符合企业标准的任务或阶段,将导致流水线失败。
假设某组织已投资第三方安全扫描工具,并要求在代码合并到主分支前必须执行外部扫描。若无流水线执行策略,开发者只需不在.gitlab-ci.yml文件中添加相关代码即可跳过此步骤。而通过流水线执行策略,安全团队能确保无论开发者如何定义流水线,外部安全扫描任务都会强制执行。
通过流水线执行策略实施限制需两个部分:调用极狐GitLab API的Shell脚本和策略本身。本教程使用bash脚本,若您的运行器使用其他脚本语言可自行适配。
#!/bin/bash
echo "Checking pipeline stages and jobs..."
# Pull the group access token from the environment variable
GROUP_ACCESS_TOKEN="$PIPELINE_TOKEN"
echo "PROJECT_ID: $PROJECT_ID"
echo "PIPELINE_ID: $PIPELINE_ID"
if [ -z "$GROUP_ACCESS_TOKEN" ]; then
echo "GROUP_ACCESS_TOKEN (MR_GENERATOR) is not set"
exit 1
fi
if [ -z "$PROJECT_ID" ]; then
echo "PROJECT_ID is not set"
exit 1
fi
if [ -z "$PIPELINE_ID" ]; then
echo "PIPELINE_ID is not set"
exit 1
fi
# Use the group access token for the API request
api_url="$GITLAB_API_URL/projects/$PROJECT_ID/pipelines/$PIPELINE_ID/jobs"
echo "API URL: $api_url"
# Fetch pipeline jobs using the group access token
jobs=$(curl --silent --header "PRIVATE-TOKEN: $GROUP_ACCESS_TOKEN" "$api_url")
echo "Fetched Jobs: $jobs"
if [[ "$jobs" == *"404 Project Not Found"* ]]; then
echo "Failed to authenticate with GitLab API: Project not found"
exit 1
fi
# Extract stages and jobs
pipeline_stages=$(echo "$jobs" | grep -o '"stage":"[^"]*"' | cut -d '"' -f 4 | sort | uniq | tr '\n' ',')
pipeline_jobs=$(echo "$jobs" | grep -o '"name":"[^"]*"' | cut -d '"' -f 4 | sort | uniq | tr '\n' ',')
echo "Pipeline Stages: $pipeline_stages"
echo "Pipeline Jobs: $pipeline_jobs"
# Check if pipeline stages are approved
for stage in $(echo $pipeline_stages | tr ',' ' '); do
echo "Checking stage: $stage"
if ! [[ ",$APPROVED_STAGES," =~ ",$stage," ]]; then
echo "Stage $stage is not approved."
exit 1
fi
done
# Check if pipeline jobs are approved
for job in $(echo $pipeline_jobs | tr ',' ' '); do
echo "Checking job: $job"
if ! [[ ",$APPROVED_JOBS," =~ ",$job," ]]; then
echo "Job $job is not approve
脚本前几行执行基础检查,确保流水线ID、项目ID和群组访问令牌存在:
流水线ID:极狐GitLab为每次流水线运行分配的唯一数字标识符
项目ID:极狐GitLab中每个项目的唯一数字标识符
群组访问令牌:在群组级别进行认证和授权的令牌(区别于用户专属的个人访问令牌PAT)
核心功能通过调用极狐GitLab项目API实现,脚本获取指定流水线的任务信息后,使用grep命令解析阶段和任务名称并存入变量比对。脚本最后部分检查流水线阶段和任务是否在批准列表中。
通过极狐GitLab流水线执行策略注入YAML代码。以下代码片段展示如何执行此Shell脚本:
## With this config, the goal is to create a pre-check job that evaluates the pipeline and fails the job/pipeline if any checks do not pass
variables:
GITLAB_API_URL: "https://gitlab.com/api/v4"
PROJECT_ID: $CI_PROJECT_ID
PIPELINE_ID: $CI_PIPELINE_ID
APPROVED_STAGES: ".pipeline-policy-pre,pre_check,build,test,deploy"
APPROVED_JOBS: "pre_check,build_job,test_job,deploy_job"
pre_check:
stage: .pipeline-policy-pre
script:
- curl -H "PRIVATE-TOKEN:${REPO_ACCESS_TOKEN}" --url "https://<gitlab_URL>/api/v4/projects/<project_id>/repository/files/check_settings.sh/raw" -o pre-check.sh
- ls -l
- chmod +x pre-check.sh
- DEBUG_MODE=false ./pre-check.sh # Set DEBUG_MODE to true or false
allow_failure: true
在此YAML片段中:
设置脚本用到的变量(关键定义批准阶段和批准任务)
在.pipeline-policy-pre
阶段添加新任务(该保留阶段确保在.gitlab-ci.yml定义阶段前执行)
脚本部分通过curl命令执行Shell脚本(私有仓库需认证)
末尾控制流水线失败条件(测试时可设为allow_failure: true
,生产环境应设false
强制失败)
将此YAML保存至仓库的.yml
文件,下一步将其关联至策略。
在左侧导航菜单进入 安全 > 策略
点击右上角 新建策略,选择 流水线执行策略
策略范围保持默认
操作部分选择 注入,指定YAML文件所在项目及路径
点击底部 通过合并请求更新 创建合并请求(MR)
首次创建安全策略时,合并MR将生成安全策略项目存储所有策略。生产环境中需限制此项目访问权限,防止开发者修改策略。建议将流水线执行策略的YAML代码也存储于此项目实现统一管控。
启用策略后,若在项目.gitlab-ci.yml
中添加非法阶段将触发如下输出:
此功能虽聚焦安全与合规,但可扩展至:
使群组变量对组内所有项目可访问
创建黄金流水线供开发者扩展
极狐GitLab客户正持续探索此功能的新应用场景。
微信订阅号
扫一扫关注微信订阅号,
获取最前沿的极狐GitLab资讯