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

Container Compute Service:Argo ワークフローを使用して CI パイプラインを作成する

最終更新日:Dec 28, 2024

Argo ワークフローは、使いやすいインターフェースとツールを提供します。YAML ファイルを使用してワークフローを定義し、継続的インテグレーション (CI) パイプラインを迅速に構成できます。Argo ワークフローを使用すると、クラスター内でジョブを同時に実行し、必要なコンピューティングリソースを動的にスケーリングできます。これにより、CI パイプラインの効率が向上します。

機能概要

Argo ワークフローを使用して CI パイプラインを作成するには、BuildKit を使用してコンテナイメージをビルドおよびプッシュし、BuildKit Cache を使用してイメージビルドを高速化します。ファイルストレージ NAS (NAS) を使用して Go mod キャッシュを保存すると、Go Test および Go Build ステップを高速化できます。これにより、CI パイプラインの作成に必要な時間が大幅に短縮されます。

事前定義された ClusterWorkflowTemplate の紹介

事前定義されたテンプレートを直接使用するか、事前定義されたテンプレートに基づいてカスタムテンプレートを作成できます。この例では、ci-go-v1 という名前の ClusterWorkflowTemplate が作成されます。このテンプレートは、BuildKit Cache と NAS を使用して Go mod キャッシュを保存し、CI パイプラインの作成を大幅に高速化します。

ClusterWorkflowTemplate のプロセスを表示する

  1. Git Clone and Checkout

    • Git リポジトリを複製し、Git リポジトリを宛先ブランチにチェックアウトします。

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

  2. Go テストを実行

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

    • パイプラインパラメータ enable_test を設定して、このステップを実行するかどうかを指定できます。

    • Go mod キャッシュは、NAS ファイルシステムの /pkg/mod ディレクトリに保存され、Go TestGo Build を高速化します。

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

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

    • デフォルトでは、イメージタグは {container_tag}-{commit_id} 形式です。パイプラインを送信するときに、コミット ID をイメージタグに追加するかどうかを指定できます。

    • イメージのプッシュ中に、イメージの最新バージョンがプッシュされ、現在のバージョンが上書きされます。

ClusterWorkflowTemplate の内容を表示する

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
                    // Gitリポジトリのクローンを開始します。
                    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
                    
                    // コミットIDを取得します。
                    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)
                    // コミットIDを取得しました。
                    echo "Commit id is got: "$commitId
                                        
                    // Gitのクローンとチェックアウトが完了しました。
                    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:alpine3.21
                command:
                  - sh
                  - -c
                  - |
                    set -eu
                    
                    if [ !  -d "/workdir/pkg/mod" ]; then
                      mkdir -p /workdir/pkg/mod
                      // GOMODCACHEディレクトリ /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}} 
                    // Goテストを開始します...
                    echo "Start Go Test..."
                    
                    cd /test/{{workflow.parameters.repo_name}}
                    go test -v ./...
                    
                    // Goテストが完了しました。
                    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}} \
                    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
                    
                    // コンテナイメージ {{workflow.parameters.container_image}}:${tag} および {{workflow.parameters.container_image}}:latest のビルドとプッシュが完了しました。
                    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

エントリテンプレートを指定します。

main

repo_url

Git リポジトリの URL。

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

repo_name

リポジトリの名前。

echo-server

target_branch

リポジトリの宛先ブランチ。デフォルト値:main。

main

container_image

ビルドするイメージ。形式:<ACR EE ドメイン>/<ACR EE 名前空間>/<リポジトリ名>

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 テストステップを実行するかどうかを指定します。有効な値:

  • true:Go テストステップを実行します。これがデフォルト値です。

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

true

手順

パブリック Git リポジトリを例として使用して、CI パイプラインの作成方法を示します。プライベート Git リポジトリを使用する場合は、最初に CI パイプラインでプライベートリポジトリを複製する必要があります。詳細については、CI パイプラインでプライベート Git リポジトリを複製する を参照してください。

重要

コンテナイメージと NAS ボリュームにアクセスするための資格情報を格納するシークレットは、送信されるパイプラインの名前空間に属している必要があります。

ステップ 1:Container Registry Enterprise Edition インスタンスにアクセスするための資格情報を作成する

資格情報は、BuildKit からイメージをプルするために使用されます。

  1. Container Registry Enterprise Edition インスタンスのアクセス資格情報を構成します。詳細については、Container Registry Enterprise Edition インスタンスのアクセス資格情報を構成する を参照してください。

  2. 次のコマンドを実行して、資格情報を格納するシークレットをクラスターに作成します。資格情報は BuildKit によって使用されます。

    説明

    $repositoryDomain:Container Registry イメージリポジトリのドメイン名。

    $username:Container Registry イメージリポジトリのユーザー名。

    $password:Container Registry イメージリポジトリのパスワード。

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

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

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

NAS ボリュームのマウント方法の詳細については、ボリュームを使用する を参照してください。

ステップ 3:テンプレートに基づいてパイプラインを起動する

コンソールを使用する

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

    image

  2. テンプレートの詳細ページで、右上隅にある + 送信をクリックします。表示されるパネルで、パラメータを構成し、+ 送信をクリックします。

    テンプレートパラメータ を参照し、ビジネス要件に基づいてパラメータを構成します。

    image

    構成が完了すると、ワークフロー詳細ページでパイプラインの状態を確認できます。

    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にご参加ください。