在 CI 中評估策略合規性

將策略評估新增到您的持續整合管線,可協助您偵測並防止程式碼變更導致策略合規性比基準更差的情況。

CI 設定中策略評估的建議策略,包含評估本地映像檔,並將結果與基準進行比較。如果本地映像檔的策略合規性比指定的基準差,CI 執行將會因錯誤而失敗。如果策略合規性更好或沒有變化,CI 執行將會成功。

此比較是相對的,這表示它只關心您的 CI 映像檔是否比您的基準更好或更差。這並非通過或未通過所有策略的絕對檢查。透過相對於您定義的基準進行衡量,您可以快速查看變更對策略合規性產生正面或負面影響。

運作方式

在 CI 中執行策略評估時,您會在 CI 管線中建置的映像檔上執行本地策略評估。要執行本地評估,您評估的映像檔必須存在於執行 CI 工作流程的映像檔存放區中。建置或提取映像檔,然後執行評估。

要執行策略評估,如果本地映像檔的合規性比您的比較基準差,則觸發失敗,您需要指定要用作基準的映像檔版本。您可以硬编码特定的映像檔參考,但更好的解決方案是使用環境,從環境自動推斷映像檔版本。以下範例使用環境將 CI 映像檔與 `production` 環境中的映像檔進行比較。

範例

以下關於如何在 CI 中執行策略評估的範例,使用Docker Scout GitHub Action在 CI 中建置的映像檔上執行 `compare` 指令。`compare` 指令具有 `to-env` 輸入,它將針對名為 `production` 的環境執行比較。`exit-on` 輸入設定為 `policy`,這表示只有在策略合規性惡化時,比較才會失敗。

此範例不假設您使用 Docker Hub 作為您的容器 Registry。因此,此工作流程會使用 `docker/login-action` 兩次

  • 一次用於驗證您的容器 Registry。
  • 再一次用於向 Docker 進行驗證以提取 `production` 映像檔的分析結果。

如果您使用 Docker Hub 作為您的容器 Registry,則只需驗證一次。

注意事項

由於 Docker Engine 的限制,不支援將多平台映像檔或具有證明資訊的映像檔載入到映像檔存放區中。

為了讓策略評估能正常運作,您必須將映像檔載入執行器的本地映像檔儲存庫。請確保您正在建置單一平台的映像檔,且不包含證明,並且您正在載入建置結果。否則,策略評估將會失敗。

另請注意作業的 pull-requests: write 權限。Docker Scout GitHub Action 預設會新增一個包含評估結果的拉取請求註解,這需要此權限。詳細資訊,請參閱 拉取請求註解

name: Docker

on:
  push:
    tags: ["*"]
    branches:
      - "main"
  pull_request:
    branches: ["**"]

env:
  REGISTRY: docker.io
  IMAGE_NAME: <IMAGE_NAME>
  DOCKER_ORG: <ORG>

jobs:
  build:
    permissions:
      pull-requests: write

    runs-on: ubuntu-latest
    steps:
      - name: Log into registry ${{ env.REGISTRY }}
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_TOKEN }}
      
      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v3

      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.IMAGE_NAME }}

      - name: Build image
        id: build-and-push
        uses: docker/build-push-action@v4
        with:
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          sbom: ${{ github.event_name != 'pull_request' }}
          provenance: ${{ github.event_name != 'pull_request' }}
          push: ${{ github.event_name != 'pull_request' }}
          load: ${{ github.event_name == 'pull_request' }}

      - name: Authenticate with Docker
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PAT }}

      - name: Compare
        if: ${{ github.event_name == 'pull_request' }}
        uses: docker/scout-action@v1
        with:
          command: compare
          image: ${{ steps.meta.outputs.tags }}
          to-env: production
          platform: "linux/amd64"
          ignore-unchanged: true
          only-severities: critical,high
          organization: ${{ env.DOCKER_ORG }}
          exit-on: policy

以下螢幕截圖顯示當策略評估檢查失敗時 GitHub PR 註解的樣子,原因是 PR 映像檔中的策略與基準相比變得更差。

Policy evaluation comment in GitHub PR

此範例示範了如何在 CI 中使用 GitHub Actions 執行策略評估。Docker Scout 也支援其他 CI 平台。如需更多資訊,請參閱 Docker Scout CI 整合