CodePipelineでCodeCommitとCodeBuildを利用してはまる
CodePipeline、CodeCommit、CodeBuildで遊んでみたのですが、CodePipeline利用するときにハマったのでメモ。
前提
- 最初CodePipelineを利用せずに、CodeCommitとCodeBuildでBuildできるか等々試していた
- CodeBuildで利用してた
buildspec.yml
はこんな感じ- やっていることはdocker buildしてECRに突っ込んでいるだけ
- イメージのタグとして、commit idを利用している
- CodePipelineを使わない状況では上手く動いていた
version: 0.2 phases: pre_build: commands: - echo "Login to Amazon ECR" - aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com - IMAGE_TAG=$(git rev-parse --short HEAD) - echo "IMAGE_TAG=${IMAGE_TAG}" build: commands: - echo "Build started in $(date)" - echo "Building a docker image..." - docker build -t ${IMAGE_REPO_NAME}:${IMAGE_TAG} . - docker tag ${IMAGE_REPO_NAME}:${IMAGE_TAG} ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${IMAGE_TAG} - docker tag ${IMAGE_REPO_NAME}:${IMAGE_TAG} ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:latest post_build: commands: - echo "Build completed in $(date)" - echo "Pushing the docker image..." - docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${IMAGE_TAG} - docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:latest
問題
CodePipelineを利用して、Pipelineを作成
- Source Stage --> CodeCommit
- Build Stage --> CodeBuild
CodeBuildでエラー
- どうやらgitリポジトリじゃないらしい
[Container] Running command aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [Container] Running command IMAGE_TAG=$(git rev-parse --short HEAD) fatal: not a git repository (or any parent up to mount point /codebuild) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
結果
- いろいろ調べた結果、どうも source stageのartifactはgitリポジトリでなくなるらしい
- .gitがなかった
- じゃあcommit idどうやって取るの?と思って調べてみたら
CODEBUILD_RESOLVED_SOURCE_VERSION
が求めているものっぽいので、そちらを利用するように変更
version: 0.2 phases: pre_build: commands: - echo "Login to Amazon ECR" - aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com - COMMIT_HASH=$(echo ${CODEBUILD_RESOLVED_SOURCE_VERSION} | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH} build: commands: - echo "Build started in $(date)" - echo "Building a docker image..." - docker build -t ${IMAGE_REPO_NAME}:${IMAGE_TAG} . - docker tag ${IMAGE_REPO_NAME}:${IMAGE_TAG} ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${IMAGE_TAG} - docker tag ${IMAGE_REPO_NAME}:${IMAGE_TAG} ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:latest post_build: commands: - echo "Build completed in $(date)" - echo "Pushing the docker image..." - docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${IMAGE_TAG} - docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:latest
エラー出ずに動きましたとさ。