この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Step FunctionsでCodeBuildとの統合がサポートされました。
今回のアップデートにより、Lambda Functionsなどを介さず直接、CodeBuildの制御が行えるようになります。ここでは、統合でサポートされている操作の一部(StartBuild)を試してみたいと思います。
事前準備
以下ドキュメントをベースに、CodeBuild(ビルドプロジェクト)を作成しました。
やってみた
ステートマシン作成
ビルド実行を開始するだけの、もの凄いシンプルなステートマシンを作成しました。
定義は以下となります。
{
"Comment": "An example of using CodeBuild to run tests, get test results and send a notification.",
"StartAt": "Trigger CodeBuild Build",
"States": {
"Trigger CodeBuild Build": {
"Type": "Task",
"Resource": "arn:aws:states:::codebuild:startBuild.sync",
"Parameters": {
"ProjectName": "codebuild-demo-project"
},
"End": true
}
}
}
タスクにて、StartBuild APIを呼び出しています。.sync
サフィックスを追加してビルド完了まで待機する定義です。ProjectName
で、ビルド実行を開始するプロジェクトの名前を指定しています。
ステートマシンのサービスロールではCodeBuildに対する権限が必要になりますので、IAMロールに必要な権限を付与しています。以下が参考になります。
ステートマシン実行
ステートマシン実行前(ビルド実行前)に、アーティファクト出力先バケットが空であることを確認しました。
$ aws s3api list-objects --bucket codebuild-ap-northeast-1-123456789012-output-bucket
$
ステートマシンを実行します。
$ aws stepfunctions start-execution \
--state-machine-arn arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:TestCodeBuildStateMachine
{
"executionArn": "arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:execution:TestCodeBuildStateMachine:6e7af264-84e7-40e3-8447-a3c94f30616f",
"startDate": 1588747745.583
}
しばらくすると、ビルドおよびステートマシンの実行が完了しました。
ビルドプロジェクト
ステートマシン
ステートマシン実行後に、アーティファクトが出力されていることを確認しました。
$ aws s3api list-objects --bucket codebuild-ap-northeast-1-123456789012-output-bucket
{
"Contents": [
{
"Key": "codebuild-demo-project/target/messageUtil-1.0.jar",
"LastModified": "2020-05-06T06:50:58.000Z",
"ETag": "\"66774fad872c07159a15b92b885ecf4e\"",
"Size": 2127,
"StorageClass": "STANDARD",
"Owner": {
"DisplayName": "members-23841",
"ID": "1679c517d90f700d99ff6c8130d6c44eb13076f7861796180f689ab6843c45ca"
}
}
]
}
ビルドを実行したステート(ここではTrigger CodeBuild Build
)の出力を以下に添付しました。少々長いので折りたたみました。確認する際はクリックして展開してください。
Trigger CodeBuild Buildの出力
{
"SdkHttpMetadata": {
"HttpHeaders": {
"Content-Length": "3163",
"Content-Type": "application/x-amz-json-1.1",
"Date": "Wed, 06 May 2020 06:51:02 GMT",
"x-amzn-RequestId": "492dc025-497d-4562-94a9-c4ee94076b1f"
},
"HttpStatusCode": 200
},
"SdkResponseMetadata": {
"RequestId": "492dc025-497d-4562-94a9-c4ee94076b1f"
},
"Build": {
"Arn": "arn:aws:codebuild:ap-northeast-1:XXXXXXXXXXXX:build/codebuild-demo-project:d50cd497-65a8-45a6-9d66-b33d64371f65",
"Artifacts": {
"EncryptionDisabled": false,
"Location": "arn:aws:s3:::codebuild-ap-northeast-1-123456789012-output-bucket/codebuild-demo-project",
"Md5sum": "",
"OverrideArtifactName": false,
"Sha256sum": ""
},
"BuildComplete": true,
"BuildNumber": 6,
"BuildStatus": "SUCCEEDED",
"Cache": {
"Type": "NO_CACHE"
},
"CurrentPhase": "COMPLETED",
"EncryptionKey": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:alias/aws/s3",
"EndTime": 1588747858077,
"Environment": {
"ComputeType": "BUILD_GENERAL1_SMALL",
"EnvironmentVariables": [],
"Image": "aws/codebuild/amazonlinux2-x86_64-standard:2.0",
"ImagePullCredentialsType": "CODEBUILD",
"PrivilegedMode": false,
"Type": "LINUX_CONTAINER"
},
"Id": "codebuild-demo-project:d50cd497-65a8-45a6-9d66-b33d64371f65",
"Initiator": "states/TestCodeBuildStateMachine",
"Logs": {
"CloudWatchLogs": {
"Status": "DISABLED"
},
"S3Logs": {
"EncryptionDisabled": false,
"Status": "DISABLED"
}
},
"Phases": [
{
"DurationInSeconds": 0,
"EndTime": 1588747746209,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "SUBMITTED",
"StartTime": 1588747745873
},
{
"DurationInSeconds": 1,
"EndTime": 1588747747696,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "QUEUED",
"StartTime": 1588747746209
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 42,
"EndTime": 1588747790221,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "PROVISIONING",
"StartTime": 1588747747696
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 1,
"EndTime": 1588747791563,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "DOWNLOAD_SOURCE",
"StartTime": 1588747790221
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 0,
"EndTime": 1588747791608,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "INSTALL",
"StartTime": 1588747791563
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 0,
"EndTime": 1588747791656,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "PRE_BUILD",
"StartTime": 1588747791608
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 66,
"EndTime": 1588747857796,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "BUILD",
"StartTime": 1588747791656
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 0,
"EndTime": 1588747857841,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "POST_BUILD",
"StartTime": 1588747857796
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 0,
"EndTime": 1588747858026,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "UPLOAD_ARTIFACTS",
"StartTime": 1588747857841
},
{
"Contexts": [
{
"Message": "",
"StatusCode": ""
}
],
"DurationInSeconds": 0,
"EndTime": 1588747858077,
"PhaseStatus": "SUCCEEDED",
"PhaseType": "FINALIZING",
"StartTime": 1588747858026
},
{
"PhaseType": "COMPLETED",
"StartTime": 1588747858077
}
],
"ProjectName": "codebuild-demo-project",
"QueuedTimeoutInMinutes": 480,
"SecondaryArtifacts": [],
"SecondarySourceVersions": [],
"SecondarySources": [],
"ServiceRole": "arn:aws:iam::XXXXXXXXXXXX:role/service-role/codebuild-codebuild-demo-project-service-role",
"Source": {
"InsecureSsl": false,
"Location": "codebuild-ap-northeast-1-123456789012-input-bucket/MessageUtil.zip",
"Type": "S3"
},
"StartTime": 1588747745873,
"TimeoutInMinutes": 60
}
}
さいごに
今回は一部のAPIしか利用しませんでしたが、CodeBuild向けにサポートされているAPIは複数あります。
ビルドの定期実行や、テスト結果に応じたアクションなど、ステートマシン側で処理することにより、カスタマイズや作り込みの簡素化などが期待できそうですね。