返回文章列表
2025-07-17

教程:极狐GitLab流水线执行策略的高级实例

极狐GitLab

了解新的极狐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命令解析阶段和任务名称并存入变量比对。脚本最后部分检查流水线阶段和任务是否在批准列表中。

 

策略实现:注入YAML配置

通过极狐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中添加非法阶段将触发如下输出:

Output of attempting an invalid stage to project gitlab-ci.yml file

 

扩展应用场景

此功能虽聚焦安全与合规,但可扩展至:

使群组变量对组内所有项目可访问

创建黄金流水线供开发者扩展
极狐GitLab客户正持续探索此功能的新应用场景。

 

立即尝试
极狐GitLab旗舰版客户可立即试用此功能。非旗舰版客户?申请60天免费试用开启体验。

极狐GitLab 一体化DevOps平台 专为中国用户研发,免费试用60天专业版高级功能
推荐阅读
售前咨询
联系电话
在线支持
预约演示