Custom Build Environments

CodeBuild除了支持Java,Ruby,Python,Go,Docker等环境的编译外,还可以通过自定义编译环境来支持更多的语言

编译环境(Build environments)是一个Docker镜像,里面包括了编译和测试项目代码的所有工具。为了在CodeBuild中使用自定义编译环境,我们需要:

  1. 打包一个镜像,里面包括平台所有编译的工具
  2. 将镜像上传到ECR
  3. 在CodeBuild的项目中使用这个镜像

本节将创建一个PHP的编译环境,并在CodeBuild中使用它来完成项目的构建及测试

创建ECR和CodeCommit仓库

拉取项目代码:

git clone https://github.com/awslabs/codebuild-images.git
cd codebuild-images

创建CloudFormation stack:

aws cloudformation create-stack \
 --stack-name codebuild-php \
 --parameters ParameterKey=EnvName,ParameterValue=php \
 --template-body file://template.yml > /dev/null && \
aws cloudformation wait stack-create-complete \
 --stack-name codebuild-php && \
aws cloudformation describe-stacks \
 --stack-name codebuild-php \
 --output table \
 --query Stacks[0].Outputs

创建完成后,将输出以下两个资源:

  • BuildImageRepositoryUri: 用于存放Custom Build Environments的镜像
  • SourceCodeRepositoryCloneUrl: 存放PHP项目的代码

构建并上传Docker镜像

下面的Dockerfile包括了PHP构建环境所需要的工具:

FROM php:7.4-apache


ENV COMPOSER_ALLOW_SUPERUSER=1
ENV PATH=$PATH:vendor/bin

RUN apt-get update && apt-get install -y --no-install-recommends \
      curl \
      git \
      python-dev \
      python3-pip \
      libzip-dev \
      zlib1g-dev \
 && pip install awscli \
 && docker-php-ext-install zip \
 &&  curl -o - https://getcomposer.org/composer-stable.phar > /usr/local/bin/composer  && chmod 755 /usr/local/bin/composer  # curl -o installer "$composer_url" \

# && echo "$composer_checksum *installer" \
 && php installer --install-dir=/usr/local/bin --filename=composer \
 && rm -rf /var/lib/apt/lists/*

接下来构建镜像并push到ECR中。先登录到ECR:

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 145197526627.dkr.ecr.us-west-2.amazonaws.com

使用CloudFormation输出的ECR仓库地址(BuildImageRepositoryUri) 作为标签,上传到ECR:

cd php
docker build -t [BuildImageRepositoryUri] .
docker push [BuildImageRepositoryUri]

将项目上传到CodeCommit

之前克隆的仓库是一个简单的php应用,它将罗马数字转换为阿拉伯数字,并包括了一个单元测试文件:

image-20230810094323719

它还有一个buildspec.yaml文件,指定了CodeBuild构建项目时要执行的命令:

version: 0.1
phases:
  pre_build:
    commands:
      - composer install
  build:
    commands:
      - phpunit tests

build spec指定了CodeBuild在编译过程中运行两个命令:

  • composer install :提前安装所需的依赖,比如PHPUnit

    image-20230810094213797

  • phpunit tests 在构建过程中,运行单元测试

我们把整个项目上传到CodeCommit仓库中:

cd sample
git init

# Add and commit the sample files to the repository
git add .
git commit -m "Initial commit"

# Configure the git remote and push the sample to it. 
git remote add origin [SourceCodeRepositoryCloneUrl]
git push origin master

现在我们就可以创建一个CodeBuild的项目来开启构建了

配置CodeBuild环境

在这一部分,我们将配置CodeBuild来使用我们自定义的构建环境。

在控制台上进入CodeBuild服务,创建一个新的项目:

image-20230810095704972

在Source Provider部分,选择codecommit,并选择之前创建的codebuild-sample-php仓库:

image-20230810095753564

Environment image部分,选择Custom image,选择codebuild/php仓库,版本选择latest

image-20230810095926788

Build specification部分, 选择 Use the buildspec.yml,既codecommit仓库根目录下的buildspec.yaml文件。在 Artifacts type部分选择 No artifacts

image-20230810100121753

最后点击Create Build Project

创建完成后,点击Start Build

image-20230810100428998

在控制台中能看到每一步的结果:

image-20230810100542434

总结

通过custom build environments, CodeBuild可以支持更多的编译语言和运行环境