最近よく見るCodePipeline V2とV1との違いを今こそ理解したい

## はじめに
こんにちは！

AWS CodePipelineは2023/10/24にV2という新しいパイプラインタイプがリリースされ、従来のパイプラインはV1のタイプに分類されるようになりました。

V2は頻繁にアップデートされており、V1でできなかったことが色々できるようになっています。ただ、[公式ドキュメントではV1との差がわかりにくかった](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html)ので違いを改めて整理したいと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552758/80dbf3c7-dac2-f940-0c5d-a4744ceb9da5.png)


引用:[What type of pipeline is right for me?](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html)

## パイプラインレベル変数（Pipeline-level variables）

パイプライン実行時に変数を渡す機能です。V2のみ対応しています。
変数を渡すことでパイプライン内のステージで実行される処理を動的に変更することが可能です。

パイプライン実行時に以下のように変数の値を入力して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552758/b246f693-3637-422a-5f91-31ba17d9beac.png)

特定のステージで`#{variables.xxx}`という形で参照します。（図の最後の項目）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552758/a6502785-083f-8bdc-4c3a-b151943fa143.png)

パイプライン変数を使うことで、似ているけどちょっと違う処理をパイプラインで実行したい場合にパイプラインを分けなくてよくなります。

## ソースリビジョンの上書き（Source revision overrides）
パイプラインを実行する際に以前処理されたソースのリビジョンを指定できる機能です。V2でのみ使用可能です。これまでは手動でパイプラインを実行する場合、最新のリビジョンが自動で選択されていました。これがリビジョンを上書きできるようになったので、例えば新しいソースソースリビジョンが原因で失敗した場合に、以前正常に処理されたソースリビジョンを選択してロールバックするようなことが可能になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552758/2a7f4330-4970-4dc5-cb3e-9e686c66134c.png)


ソースリビジョンの上書きがサポートされているリビジョンのタイプは`COMMIT_ID`、`IMAGE_DIGEST`、`S3_OBJECT_VERSION_ID`の三つになっています。

## トリガーのフィルタ（Filter triggers）
パイプラインをトリガーする条件をタグやブランチ名、ファイルパスなどでフィルタ出来る機能です。V2でのみ使用可能です。これがなかったがためにCodePipelineを利用していない人は結構いるんじゃないでしょうか。

PushまたはPull Requestイベントで1つ以上のフィルターを設定できます。
例えば、mainブランチのdirAのディレクトリ以下に変更があったPushにのみトリガーするには以下のように指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552758/875f4b3e-5380-f959-39fd-910a8777a426.png)

フィルタに対応しているのは以下のソースプロバイダです。CodeCommitはありませんのでご注意ください。
- Bitbucket Cloud
- GitHub
- GitHub Enterprise Server
- GitLab.com
- GitLab self-managed


## 実行モード（Execution modes）

実行モードはパイプラインの実行が完了していない状態で更に実行された際の挙動を制御する機能です。実行モードは`SUPERSEDED`、`QUEUED`、`PARALLEL`の3つがあり、V1では`SUPERSEDED`のみ対応しています。V2は全て対応していてパイプライン作成後に切り替えることが可能です。

### SUPERSEDED 

デフォルトの実行モードです。この実行モードでは過去の実行が新しい実行で上書きされることがあります。

具体的に説明します。パイプラインは1つ以上のステージから構成されているのですが、あるステージが実行している最中はそのステージがロックされます。つまりパイプラインを複数回実行したとしても、ステージのロックが解除されるまでは後続の実行はステージの手前で止まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552758/af277c97-1262-880a-e30f-f9e6622a69a8.png)
引用: [How pipeline executions work](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts-how-it-works.html)

同じステージのロック解除を待つ実行が2つ以上になった場合、`SUPERSEDED`では古い実行は上書きされ一番最新の実行のみが残ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552758/a5c6f45e-d76e-e860-666a-52226b8871a0.png)
引用: [How pipeline executions work](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts-how-it-works.html)

### QUEUED

この実行モードではキューに入れられた順序で実行が処理されます。V2のみ対応しています。`SUPERSEDED`ではロック解除を待つ実行が2つ以上になった場合上書きされていましたが、`QUEUED`ではキューにたまって順に実行されます。

### PARALLEL
この実行モードでは各実行は完全に独立していて個別に処理されます。V2のみ対応しています。
実行モードを`PARALLEL`モードから`SUPERSEDED`または`QUEUED`に変更する場合、[既知の課題がある](https://docs.aws.amazon.com/codepipeline/latest/userguide/troubleshooting.html#troubleshooting-execution-mode-displayedstate)ようなので読んでおくとよいでしょう。

## 料金体系
V1とV2では課金体系が異なります。

V1はアクティブなパイプラインの数に応じた課金（1USD/パイプライン）、V2はパイプラインの実行時間に応じた課金（0.002USD/min）になります。無料利用枠もあってV1は1つ、V2は100分まで無料です。
詳しくは[AWS CodePipelineの料金](https://aws.amazon.com/jp/codepipeline/pricing/)をご参照ください。

※料金は2024/3現在のus-west-2のものです
## 使い分け
機能面だけみるとV2はV1の機能を包含していそうなので、新しく作るならV2でしょうか。できることが増えるので禁止したい場合ポリシーが長くなりそうですが。なお、パイプラインが1つでよくて実行時間が長いなどのケースではV1にコストメリットが出そうですね。


追記 (2024/3/14)：
CDKだとV2が今後デフォルトになるみたいです！情報ありがとうございます！


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちなみに次のリリースから、CDKでCodepPipeline作る時に新規CDKプロジェクト、または既存プロジェクトで該当機能フラグをオンにした場合で、V2タイプがデフォルトで使われるようになります。(以前メンテナとの議論の末、新しいタイプを使うべきだとのことで)<a href="https://t.co/4sTXQbcprD">https://t.co/4sTXQbcprD</a></p>&mdash; k.goto (@365_step_tech) <a href="https://twitter.com/365_step_tech/status/1767924543778324555?ref_src=twsrc%5Etfw">March 13, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## おわりに
最後までお読みいただきありがとうございました！
XのCDK界隈のTLでCodePipeline V2の話題を最近よく見かけるので記事を書きました。（[@365_step_tech](https://twitter.com/365_step_tech)さんが開発いただいていて感謝しかない）

今回の記事が何かのお役に立てば幸いです！