AWS SAM CLIにプルリクエストを出してみた

2022.05.16

いわさです。

先日、AWS SAM CLIがアップデートされて、X-Rayトレースの有効化オプションが追加されました。

記事のさいごに書いたのですが、この機能ではLambdaのみX-Rayが有効化され、API Gatewayは対象外となっています。
そのため、Functionsリソースを使ってSAMをデプロイしても、一緒に作成されるAPI GatewayのX-Ray機能は有効化されないままです。

これについてIssueという形でフィードバックしてみたところ、「良いアイディアだ、コードはここだ」とのお返事が。

作成したIssueを見ていると、contributors/good-first-issueのラベルが追加されていました。
このラベルは、初めてのコントリビュートに適切なIssueであることを示すラベルです。

そこで、今回はプルリクエストを出すところまでやってみることにしました。

どういう変更を行ったかについてはプルリクエストを見て頂ければわかるので触れないですが、この記事ではSAM CLIのコードを修正し、テストを行い、プルリクエストを送るおおまかな流れを紹介します。

やること

外部のリポジトリへプルリクエストを出すまでの流れは以下の記事にまとめられています。

そして、SAM CLIのリポジトリは以下です。

SAM CLIのコントリビュート方法を確認する

Contributing Guidelinesでは、このリポジトリでのコントリビュートに関連する流れや注意事項・お作法などが記載されています。
これは初めによく読んでおきます。といってもボリュームはさほど多くないです。
プルリクエストの作成に取り組む前にまず実施すべきことなどが記載されています。

Development Guideにはこのリポジトリで開発・テストに必要な情報がほぼまとまっています。こちらは事前に読むというより、開発しながらフェーズ毎に読むと良いと思います。
開発環境の作成方法からテストの実施方法、プルリクエスト前に実施するmakeなどなど。
自動化されている部分がこの手順に従うだけで実行されるので、コードの実装とテストだけに集中出来ます。

フォークして自分のリポジトリで開発とテストを行う

基本的なローカル開発の流れ(フォークしてコードを修正する部分)は他のリポジトリと同じなので割愛します。

SAM CLIはPythonで開発されたツールで、本日時点ではPython3.7と3.8をサポートしています。
Python環境の作成が必要なのですが、Development Guideに従ってpyenvをセットアップしました。
セットアップ後にバージョン番号を変更するだけですが、簡単な修正をすぐに試すことが出来ます。

(samcli38) hoge@fuga aws-sam-cli % make init
SAM_CLI_DEV=1 pip install -e '.[dev]'
Obtaining file:///Users/iwasa.takahito/src/aws-sam-cli
:
(samcli38) hoge@fuga aws-sam-cli % echo '__version__ = "123.456.789"' >> samcli/__init__.py
(samcli38) hoge@fuga aws-sam-cli % samdev --version
SAM CLI, version 123.456.789

samdevへすぐに修正した内容が反映されるので、開発とテストを進めていきます。
テストはmake testで実施出来ます。こちら、テストカバレッジ95%が基準になっているのですが、一部テストがdocker環境が必要なので起動しておきましょう。

ちなみに、Makefileは以下のようになっていて、単体テスト・結合テスト・プルリクエスト送信前のチェックなど実施出来ます。
このあたりもDevelopment Guideにどういう時に何を実行するかは記載されています。

Makefile

# Default value for environment variable. Can be overridden by setting the
# environment variable.
SAM_CLI_TELEMETRY ?= 0

init:
	SAM_CLI_DEV=1 pip install -e '.[dev]'

test:
	# Run unit tests
	# Fail if coverage falls below 95%
	pytest --cov samcli --cov-report term-missing --cov-fail-under 95 tests/unit

test-cov-report:
	# Run unit tests with html coverage report
	pytest --cov samcli --cov-report html --cov-fail-under 95 tests/unit

integ-test:
	# Integration tests don't need code coverage
	@echo Telemetry Status: $(SAM_CLI_TELEMETRY)
	SAM_CLI_DEV=1 pytest tests/integration

func-test:
	# Verify function test coverage only for `samcli.local` package
	@echo Telemetry Status: $(SAM_CLI_TELEMETRY)
	pytest --cov samcli.local --cov samcli.commands.local --cov-report term-missing tests/functional

regres-test:
	@echo Telemetry Status: $(SAM_CLI_TELEMETRY)
	SAM_CLI_DEV=1 pytest tests/regression

smoke-test:
	# Smoke tests run in parallel
	SAM_CLI_DEV=1 pytest -n 4 tests/smoke

lint:
	# Linter performs static analysis to catch latent bugs
	pylint --rcfile .pylintrc samcli
	# mypy performs type check
	mypy setup.py samcli tests

# Command to run everytime you make changes to verify everything works
dev: lint test

black:
	black setup.py samcli tests

black-check:
	black --check setup.py samcli tests

# Verifications to run before sending a pull request
pr: init dev black-check

update-reproducible-reqs:
	python3.7 -m venv venv-update-reproducible-requirements
	venv-update-reproducible-requirements/bin/pip install --upgrade pip-tools pip
	venv-update-reproducible-requirements/bin/pip install -r requirements/base.txt
	venv-update-reproducible-requirements/bin/pip-compile --generate-hashes --allow-unsafe -o requirements/reproducible-linux.txt

プルリクエストを作成する

ローカルブランチでmake prが成功したらフォーク元へのプルリクエスト作成しましょう。
プルリクエストのテンプレートに従って情報を英語で記入していきます。

チェックリストにも回答しましょう。いくつかのプルリクエストを確認しましたが、必要な項目がチェックできていれば良いようです。例えば、今回の場合だとドキュメント修正は不要な修正なので、ドキュメント修正はチェックしていないです。

プルリクエスト実施後、パイプラインが動作します。
make prが通っていれば成功するはずですが、私の時は基盤のAppVeyor側で429 Too Many Requestsが発生していました。
こちらは、時間を変えて実行することで、パスすることが出来ました。

SAM CLIの場合は2名以上のレビューアーの承認が必要です。
プルリクエスト上で何度かやり取りをして承認をしてもらいました。

なお、レビューの過程では少し時差を感じました。
日本の深夜に微修正のコミットを頂いたりして、靴屋の妖精みたいな...

さいごに

この記事で、SAM CLIのリポジトリへ修正をしてプルリクエストを行うまでの流れを紹介させて頂きました。
Development Guideに従って開発環境用意してmakeコマンド使うだけでPR作成まで簡単に進めます。想定よりだいぶ簡単だったので、SAM CLIで修正したい点がある方は是非気軽にコントリビュートしてみてください。

さいごに、今回作成したプルリクエストはこちらになります。
マージされたプルリクエストがどこかでアップデートとして配布されるのかよくわかってないのですが、配布されたら自分でアップデート記事として紹介出来たらおもしろいなぁなんて思いました。