У меня есть монолитный проект 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
проект развертывается на эластичном бобовом стебле, а мой REACTAPP
развертывается в виде статических файлов на S3.Я попробовал несколько вещей, но решил, что единственный жизнеспособный подход - это вручную выполнить этот шаг deploy
в моем собственном 03_build.sh
скрипте - потому что нет способа построить это динамически в шаге Deploy Codebuild (я могу ошибаться).
В любом случае, моя проблема заключается в том, что мне по сути нужно создать дерево решений, чтобы определить, какой проект исполняется, поэтому, если я внесу изменение в API и отправлю его, он автоматически не развернет REACTAPP на S3 без необходимости (иvica versa).
Мне удалось заставить это работать на локальном хосте, обновляя переменные окружения в определенных точках процесса сборки и затем читая их в отдельных шагах.Однако это не удается на Codedeploy из-за проблем с разрешениями, т.е. я не могу обновить переменные env из самого процесса 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
Я запускаю свои собственные сценарии оболочки для выполнения некоторой логики и пытаюсь передавать переменные между сценариями: 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 deploy
и s3
cli в сценариях сборки, так как codebuild, похоже, не поставляется с установленным eb cli, и мой файл .ebextensions
не выглядит должным образом.