具有环境变量的Codebuild工作流

时间:2019-04-09 10:21:41

标签: bash continuous-integration devops continuous-deployment aws-codebuild

我有一个完整的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项目已部署到弹性beantalk,而我的REACTAPP已作为静态文件部署到S3。我做了一些尝试,但决定唯一可行的方法是在自己的deploy脚本中手动执行此03_build.sh步骤-因为无法在Codebuild的Deploy步骤中动态构建此步骤(我可以是错误的。)

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

我设法通过在构建过程中的某些点更新环境变量,然后在单独的步骤中读取它们,来在localhost上实现此功能。但是由于权限问题,这在Codedeploy上失败了,即我似乎无法从CI进程本身内部更新env变量。

明确地,我的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文件确实似乎不被兑现。

1 个答案:

答案 0 :(得分:0)

Source control repos like Github can be configured to send a post event to an API endpoint when you push to a branch. You can consume this post request in lambda through API Gateway. This event data includes which files were modified with the commit. The lambda function can then process this event to figure out what to deploy. If you’re struggling with deploying to your servers from the codebuild container, you might want to try posting an artifact to s3 with an installable package and then have your server grab it from there.