ACK One の CI パイプラインで、Git アーティファクトまたは環境変数を使用してプライベート Git リポジトリをクローンします。
3 つの方法があります。
前提条件
以下があることを確認してください:
-
ACK One のワークフロークラスターに設定済みの、Golang 用 Argo Workflows CI パイプライン。
-
プライベート Git リポジトリの認証情報:ユーザー名とパスワード (またはトークン)、あるいは SSH キー。
方法の選択
| 方法 | 認証 | 使用するケース |
|---|---|---|
| Git アーティファクトによるクローン (ユーザー名とパスワード) | ユーザー名 + パスワードまたはトークン | HTTPS リポジトリ。認証情報がすでにトークンとして管理されている場合 |
| Git アーティファクトによるクローン (SSH キー) | SSH 秘密鍵 | SSH 形式のリポジトリ URL。キーベースの認証を推奨する場合 |
| 環境変数の認証情報によるクローン | 環境変数によるユーザー名 + パスワードまたはトークン | DAG タスクが不要なシンプルな設定。単一タスクのワークフロー |
すべての方法で、リポジトリの認証情報用に git-creds という名前の Secret が必要です。まず Secret を作成してから、選択したテンプレートを適用してください。
ワークフロークラスターへの認証情報の保存
ワークフロークラスターに git-creds という名前の Secret を作成し、リポジトリのユーザー名、パスワード (またはトークン)、および SSH キーを保存してください。
プレースホルダーを実際の値に置き換えてください:
| プレースホルダー | 説明 | 例 |
|---|---|---|
${username} |
Git リポジトリのユーザー名 | demo |
${password or token} |
パスワードまたはパーソナルアクセス トークン。GitHub や同様のプロバイダーでは、パスワードの代わりにトークンが必要です。 | ghp_GePB****************d407 |
${ssh private key path} |
SSH 秘密鍵ファイルへのローカルパス | $HOME/.ssh/id_rsa |
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}
# 例:
# 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
SSH 認証の場合、まずキーペアを生成し、公開鍵を Git リポジトリに追加してください。お使いの Git プロバイダーのドキュメントをご参照ください: GitHub | GitLab。
Git アーティファクトによるクローン (ユーザー名とパスワード)
テンプレートは、git-creds Secret から username と password を読み取る git-clone タスクを、git-checkout-pr の依存関係として追加します。
どの方法でも、事前定義されたワークフローテンプレートの git-checkout-pr タスクをベースにしますが、git-checkout-pr の command パラメーター内のシェルスクリプトは、認証方法に合わせて変更されます。
ワークフローテンプレートの適用
次の ClusterWorkflowTemplate をワークフロークラスターに適用してください:
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
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/{{workflow.parameters.repo_name}}
echo "Start to Checkout target branch" {{workflow.parameters.target_branch}}
git fetch origin
git checkout {{workflow.parameters.target_branch}}
echo "Get commit id"
git rev-parse --short HEAD > /workdir/{{workflow.parameters.repo_name}}-commitid.txt
commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)
echo "Commit id is got: "$commitId
echo "Git Checkout Complete."
volumeMounts:
- name: "workdir"
mountPath: /workdir
resources:
requests:
memory: 1Gi
cpu: 1
activeDeadlineSeconds: 1200
depends: git-clone
ワークフローの送信
CI パイプラインの設定に合わせてワークフローパラメーターを設定し、ワークフローを送信してください。
Git アーティファクトによるクローン (SSH キー)
前の方法と似ていますが、2 つの違いがあります:
-
git-cloneタスクは、git-credsSecret からssh-private-keyのみを読み取ります。 -
repo_urlパラメーターは SSH 形式である必要があります。例:git@github.com:ivan-cai/gitops-demo-private.git。
ワークフローテンプレートの適用
次の ClusterWorkflowTemplate をワークフロークラスターに適用してください:
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/{{workflow.parameters.repo_name}}
echo "Start to Checkout target branch" {{workflow.parameters.target_branch}}
git fetch origin
git checkout {{workflow.parameters.target_branch}}
echo "Get commit id"
git rev-parse --short HEAD > /workdir/{{workflow.parameters.repo_name}}-commitid.txt
commitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)
echo "Commit id is got: "$commitId
echo "Git Checkout Complete."
volumeMounts:
- name: "workdir"
mountPath: /workdir
resources:
requests:
memory: 1Gi
cpu: 1
activeDeadlineSeconds: 1200
depends: git-clone
ワークフローの送信
repo_urlを SSH 形式で設定してください。例:git@github.com:ivan-cai/gitops-demo-private.git。
環境変数の認証情報によるクローン
個別の git-clone DAG タスクは不要です。git-checkout-pr タスクは、環境変数から認証情報を埋め込みます:
git clone https://$GIT_USER:$GIT_TOKEN@{{workflow.parameters.repo_url}}
このタスクは、2 つの環境変数を使用して git-creds Secret から認証情報を読み取ります:
| 環境変数 | Secret フィールド |
|---|---|
GIT_USER |
username |
GIT_TOKEN |
password |
ワークフローテンプレートの適用
次の ClusterWorkflowTemplate をワークフロークラスターに適用してください:
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には、リポジトリの生の URL を指定してください。https://プレフィックスは省略してください。テンプレートによって先頭に追加されます。