すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Argo Workflows を使用した CI パイプラインの構築

最終更新日:Jun 22, 2026

Argo Workflows は、YAML でワークフローを定義するための直感的なツールを提供しており、CI パイプラインを迅速にセットアップおよび設定できます。クラスター内でジョブを並列実行し、必要に応じてコンピューティングリソースを動的にスケールすることで、CI パイプライン全体の効率を向上させることができます。

仕組み

Argo Workflows で CI パイプラインを構築する際、主に BuildKit を使用してコンテナイメージのビルドとプッシュを行い、BuildKit Cache を使用してイメージのビルドを高速化します。NAS を使用して Go mod キャッシュを保存することで、go test および go build プロセスが高速化され、CI パイプラインワークフロー全体が大幅にスピードアップします。

image

事前定義されたワークフローテンプレート

事前定義されたテンプレートを直接使用するか、カスタマイズして独自の CI ワークフローテンプレートを作成できます。この例では、BuildKit Cache と NAS を使用して Go mod キャッシュを保存し、CI パイプラインを高速化する ci-go-v1 という名前の CI ワークフローテンプレート (ClusterWorkflowTemplate) を作成する方法を示します。

CI ワークフローテンプレートのプロセス

  1. Git clone と checkout

    • Git リポジトリをクローンし、ターゲットブランチにチェックアウトします。

    • コミット ID を取得し、ビルドプロセス中にイメージタグのサフィックスとして追加します。

  2. Go test の実行

    • デフォルトでは、このステップは Git リポジトリ (Go プロジェクト) 内のすべてのテストケースを実行します。

    • enable_test ワークフローパラメーターで、このステップを実行するかどうかを制御します。

    • Go mod キャッシュは NAS 上の /pkg/mod ディレクトリに保存され、go test およびその後の go build を高速化します。

  3. イメージのビルドとプッシュ

    • BuildKit を使用してコンテナイメージをビルドおよびプッシュします。また、BuildKit Cache のレジストリタイプキャッシュを使用して、イメージのビルドを高速化します。

    • デフォルトでは、イメージタグは {container_tag}-{commit_id} 形式を使用します。ワークフローを送信する際、パラメーターを使用してコミット ID を追加するかどうかを制御できます。

    • 新しいイメージがプッシュされると、latest タグも更新され、新しいイメージを指すようになります。

CI ワークフローテンプレートの内容

apiVersion: argoproj.io/v1alpha1
kind: ClusterWorkflowTemplate
metadata:
  name: ci-go-v1
spec:
  entrypoint: main
  volumes:
  - name: run-test
    emptyDir: {}
  - name: workdir
    persistentVolumeClaim:
      claimName: pvc-nas
  - name: docker-config
    secret:
      secretName: docker-config
  arguments:
    parameters:
    - name: repo_url
      value: ""
    - name: repo_name
      value: ""
    - name: target_branch
      value: "main"
    - name: container_image
      value: ""
    - name: container_tag
      value: "v1.0.0"
    - name: dockerfile
      value: "./Dockerfile"
    - name: enable_suffix_commitid
      value: "true"
    - name: enable_test
      value: "true"
  templates:
    - name: main
      dag:
        tasks:
          - name: git-checkout-pr
            inline:
              container:
                image: mirrors-ssl.aliyuncs.com/alpine:latest
                command:
                  - sh
                  - -c
                  - |
                    set -eu
                    apk --update add git
                    cd /workdir
                    echo "Start to Clone "{{workflow.parameters.repo_url}}
                    git -C "{{workflow.parameters.repo_name}}" pull || git clone {{workflow.parameters.repo_url}} 
                    cd {{workflow.parameters.repo_name}}
                    echo "Start to Checkout target branch" {{workflow.parameters.target_branch}}
                    git checkout --track origin/{{workflow.parameters.target_branch}} || git checkout {{workflow.parameters.target_branch}}
                    git pull
                    echo "Get commit id" 
                    git rev-parse --short origin/{{workflow.parameters.target_branch}} > /workdir/{{workflow.parameters.repo_name}}-commitid.txt
                    commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)
                    echo "Commit id is got: "$commitId
                    echo "Git Clone and Checkout Complete."
                volumeMounts:
                - name: "workdir"
                  mountPath: /workdir
                resources:
                  requests:
                    memory: 1Gi
                    cpu: 1
                activeDeadlineSeconds: 1200
          - name: run-test
            when: "{{workflow.parameters.enable_test}} == true"
            inline: 
              container:
                image: mirrors-ssl.aliyuncs.com/golang:1.21-alpine
                command:
                  - sh
                  - -c
                  - |
                    set -eu
                    if [ ! -d "/workdir/pkg/mod" ]; then
                      mkdir -p /workdir/pkg/mod
                      echo "GOMODCACHE Directory /pkg/mod is created"
                    fi
                    export GOMODCACHE=/workdir/pkg/mod
                    cp -R /workdir/{{workflow.parameters.repo_name}} /test/{{workflow.parameters.repo_name}} 
                    echo "Start Go Test..."
                    cd /test/{{workflow.parameters.repo_name}}
                    go test -v ./...
                    echo "Go Test Complete."
                volumeMounts:
                - name: "workdir"
                  mountPath: /workdir
                - name: run-test
                  mountPath: /test
                resources:
                  requests:
                    memory: 4Gi
                    cpu: 2
              activeDeadlineSeconds: 1200
            depends: git-checkout-pr    
          - name: build-push-image
            inline: 
              container:
                image: mirrors-ssl.aliyuncs.com/moby/buildkit:v0.13.0-rootless
                command:
                  - sh
                  - -c
                  - |         
                    set -eu
                    tag={{workflow.parameters.container_tag}}
                    if [ {{workflow.parameters.enable_suffix_commitid}} = "true" ]
                    then
                      commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)
                      tag={{workflow.parameters.container_tag}}-$commitId
                    fi
                    echo "Image Tag is: "$tag
                    echo "Start to Build And Push Container Image"
                    cd /workdir/{{workflow.parameters.repo_name}}
                    buildctl-daemonless.sh build \
                    --frontend \
                    dockerfile.v0 \
                    --local \
                    context=. \
                    --local \
                    dockerfile=. \
                    --opt filename={{workflow.parameters.dockerfile}} \
                    --opt build-arg:GOPROXY=http://goproxy.cn,direct \
                    --output \
                    type=image,\"name={{workflow.parameters.container_image}}:${tag},{{workflow.parameters.container_image}}:latest\",push=true,registry.insecure=true \
                    --export-cache mode=max,type=registry,ref={{workflow.parameters.container_image}}:buildcache \
                    --import-cache type=registry,ref={{workflow.parameters.container_image}}:buildcache
                    echo "Build And Push Container Image {{workflow.parameters.container_image}}:${tag} and {{workflow.parameters.container_image}}:latest Complete."
                env:
                  - name: BUILDKITD_FLAGS
                    value: --oci-worker-no-process-sandbox
                  - name: DOCKER_CONFIG
                    value: /.docker
                volumeMounts:
                  - name: workdir
                    mountPath: /workdir
                  - name: docker-config
                    mountPath: /.docker
                securityContext:
                  seccompProfile:
                    type: Unconfined
                  runAsUser: 1000
                  runAsGroup: 1000
                resources:
                  requests:
                    memory: 4Gi
                    cpu: 2
              activeDeadlineSeconds: 1200
            depends: run-test

kubectl apply -f cluster-workflow-template.yaml を実行して、テンプレートをクラスターにデプロイできます。

テンプレートパラメーターの説明

パラメーター

説明

entrypoint

entrypoint テンプレートを定義します。

main

repo_url

Git リポジトリの URL です。

https://github.com/ivan-cai/echo-server.git

repo_name

リポジトリの名前です。

echo-server

target_branch

リポジトリのターゲットブランチです。デフォルト値は main です。

main

container_image

ビルドするコンテナイメージを指定します。形式は <Container Registry Enterprise Edition Domain>/<Container Registry Enterprise Edition namespace>/<repository name> です。

test-registry.cn-hongkong.cr.aliyuncs.com/acs/echo-server

container_tag

ビルドするイメージタグを指定します。デフォルト値は v1.0.0 です。

v1.0.0

dockerfile

Dockerfile のパスとファイル名です。

これはプロジェクトのルートディレクトリからの相対パスです。デフォルト値は ./Dockerfile です。

./Dockerfile

enable_suffix_commitid

イメージタグにコミット ID を追加するかどうかを指定します。

  • true (デフォルト): ID を追加します。

  • false: ID を追加しません。

true

enable_test

Go Test ステップを実行するかどうかを指定します。

  • true (デフォルト): ステップを実行します。

  • false: ステップを実行しません。

true

操作手順

このトピックでは、パブリック Git リポジトリを使用して CI パイプラインを構築する方法を示します。ワークフローの CI パイプラインでプライベート Git リポジトリを使用する場合は、まずプライベートリポジトリをクローンする必要があります。詳細については、「CI パイプラインでプライベート Git リポジトリをクローンする」をご参照ください。

重要

コンテナイメージのアクセス認証情報を保存する Secret とマウントされた NAS ボリュームは、送信するワークフローと同じ名前空間に存在する必要があります。

ステップ 1: ACR EE アクセス認証情報の作成

BuildKit は、主に Container Registry Enterprise Edition のアクセス認証情報を使用してイメージをプッシュします。

  1. Container Registry Enterprise Edition のアクセス認証情報を設定します。詳細については、「アクセス認証情報の設定」をご参照ください。

  2. 次のコマンドを実行して、クラスターに Secret を作成します。この Secret は Container Registry Enterprise Edition のパスワードを保存し、BuildKit が使用します。

    説明

    $repositoryDomain を、お使いの Container Registry Enterprise Edition イメージリポジトリのアドレスに置き換えてください。

    $username を、お使いの Container Registry Enterprise Edition イメージリポジトリのユーザー名に置き換えてください。

    $password を、お使いの Container Registry Enterprise Edition イメージリポジトリのパスワードに置き換えてください。

    kubectl create secret -n argo generic docker-config --from-literal="config.json={\"auths\": {\"$repositoryDomain\": {\"auth\": \"$(echo -n $username:$password|base64)\"}}}"

ステップ 2: NAS ボリュームのマウント

NAS ボリュームをマウントすると、ワークフロー内の異なるジョブ間で、クローンされたリポジトリ情報などのデータを共有できます。このボリュームは Go mod キャッシュを保存するためにも利用でき、CI パイプラインの go test および go build プロセスを高速化します。

詳細については、「ボリュームの使用」をご参照ください。

ステップ 3: テンプレートからワークフローを開始

コンソール

  1. Argo コンソールにログオンします。 左側のナビゲーションペインで、[クラスターワークフローテンプレート] をクリックし、次に事前定義されたテンプレート [ci-go-v1] をクリックします。

  2. 「テンプレート詳細」ページで、左上隅にある[+ SUBMIT]をクリックします。パネルで、必要なパラメーターを入力し、下部にある[+ SUBMIT]をクリックします。

    パラメーターの詳細については、このトピックの前半の「テンプレートパラメーターの説明」セクションをご参照ください。パラメーターを実際の値に設定してください。

    ワークフローが送信されると、[ワークフロー] ページでそのステータスを確認できます:

    ワークフローは、DAG として [git-checkout-pr][run-test][build-push-image] ステップを順番に実行します。すべてのノードが緑色になると、ワークフローが正常に完了したことになります。

Argo CLI

  1. 次の内容で workflow.yaml という名前のファイルを作成します。要件に基づいてパラメーター値を変更してください。詳細については、「テンプレートパラメーターの説明」セクションをご参照ください。

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      generateName: ci-go-v1-
      labels:
        workflows.argoproj.io/workflow-template: ackone-ci
      namespace: argo  
    spec:
      arguments:
        parameters:
        - name: repo_url
          value: https://github.com/ivan-cai/echo-server.git
        - name: repo_name
          value: echo-server
        - name: target_branch
          value: main
        - name: container_image
          value: "test-registry.cn-hongkong.cr.aliyuncs.com/acs/echo-server"
        - name: container_tag
          value: "v1.0.0"
        - name: dockerfile
          value: ./Dockerfile
        - name: enable_suffix_commitid
          value: "true"
        - name: enable_test
          value: "true"
      workflowTemplateRef:
        name: ci-go-v1
        clusterScope: true
  2. 次のコマンドを実行して、ワークフローを送信します。

    argo submit workflow.yaml

お問い合わせ

この製品に関する提案や質問がある場合は、DingTalkグループ35688562に参加してお問い合わせください。