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を作成する必要があります。
コマンドのusername
、password
、および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パイプラインと一貫してワークフローパラメーターを設定します。 次の図は例です。
方法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形式で指定します。
方法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
を付けることはできません。
関連ドキュメント
パブリックGitリポジトリを使用してCIパイプラインを構築するためのベストプラクティスの詳細については、「ワークフロークラスターでのGolangプロジェクトのCIパイプラインの作成」をご参照ください。