在 CI 中評估策略合規性

在您的持續整合 (CI) 管線中加入政策評估,有助於偵測並防止因程式碼變更而導致政策合規性較基準線惡化的情況。

在 CI 環境中進行政策評估的建議策略,是評估本地映像檔並將結果與基準線進行比較。如果本地映像檔的政策合規性比指定的基準線更差,則 CI 執行會失敗並顯示錯誤。如果合規性更好或保持不變,則 CI 執行會成功。

這種比較是相對的,意即它只關心您的 CI 映像檔是否優於或劣於基準線。這並非檢查所有政策是否通過或失敗的絕對標準。透過對照您定義的基準線進行衡量,您可以快速看出變更對政策合規性是否產生正面或負面的影響。

運作方式

當您在 CI 中執行政策評估時,您會針對 CI 管線中建置的映像檔執行本地政策評估。若要執行本地評估,您所評估的映像檔必須存在於 CI 工作流程執行所在的映像檔儲存庫中。請建置或拉取映像檔,然後執行評估。

若要執行政策評估並在本地映像檔的合規性比比較基準線更差時觸發失敗,您需要指定要作為基準線的映像檔版本。您可以硬編碼特定的映像檔參考,但更好的解決方案是使用環境 (environments),從環境中自動推斷映像檔版本。以下範例使用環境將 CI 映像檔與 production 環境中的映像檔進行比較。

範例

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

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

  • 一次用於驗證您的容器登錄庫。
  • 再一次用於驗證 Docker,以拉取您 production 映像檔的分析結果。

如果您使用 Docker Hub 作為容器登錄庫,您只需要驗證一次。

注意

由於 Docker Engine 的限制,不支援將多平台映像檔或帶有證明的映像檔載入到映像檔儲存庫。

為了使政策評估能夠運作,您必須將映像檔載入到執行器的本地映像檔儲存庫中。確保您建置的是沒有證明的單一平台映像檔,並且正在載入建置結果。否則,政策評估將會失敗。

此外,請注意該作業所需的 pull-requests: write 權限。Docker Scout GitHub Action 預設會新增包含評估結果的提取請求 (Pull Request) 留言,這需要此權限。有關詳細資訊,請參閱 Pull Request Comments

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

下方的截圖展示了當政策評估檢查因為 PR 映像檔中的政策比基準線更差而失敗時,GitHub PR 留言的樣子。

Policy evaluation comment in GitHub PR

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

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.