带环境变量的代码构建工作流

Codebuild Workflow with environment variables

我有一个整体式 github 项目,其中有多个不同的应用程序,我想将它们与 AWS Codebuild CI/CD 工作流集成。我的问题是,如果我对一个项目进行了更改,我不想更新另一个项目。本质上,我想创建一个逻辑分支,它根据在特定提交中更改的文件进行不同的部署。

基本上我的项目库是这样的:

- API
  -node_modules
  -package.json
  -dist
  -src
- REACTAPP
  -node_modules
  -package.json
  -dist
  -src
- scripts
  - 01_install.sh
  - 02_prebuild.sh
  - 03_build.sh
- .ebextensions

在部署方面,我的 API 项目被部署到 elastic beanstalk,我的 REACTAPP 项目作为静态文件部署到 S3。我已经尝试了一些东西,但决定唯一可行的方法是在我自己的 03_build.sh 脚本中手动执行此 deploy 步骤 - 因为无法在 Codebuild 的 Deploy 步骤中动态构建它(我可以错了)。

无论如何,我的问题是我基本上需要创建一个决策树来确定执行哪个项目,所以如果我对 API 进行更改并推送,它不会自动将 REACTAPP 部署到 S3 unnecessarliy(反之亦然)。

我设法通过在构建过程中的某些点更新环境变量然后在单独的步骤中读取它们来使它在本地主机上工作。但是,由于权限问题,这在 Codedeploy 上失败了,即我似乎无法从 CI 进程本身更新环境变量。

明确地说,我的 buildconf.yml 看起来像这样:

version: 0.2

env:
  variables:
    VARIABLES: 'here'
    AWS_ACCESS_KEY_ID: 'XXXX'
    AWS_SECRET_ACCESS_KEY: 'XXXX'
    AWS_REGION: 'eu-west-1'
    AWS_BUCKET: 'mybucket'
phases:
  install:
    commands:
      - sh ./scripts/01_install.sh
  pre_build:
    commands:
      - sh ./scripts/02_prebuild.sh
  build:
    commands:
      - sh ./scripts/03_build.sh

我正在 运行我自己的 shell 脚本来执行一些逻辑,我正在尝试在脚本之间传递变量:install->prebuild->build

举个例子,这里是01_install.sh,其中我diff每个项目版本来判断是否需要更新(请原谅bash中的任何小错误):

#!/bin/bash

# STAGE 1
# _______________________________________
# API PROJECT INSTALL
# Do if API version was changed in prepush (this is just a sample and I'll likely end up storing the version & previous version within the package.json):

if [[ diff ./api/version.json ./api/old_version.json ]] > /dev/null 2>&1
## then
echo " Installing dependencies in API folder..."
cd ./api/ && npm install

## Set a variable to be used by the 02_prebuild.sh script
TEST_API="true"
export TEST_API
else
 echo "No change to API"
fi

# ______________________________________
# REACTAPP PROJECT INSTALL

# Do if REACTAPP version number has changed (similar to above):
...

然后在我的下一阶段,我读取这些变量以确定我是否应该 运行 测试项目 02_prebuild.sh:

#!/bin/bash

# STAGE 2
# _________________________________
# API PROJECT PRE-BUILD
# Do if install was initiated
if [[ $TEST_API == "true" ]]; then
    echo " Run tests on API project..."
    cd ./api/ && npm run tests
    echo $TEST_API
    BUILD_API="true"
    export BUILD_API
else
   echo "Don't test API"
fi

# ________________________________
# TODO: Complete for REACTAPP, similar to above
...

在我的最终脚本中,我使用 BUILD_API 变量构建到 dist 文件夹,然后我将其部署到 Elastic Beanstalk(对于 API)或 S3(对于 REACTAPP ).

当我 运行 在本地工作时,但是当我在 Codebuild 上 运行 时,我得到了权限失败,大概是因为我的 bash 脚本不能 export ENV_VAR。我想知道是否有人知道如何从构建过程本身更新 ENV_VARIABLES,或者是否有人有更好的方法来实现我的目标(Codebuild 上的条件/变量构建过程)

编辑: 因此,我设法开始工作的一种方法是不使用 Env 变量,而是使用 fs 创建具有特定名称的新文件,然后读取文件的内容以做出合乎逻辑的决定。我可以从每个 bash 脚本访问这些文件,因此它可以通过一些自动清理非常优雅地工作。

我不会编辑原始问题,因为它仍然是一个问题,我想知道其他人如何/是否解决了这个问题。我仍在研究如何在构建脚本中实际使用 eb deploys3 cli 命令,因为 codebuild 似乎没有安装 eb cli 而我的 .ebextensions 文件有似乎没有受到尊重。

像 Github 这样的源代码控制回购可以配置为在推送到分支时将 post 事件发送到 API 端点。您可以通过 API 网关在 lambda 中使用此 post 请求。此事件数据包括提交时修改了哪些文件。然后 lambda 函数可以处理此事件以确定要部署的内容。如果您正在努力从 codebuild 容器部署到您的服务器,您可能想尝试 post 使用可安装包将一个工件发送到 s3,然后让您的服务器从那里抓取它。