CI/CDパイプライン実行時のsecret変数参照先を調べてみた。

:::note info
2024/12/17
新規作成
:::

#### 概要
　過去に作成したパイプラインを再実行した際に、git clone タスク実行時のsecretが原因でstepエラーとなったことを切掛に、secretの参照関係を調査しました。
　状況としては、再実行時に該当のsecretが参照パスがなくなっていたことが原因でした。また、project間でyamlをコピーした際など、別projectのsecretを参照することは出来ないことも注意点です。

---
#### 前提・環境など
- OCP 14.16 (IBM Managed Openshift /ROKS)
- RedHat Enterprise Linux 8.6 (踏み台サーバー)
---
#### 前提知識
- tekton の基礎知識 (PipeLine、Taskなど)
- OpenShiftの基礎知識 (ConfigMap、Secret、deployment、Dockerfile、podなど)

---
#### 1. Pipeline実行時の参照secretについて
　secretの参照関係を図にしてみました。各コンポーネントの概要は以下の表の通りです。
 
 ![default-secret.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/a713a4c7-0acb-bf2d-9074-6a525faaac15.png)

| # | コンポーネント | 概要 |
|:-----------|:------------|:------------|
|(1) |    Pipelines     |パイプライン定義 実行予定のTaskの順序や関連性を定義する       |
|(2) |    Tasks         |タスク定義 実行するコンテナイメージや、コンテナ稼働後のbash処理などを定義する|
|(3) |    PipelineRuns  |実行後のパイプラインのインスタンス。結果やログなどのstatus情報を含む|
|(4) |    TaskRuns      |実行後のタスクのインスタンス。結果やログなどのstatus情報を含む|
|(5) |    Secret        |basic認証や、key-value変数などを定義 (Taskに直接記載せずに分離する)|
|(6) |    ServiceAccount|パイプライン実行時のユーザー。Pipeline実行権限(Role)を持つ必要がある|
|(7) |    TectonConfig  |パイプライン実行時のdefault Service Account(pipeline)を定義している|


以下、よく見るパイプライン実行時のGUIから情報をたどってみます。

##### 1-1.実行時UI (認証情報オプション)
　Pipelineの起動時には、認証情報オプションという欄があります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/673e1291-32f5-7857-1607-2e4748aea69c.png)

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/545ee601-04a7-3f6a-88f7-3f210719a8b5.png)

　この一覧で参照できているものが、パイプライン/タスク内でのGitアクセスなどに利用可能な Secretとなります。

##### 1-2.(Service Account)pipeline からみる参照Secret
　先の1-1の参照Secretは、どこで定義されているのかを辿ってみます。
　結論から記載すると、今回は pipelineという名前のServiceAccountから紐づいていました。このpipelineは、パイプラインを実行する際のデフォルトServiceAccountに相当します。(後述)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/80251d19-494a-9f6c-8060-7d4c20f17ed5.png)


　画像の`secrets:` 定義を見ていただくと、先の認証情報オプションにもあった `git250225-pipeline` と `pipelinetestsecret` が指定されていることがわかります。ServiceAccountは、これらのsecretをproject内部で探して、パイプライン実行時に参照するというワケです。(ちなみに、github-erimというgit認証用のbasic認証Secretは、別projectに存在し参照スコープ外のため、先の実行時画面で表示されていません)
 
##### 1-2.PipelineRuns / TaskRunsからみる service account
　実際、パイプライン実行時にどのServiceAccountを指定しているのか見てみます。
　Pipelines、Tasks自体にはServiceAccountの指定はありません。その代わりに、PipelineRuns、TaskRunsの各インスタンスで実行時に指定されていることがわかります。(下図：例)

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/6f13c066-719f-2377-7040-415a62a88b84.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/f935e309-a2ce-0306-fc43-d1eb8da7b44c.png)

　spec.serviceAccountName変数として、`pipeline` というServiceAccountリソースをTaskRunで指定していることがわかります。

　ちなみに、このインスタンス実行時のServiceAccountですが、デフォルト定義としては、config という`TektonConfigs` に記載があります。`TektonConfigs`は、`CustonResourceDefinitions` 一覧から参照することができるカスタムリソースです。(configはTektonConfigsのインスタンス名)
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/e0a15dbd-c3f0-f997-2140-88676c055210.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/197de17e-0524-fad1-f287-0f743e3631dd.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433398/8c89a0db-1675-ae48-7c99-304cda5ebf0f.png)

 この、config というTektonConfigsリソースに ` default-service-account: pipeline` という記載があるため、tekton パイプラインの実行サービスアカウントが `(SA)pipeline` となり、 `(SA)pipeline`から参照可能なSecretを参照して、Gitアクセスができる、という流れになります。

#### 2. 各変数のスコープについて

　改めてではありますが、各コンポーネントのスコープを整理しておきます。Pipelineを実行する際、リソースはprojectスコープとなります。
　つまり、Pipeline実行時に参照するServiceAccount、Secretは、同一projectで定義してある必要があります。(当たり前と言えば当たり前)
　ただし、Pipeline実行時のdefault ServiceAccountを管理しているTektonConfigsはprojectのリソースではありません。

| コンポーネント | スコープ | 備考 |
|:-----------|:------------|:------------|
| Pipeline / PipelineRuns      |    project     |          |
| Task / TaskRuns     |    project   |        |
| ServiceAccount     |    project   |        |
| Secret     |    project   |        |
| TektonConfigs     |    共通   |        |



#### おわりに
ここまで読んでくださって有難うございました。認識違い等、お気づきの点ありましたらコメント頂けますと幸いです。