AWS 使用 CodeBuild 进行云端构建

CodeBuild

了解 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 镜像

外部提供的环境变量

外部提供的环境变量将会覆盖预配置的环境变量,生效顺序如下:

  1. 发起构建操作时提供的变量值
  2. 构建项目定义的变量值
  3. 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 已完成

其中 * 标示的可自定义,! 标示的可以配置。

如图所示:

CodeBuild 的构建阶段

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 来进行构建了。

官方文档在撰文之时仍未汉化,如欲了解请 点击这里

祝大家使用愉快。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容