IBM CloudのTektonにおけるプライベートリポジトリーの認証情報を秘匿したgit clone

# 課題: 認証情報をsecretマニフェストにて管理した場合、そのsecretマニフェストをどのように秘匿するか。

ここでは、IBM CloudのTektonにおける「環境プロパティー」の「セキュアな値」タイプを使用してマニフェストから認証情報を秘匿し、プライベートgitリポジトリーのgit cloneを行なう。

なお、IBM Cloud側の設定は以下の設定内容を継続して使用している。
https://qiita.com/hiroyuki_onodera/items/b842b351747508641cc3

# ローカル環境
- Fedora Linux 35 (Workstation Edition)



# Gitプラットフォーム上プライベートリポジトリーに接続する為の認証情報


以下のスクリプトのHost, User, IdentityFile箇所を書き換えて実行。
得られる出力の内容をIBM Cloud上のセキュアな値として設定する。

```:param.sh
#! /bin/bash

Host="github.com"                # Gitプラットフォーム
User="USER"                      # Gitプラットフォームに対するユーザー
IdentityFile="~/.ssh/id_rsa"     # Gitプラットフォームに対するユーザーのsshプライベートキー

echo id_rsa: $(eval cat ${IdentityFile}| base64 -w0)
echo
echo config: $(cat << __EOC__ | base64 -w0
Host ${Host}
  User ${User}
__EOC__
)
echo
echo known_hosts: $(ssh-keyscan ${Host} 2>/dev/null| base64 -w0)
```

```
$ bash param.sh
id_rsa: ls0tls0crudjtibpuevou0niifbssvzbveug...

config: sg0zdcbnaxrodwiuy00tciagvxnlcibiaxjv...

known_hosts: z0l0ahvilmnvbsbzc0gtcnnhiefbquf...
```

特にid_rsaは長い。


# IBM Cloud上での変数設定


セキュアな値として上の値を設定する

ツールチェーンの画面で、左サイドメニューから環境プロパティを選択

![スクリーンショット 2022-03-28 22.00.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/57239928-9443-6a07-cec4-db173f9328aa.png)

「追加」をクリックすると現れる「セキュアな値」を選択

![スクリーンショット 2022-03-28 22.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/39be9508-e7ec-c8e1-72dd-1b7f8a3f8b95.png)

右の「プロパティの追加」において、名前(id_rsa)と値を設定し、右下の「追加」をクリック

![スクリーンショット 2022-03-28 22.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/d41824b5-d9fb-3faa-fa6d-e90b7fd43941.png)

以下のように追加される。

![スクリーンショット 2022-03-28 22.02.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/8732fb71-7117-b453-583f-20f7bb58bc34.png)

同様に「config」、「known_hosts」を追加

![スクリーンショット 2022-03-28 22.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/a3d8ea16-a2d2-74a4-46ba-a357443a3af1.png)

これらの値は一旦設定するとGUI上ではもう確認できない。
削除、新規追加、名前のリネームは可能。




# マニフェスト側での値の利用

これらの値は、Tekton TriggerTemplateリソース定義において、$(params.PROPERTY_NAME)を使用して参照可能。

## EventListenerとTriggerTemplateのマニュフェスト

```yaml:eventlistener.yaml
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: listener1
spec:
  triggers:
    - bindings:
        - name: message
          value: Hello from the Triggers EventListener!
      template:
        ref: pipelinerun
---
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: pipelinerun
spec:
  resourcetemplates:
    -
      apiVersion: v1
      kind: Secret
      metadata:
        name: git-ssh
      data:
        id_rsa: $(params.id_rsa)            # IBM Cloudの「セキュアな値」環境プロパティーで指定した値
        config: $(params.config)            # 同上
        known_hosts: $(params.known_hosts)  # 同上
    -
      apiVersion: tekton.dev/v1beta1
      kind: PipelineRun
      metadata:
        generateName: secure-git-clone-
      spec:
        pipelineRef:
          name: secure-git-clone
        workspaces:
          - name: ssh-directory             # gitに接続する.ssh下の情報を持つworkspace
            secret:
              secretName: git-ssh           # 上で動的に作成したsecret
          - name: shared-workspace          # git-clone先workspace。task間で共有可能。
            volumeClaimTemplate:
              spec:
                accessModes:
                  - ReadWriteOnce
                resources:
                  requests:
                    storage: 1Mi
        params:
          - name: url
            value: git@github.com:aaaa/bbbb.git
```

listener1が呼ばれるとpipelinerun TriggerTemplateが呼ばれ、git-ssh Secretが作成され、secure-git-cloneに対するPipelineRunが行われる。

## Pipelineのマニュフェスト

```yaml:pipeline.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: secure-git-clone
spec:

  workspaces:
    - name: ssh-directory
    - name: shared-workspace

  params:
    - name: url
      description: Repository URL to clone from
      type: string
    - name: revision
      description: Revision to checkout. (branch, tag, sha, ref, etc...)
      type: string
      default: ''

  tasks:

    - name: clone-private-repo
      taskRef:
        kind: Task
        name: git-clone                 
          # Tekton Hubから以下によりgit-clone.yamlを入手し、.tektonディレクトリーにおいておく
          # curl -OL https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.5/git-clone.yaml
      workspaces:
        - name: ssh-directory           # git-cloneにより指定
          workspace: ssh-directory
        - name: output                  # git-cloneにより指定。git-clone先。
          workspace: shared-workspace
      params:
        - name: url                     # git-cloneにより指定 
          value: $(params.url)
        - name: revision                # git-cloneにより指定
          value: $(params.revision)

    - name: check-cloned-repo
      taskRef:
        kind: Task
        name: check-cloned-repo
      runAfter:
        - clone-private-repo
      workspaces:
        - name: source                  # git-clone先を/workspace/sourceとしてmount
          workspace: shared-workspace
```
Pipelineは2つのTaskを実行。

## git-cloneタスク(Tekton Hub)

1つ目のTaskはTekton Hubのgit-clone

https://hub.tekton.dev/tekton/task/git-clone

必要なworkspaceやparamの詳細は上を参照。
ここでは以下を使用している。

- Workspaces
    - output
    - ssh-directory
- Parameters
    - url
    - revision

入手するには、

```
$ curl -OL https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.5/git-clone.yaml
```


もしくはtknコマンドを導入しているならば

```
$ tkn hub get task git-clone --version 0.5  > git-clone.yaml
```

## git cloneされた内容を表示するタスク

```yaml:task.yaml
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: check-cloned-repo
spec:
  workspaces:
  - name: source
  steps:
  - name: check-cloned-repo
    image: registry.access.redhat.com/ubi8:8.5-236.1647448331
    script: |
      #! /usr/bin/env bash
      set -ex
      ls -l /workspace/source
```

これらを.tekton下においてgit add, git commit, git pushすれば、この環境ではPipelineが実行される。
https://qiita.com/hiroyuki_onodera/items/b842b351747508641cc3

手動での実行なども可能。
https://qiita.com/hiroyuki_onodera/items/b842b351747508641cc3

# 実行結果

ツールチェーンの画面で、左サイドメニューからPipelineRunsを選択


![Screenshot from 2022-03-29 00-27-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/1d532639-6313-fdea-74ef-69133a02c29c.png)


今回の実行結果であるsecure-git-clone-4b64qの詳細を確認する。
secure-git-clone-4b64qのlinkをクリック。

## git-cloneタスク

![Screenshot from 2022-03-29 00-27-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/cfe8b225-03f5-e5f0-6e68-9f914f9c8c6b.png)


shared-workspaceである/workspace/outputにgit cloneされている。


## 内容確認タスク

![Screenshot from 2022-03-29 00-27-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187032/4c173e01-7f70-4add-173c-56b6ee4a5a85.png)


shared-workspaceを/workspace/sourceにマウントしているので、そこにgit cloneされた内容が展開されている。


# 参考
https://zenn.dev/ysmtegsr/articles/f537c9144f1cd103a05b