了解 CodeBuild
AWS CodeBuild 是一项完全托管的构建服务,无需管理和扩展自己的构建服务器,并与 AWS 的其他服务紧密结合,能够将日志上传到 CloudWatch Logs、从 CodeCommit 拉取输入、融入 CodePipeline 工作流、将构件输出到 S3 等。
CodeBuild 可持续扩展并同时处理多项构建任务,且只需要按使用计算资源的分钟数付费。
通过 Jenkins 插件,还可以将 CodeBuild 作为现有 Jenkins 服务的工作节点。
角色
AWS 的权限体系建立在 IAM 角色的基础上,CodeBuild 也不例外。你需要指定 CodeBuild 的角色,并赋予相应的访问权限。
如:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
]
},
{
"Effect": "Allow",
"Resource": [
"arn:aws:codecommit:*:*:*"
],
"Action": [
"codecommit:GitPull"
]
},
{
"Effect": "Allow",
"Resource": [
"arn:aws:s3:*:*:*"
],
"Action": [
"s3:PutObject"
]
}
]
}
这将允许向 CloudWatch Logs 创建日志组、日志流、写日志事件,允许从 CodeCommit 抓取源码,允许向 S3 写入对象。
根据你的需要,角色的权限也会不一样。
输入源
可以选择从 CodeCommit 代码仓库、S3 存储桶上的 zip 压缩包、GitHub 代码仓库之一作为输入源。
压缩包会被自动解压缩。输入的根目录即构建时的当前目录。
环境
CodeBuild 采用的是 Docker 镜像,具体请参考 CodeBuild 提供的 Docker 镜像。
外部提供的环境变量
外部提供的环境变量将会覆盖预配置的环境变量,生效顺序如下:
- 发起构建操作时提供的变量值
- 构建项目定义的变量值
- buildspec 文件中定义的变量值
不要以 CODEBUILD_
开头命名环境变量,这个由 AWS 内部保留使用。
不要在环境变量中使用环境变量本身,如不能给 PATH 赋值 $PATH:/path
,因为环境变量不会被展开,PATH 的值将为字面量 $PATH:/path
。但可以使用其他替代符号,如给 PATH 赋值 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/tools:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
,因为在使用时它会被展开。
构建阶段(Parse)
一次 CodeBuild 构建的生命周期分为多个阶段:
- SUBMITTED 构建请求已提交
- ! PROVISIONING 准备构建环境
- DOWNLOAD_SOURCE 下载输入源
- * INSTALL 安装构建工具
- * PRE_BUILD 构建前
- * BUILD 构建
- * POST_BUILD 构建后
- ! UPLOAD_ARTIFACTS 上传构件
- FINALIZING 最终确定
- COMPLETED 已完成
其中 * 标示的可自定义,! 标示的可以配置。
如图所示:
buildspec 文件
buildspec 文件包含了一系列的配置和命令,用于处理输入,得到输出。该文件必须在输入的根目录,命名为 buildspec.yml
,格式为 YAML。
version: 0.1
environment_variables:
plaintext:
key: "value"
key: "value"
phases:
install:
commands:
- command
- command
pre_build:
commands:
- command
- command
build:
commands:
- command
- command
post_build:
commands:
- command
- command
artifacts:
files:
- file # 当前目录(输入的根目录)下的文件
- dir/file # 子目录下的文件
- dir/* # 子目录下的所有文件
- recursive-dir/**/* # 子目录下的所有文件夹和文件
discard-paths: no
注意 YAML 格式的要求十分严格,谨慎检查你的语法,尤其是缩进。
environment_variables 指定了环境变量。
phases 指定了各个构建过程将要执行的命令。你可以通过指定运行其他 shell 脚本,来获取完全的自定义能力。
artifacts 指定了要输出的文件(files),和是否放弃路径结构(discard-paths)。如果 discard-paths 为 yes 则所有来自子目录的文件将会被移到输出目录的根目录。
构件(Artifact)
默认会将构件用 zip 打包后上传到 S3 存储桶。
项目(Project)
以上所述都是细节,而 CodeBuild 按项目来管理构建,一个项目需要指定输入源、构建环境、构建环境的硬件配置、构建时限、是否有构件要输出到 S3、IAM 角色、环境变量等配置。
现在你可以编写自己的 buildspec 文件,然后使用 AWS 控制台、aws-cli、AWS SDK 和 CodePipeline 来进行构建了。
官方文档在撰文之时仍未汉化,如欲了解请 点击这里。
祝大家使用愉快。