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



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

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

通过在构建过程中的某些点更新环境变量,然后在单独的步骤中读取它们,我设法在本地主机上工作。但是,由于权限问题,这在 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

举个例子,这是我diff每个项目版本以确定是否需要更新的01_install.sh(请原谅 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 deploys3cli 命令,因为 codebuild 似乎没有安装 eb cli,我的.ebextensions文件似乎没有得到尊重。

可以将 Github 等源代码管理存储库配置为在推送到分支时将发布事件发送到 API 终结点。您可以通过 API 网关在 lambda 中使用此发布请求。此事件数据包括使用提交修改了哪些文件。然后,lambda 函数可以处理此事件以确定要部署的内容。 如果您在从 codebuild 容器部署到服务器时遇到困难,您可能需要尝试使用可安装包将工件发布到 s3,然后让您的服务器从那里获取它。

最新更新