完成物
前回までの記事で書いたパイプラインにスナップショットテストの工程を追加したいと思います
実現させたい動きとしては
- ローカルでスナップショットを実行して内容に問題がなかったら'npm test -- -u'で更新する
- 変更をmainにプッシュ
- GitHubActionsによってS3にソースコードをアップロード
- S3の変更をトリガーとしてパイプライン起動
- Buildの部分でテストを実行。1の工程を忘れていたらデプロイさせないようにする
- テストが通ったらデプロイ実行
実際のコード
公式を見ると「テストステージ」として追加する機能としてはなさそうだったので、既存のステージに対してステップを追加する形で追加する必要がありました。
他に参考になりそうな記事もなかったのでその方針で実装することにしました。
lib/stacks/pipeline.stack.ts
// CodePipeline、CodeBuildの作成。S3バケットをソースとしたパイプラインの構築
const pipeline = new CodePipeline(this, 'PipelineName', {
pipelineName: 'CdkPipelineName',
synth: new ShellStep('Synth', {
input: CodePipelineSource.s3(bucket, 'source-code.zip'),
commands: [
'npm ci',
'npm run build',
'npx cdk synth'
],
}),
});
// テストステップを新しく作成
const testStep = new ShellStep('RunTests', {
commands: [
'npm install',
'npm test'
]
});
// デプロイステージにテストステップの工程を追加する
pipeline.addStage(deployStage, {
pre: [testStep], //ここを追記。ステージの事前アクションとしてステップを追加した。
});
}
ここについて
パイプラインの各フェーズ(ビルド、テスト、デプロイなど)が異なる独自の仮想環境なのでnpm installしないと、「jestがないよ」とエラーになりました。
// テストステップ
const testStep = new ShellStep('RunTests', {
commands: [
'npm install',
'npm test'
]
});
実際の挙動
きちんとスナップショットテストを更新せずにデプロイしようとしてもデプロイされません。
詳細を表示によって、どこで落ちたのかも確認することができます。