Codebuild Workflow с переменными среды - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть монолитный проект 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 не выглядит должным образом.

1 Ответ

0 голосов
/ 17 апреля 2019

В репозиториях с управлением исходным кодом, таких как Github, можно настроить отправку события post конечной точке API при отправке в филиал.Вы можете использовать этот пост-запрос в лямбде через API-шлюз.Эти данные события включают в себя, какие файлы были изменены с фиксацией.Затем лямбда-функция может обработать это событие, чтобы выяснить, что следует развернуть.Если вам не удается развернуть на своих серверах из контейнера codebuild, вы можете попробовать опубликовать артефакт на s3 с помощью устанавливаемого пакета, а затем попросить сервер взять его оттуда.

...