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

:CIパイプラインでのプライベートGitリポジトリのクローン

最終更新日:Nov 14, 2024

Distributed Cloud Container Platform for Kubernetes (ACK One) ワークフロークラスタに構築されている継続的統合 (CI) パイプラインは、BuildKit CacheとApsara File Storage NAS (NAS) を使用してGoモードキャッシュを格納するため、パイプラインを大幅に高速化します。 プライベートGitリポジトリを使用してワークフロークラスター内のGolangプロジェクトのCIパイプラインを構築する場合は、まずパイプライン内のプライベートリポジトリのクローンを作成する必要があります。 このトピックでは、CIパイプラインでプライベートGitリポジトリをクローンする方法について説明します。

背景情報

パブリックGitリポジトリを使用してCIパイプラインを構築するためのベストプラクティスの詳細については、「ワークフロークラスターでのGolangプロジェクトのCIパイプラインの作成」をご参照ください。

プライベートGitリポジトリを使用するには、まずパイプラインでプライベートリポジトリをクローンする必要があります。

次の方法を使用して、プライベートGitリポジトリをクローンできます。

リポジトリの資格情報をワークフロークラスターに保存する

プライベートGitリポジトリのクローンを作成する前に、まず次のコマンドを実行して、リポジトリのユーザー名、パスワード、SSHプライベートキーワークフロークラスターに格納するSecretを作成する必要があります。

コマンドのusernamepassword、およびssh-private-keyを実際の値に置き換えます。

kubectl create secret generic git-creds --from-literal="username=${username}" --from-literal="password=${password or token}" --from-file=ssh-private-key=${ssh private key path}

# example
# kubectl create secret generic git-creds --from-literal="username=demo" --from-literal="password=ghp_GePB****************d407" --from-file=ssh-private-key=$HOME/.ssh/id_rsa

方法1: Argo Workflows Gitアーティファクトとユーザー名とパスワード

プライベートGitリポジトリをクローンし、リポジトリをチェックアウトします。

GolangプロジェクトのCIパイプラインの作成トピックで使用される定義済みワークフローテンプレートと比較して、3つのメソッドで使用されるワークフローテンプレートはgit-checkout-prタスクのみを保持します。 方法1で使用されるワークフローテンプレートでは、git-cloneタスクが追加され、git-cloneタスクがgit-checkout-prタスクの依存関係として設定されます。

  • git-checkout-prタスクのcommandパラメーターでシェルスクリプトを変更する必要はありません。

  • git-cloneタスクのartifactsパラメーターは、git-creds Secretのリポジトリのユーザー名とパスワードを参照します。

サンプルテンプレート

apiVersion: argoproj.io/v1alpha1
kind: ClusterWorkflowTemplate
metadata:
  name: ci-git-artifact
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"
  templates:
    - name: main
      dag:
        tasks:
          - name: git-clone
            arguments:
              artifacts:
              - name: git-repo
                path: /workdir
                git:
                  repo: "{{arguments.parameters.repo_url}}"
                  revision: main
                  usernameSecret:
                    name: git-creds
                    key: username
                  passwordSecret:
                    name: git-creds
                    key: password
                  sshPrivateKeySecret:
                    name: git-creds
                    key: ssh-private-key
            inline:
              container:
                image: golang:1.10
                command: 
                - sh
                - -c
                - |
                  cd {{workflow.parameters.repo_name}}
                  git status && ls
                workingDir: /workdir
                volumeMounts:
                - name: "workdir"
                  mountPath: /workdir
          - name: git-checkout-pr
            inline:
              container:
                image: 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 {{workflow.parameters.target_branch}}
                    
                    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
            depends: git-clone   

ワークフローを送信するためのパラメーター

ワークフローを送信するときに、CIパイプラインと一貫してワークフローパラメーターを設定します。 次の図は例です。

image

方法2: ArgoワークフローGitアーティファクトとSSH秘密鍵を使用する

方法1と比較して、方法2には次の違いがあります。

  • git-cloneタスクのartifactsパラメーターは、git-creds SecretからSSH秘密鍵を参照します。

  • ワークフローを送信するときに、repo_urlパラメーターをSSH形式で指定します。 例: git@github.com:ivan-cai/gitops-demo-private.git

サンプルテンプレート

apiVersion: argoproj.io/v1alpha1
kind: ClusterWorkflowTemplate
metadata:
  name: ci-git-artifact-sshkey
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"
  templates:
    - name: main
      dag:
        tasks:
          - name: git-clone
            arguments:
              artifacts:
              - name: git-repo
                path: /workdir
                git:
                  repo: "{{arguments.parameters.repo_url}}"
                  revision: main
                  sshPrivateKeySecret:
                    name: git-creds
                    key: ssh-private-key
            inline:
              container:
                image: golang:1.10
                command: 
                - sh
                - -c
                - |
                  cd {{workflow.parameters.repo_name}}
                  git status && ls
                workingDir: /workdir
                volumeMounts:
                - name: "workdir"
                  mountPath: /workdir
          - name: git-checkout-pr
            inline:
              container:
                image: 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 {{workflow.parameters.target_branch}}
                    
                    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
            depends: git-clone   

ワークフローを送信するためのパラメーター

パラメーター:

説明

repo_urlパラメーターをSSH形式で指定します。

image

方法3: git cloneコマンドとユーザー名とパスワードを使用する

方法1および2と比較して、方法3は、有向非巡回グラフ (DAG) タスクを必要としない。 さらに、このメソッドはgit-checkout-prタスクのgit cloneコマンドを変更し、環境変数を使用してgit-creds Secretのユーザー名とパスワードを参照します。 Command:

git clone https://${GIT_USER }:${ GIT_TOKEN}@ github.com/${GITHUB_REPOSITORY}

サンプルテンプレート

apiVersion: argoproj.io/v1alpha1
kind: ClusterWorkflowTemplate
metadata:
  name: ci-git
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"
  templates:
    - name: main
      dag:
        tasks:
          - name: git-checkout-pr
            inline:
              container:
                image: alpine:latest
                env:
                - name: GIT_USER
                  valueFrom:
                    secretKeyRef:
                      name: git-creds
                      key: username
                - name: GIT_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: git-creds
                      key: password
                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 https://$GIT_USER:$GIT_TOKEN@{{workflow.parameters.repo_url}} 
                    cd {{workflow.parameters.repo_name}}
          
                    echo "Start to Checkout target branch" {{workflow.parameters.target_branch}}
                    git checkout {{workflow.parameters.target_branch}}
                    
                    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

ワークフローを送信するためのパラメーター

パラメーター:

説明

repo_urlパラメーターの値の先頭にrepo_urlを付けることはできません。

image

関連ドキュメント

パブリックGitリポジトリを使用してCIパイプラインを構築するためのベストプラクティスの詳細については、「ワークフロークラスターでのGolangプロジェクトのCIパイプラインの作成」をご参照ください。