🚀
AWS CDK にコントリビュートしたときの流れ・記録
少し前に AWS CDK (以下のリポジトリ)にコントリビュートしたときの流れや実際に対応したことの記録です。
自分用の備忘録かつ、これから CDK にコントリビュートしたいと思っている方の参考になればよいなと思い記事にしました。
コントリビュートまでの流れ
Issue を見つける
まずは対応する Issue を決めます。
以下に Issue があがっているので、この中から対応したいものを見つけます。
コントリビュートが初めての場合は good first issue
や effort/small
のタグがついた Issue がおすすめです。
今回対応したのは以下の Issue です。
Issue の内容 / 解決したい問題を整理する
上記の Issue を対応すると決めて、実際に何が問題なのか / どうやって解決・実装するのかを以下のように整理しました。
- S3 の Lifecycle Rule では現在のバージョンでないオブジェクトを①いつ期限切れにするか②何世代までオブジェクトを保持するか を指定できる
- 今は①しか指定できないので、②も指定できるようにする
- 👆の対応とともに、現状のソースコードだと、非推奨の NoncurrentVersionExpirationInDays を使っているので NoncurrentVersionExpiration のプロパティを使うように変更する
// 現状のプロパティ
{
enabled: true,
prefix: "usr_",
noncurrentVersionExpiration: Duration.days(1),
expiredObjectDeleteMarker: true,
abortIncompleteMultipartUploadAfter: Duration.days(1),
noncurrentVersionTransitions: [
{
transitionAfter: Duration.days(1),
noncurrentVersionsToRetain: 5,
storageClass: /* Side issue: There is no s3.StorageClass.STANDARD */
}
]
}
// こう指定できるようにする
{
enabled: true,
prefix: "usr_",
// ここを変更する
noncurrentVersionExpiration:
{
expirationAfter: Duration.days(1),
noncurrentVersionsToRetain: 5,
},
expiredObjectDeleteMarker: true,
abortIncompleteMultipartUploadAfter: Duration.days(1),
noncurrentVersionTransitions: [
{
transitionAfter: Duration.days(1),
noncurrentVersionsToRetain: 5,
storageClass: /* Side issue: There is no s3.StorageClass.STANDARD */
}
]
}
プルリク作成
対応内容が整理できたので、実装してプルリクを作成しました。
以下が各コミットで対応した内容です。
- 最初のコミット
- https://github.com/aws/aws-cdk/pull/20348/commits/0967b62c78a26aae2fc63bcea957f27a833ee56c
- CDK のプロパティの追加と、CloudFormation のプロパティに変換する部分の追加・修正
- 単体テストの追加
- 2回目のコミット
- https://github.com/aws/aws-cdk/pull/20348/commits/0967b62c78a26aae2fc63bcea957f27a833ee56c
- 機能追加の対応にも関わらず
README.md
を更新せずに1回目のコミットをしてしまい CI でエラーになったので追加- 対応が必要な内容についてはコントリビューションガイドの以下の部分に記載されています
- Lifecycle Rule の機能自体のドキュメントが未対応だったので全体的にどう書くかちょっと悩みました
- このコミットのように
README.md
を更新すると↓のように公式ドキュメントに反映されます
- 3回目のコミット
- https://github.com/aws/aws-cdk/pull/20348/commits/f9c6ade34d4c820343ea718c0c915733dc5ff3cc
- Intergration test を追加
- Intergration test についてのコントリビューションガイドはこちらです
- 4回目のコミット
- https://github.com/aws/aws-cdk/pull/20348/commits/3b02c0b98701311d6aaf19e6b41fdb204744741b
- 2回目のコミットで書いたサンプルコードの書き方が不適切だったためにビルドが落ちてしまい、その部分を修正しました
- サンプルコードもコンパイルできる状態にする必要があり、宣言していない適当な変数などは使えません
- 各階層の
default.ts-fixture
で import しているモジュールが利用できます - 例:
packages/@aws-cdk/aws-s3/rosetta/default.ts-fixture
// Fixture with packages imported, but nothing else
import cdk = require('@aws-cdk/core');
import s3 = require('@aws-cdk/aws-s3');
import kms = require('@aws-cdk/aws-kms');
import iam = require('@aws-cdk/aws-iam');
import lambda = require('@aws-cdk/aws-lambda');
import s3n = require('@aws-cdk/aws-s3-notifications');
import sns = require('@aws-cdk/aws-sns');
import sqs = require('@aws-cdk/aws-sqs');
import assert = require('assert');
class Fixture extends cdk.Stack {
constructor(scope: cdk.Construct, id: string) {
super(scope, id);
/// here
}
}
マージ
- すべてのルールに沿うように実装が完了したあと、1日程度で approve されました 🎉
- メンテナ1名に approve されるとコードベースが最新化されて CI が走ったあとに自動で merge されます
まとめ
以上が CDK にコントリビュートした際の実際の流れです(あくまで一例です)。
マージされたときは達成感がありとても嬉しかったです😄
コントリビューションガイドの読み込みが足りず後から対応した部分が多くなったのは反省点です(ドキュメントちゃんと読むの大事)。
今回の Issue 対応をするにあたり公式ドキュメントやコントリビューションガイドに加え、以下の記事を参考にさせていただきました。
Discussion