#amazon-web-services #continuous-integration #continuous-deployment #aws-cdk #aws-codepipeline
Вопрос:
Я использую AWS CDK с typescript и хотел бы автоматизировать развертывание пакетов CDK и кода.
У меня есть 2 репозитория на github: app-cdk
и app-website
.
Я настроил кодовую линию следующим образом:
const pipeline = new CodePipeline(this, 'MyAppPipeline', { pipelineName: 'MyAppPipeline', synth: new ShellStep('Synth', { input: CodePipelineSource.gitHub(`${ORG_NAME}/app-cdk`, BRANCH_NAME, { }), commands: ['npm ci', 'npm run build', 'npx cdk synth'] }) });
и добавил бета — стадию следующим образом
pipeline.addStage(new MyAppStage(this, 'Beta', { env: {account: 'XXXXXXXXX', region: 'us-east-2' } }))
Это прекрасно работает, когда я отправляю код в свой пакет кода CDK и развертываю новые ресурсы. Как я могу добавить репо своего веб-сайта в качестве источника для запуска этого конвейера, построить его по-другому и развернуть активы в необходимых ресурсах? Разве это не должно быть частью исходных текстов и этапов сборки CodePipeline?
Комментарии:
1. Если я правильно понимаю, я думаю, вам нужны два конвейера CodePipeline, которые независимо отслеживают изменения в двух репозиториях. Чтобы фактически развернуть изменения, вы должны расширить шаг оболочки (или создать новый), включив в него «развертывание npx cdk».
2. @Norman Может ли это быть не один трубопровод? Что сначала самоизменится и развернет все необходимые ресурсы AWS, а затем развернет само приложение?
3. Вы можете добавить в конвейер несколько источников, точно так же, как вы добавили бы любое другое действие.
4. Как я могу связать этот новый источник с другим действием сборки? Не синтезатор cdk, а сборка npm? Не похоже, что API CodePipeline обеспечивает это
5. Трубопровод всегда делает одно и то же. Я бы сказал, что вам нужна другая логика, вам нужен другой конвейер. То, о чем я говорил, — это один конвейер с двумя источниками, который выполняет как сборку npm, так и синтез cdk
Ответ №1:
Я столкнулся с аналогичным сценарием, когда мне пришлось создать конвейер CDK для нескольких статических сайтов S3 в репозитории.
Вскоре стало очевидно, что это должно было быть сделано с использованием двух стеков, так как конвейер требует, чтобы шаг имел тип Stage и не поддерживал конструкцию.
В то время как мои статические веб-сайты S3 были конструкцией (BucketDeployment).
Способ, которым я справился с этой интеграцией, заключается в следующем
deployment_code_build = cb.Project(self, 'PartnerS3deployment', project_name='PartnerStaticS3deployment', source=cb.Source.git_hub(owner='lt;github-orggt;', repo='lt;repo-namegt;', clone_depth=1, webhook_filters=[ cb.FilterGroup.in_event_of( cb.EventAction.PUSH).and_branch_is( branch_name="main")]), environment=cb.BuildEnvironment( build_image=cb.LinuxBuildImage.STANDARD_5_0 ))
Это добавило/подготовило проект сборки кода, который будет динамически развертывать наборы изменений cdk ls
Для вышеупомянутого проекта сборки кода потребуется файл buildspecfile в корневом каталоге репозитория со следующим кодом (для справки)
version: 0.2 phases: install: commands: - echo Entered in install phase... - npm install -g aws-cdk - cdk --version build: commands: - pwd - cd cdk_pipeline_static_websites - ls -lah - python -m pip install -r requirements.txt - nohup ./parallel_deploy.sh amp; echo $! gt; pidfile amp;amp; wait $(cat pidfile) finally: - echo Build completed on `date`
Содержимое parallel_deploy.они заключаются в следующем
#!/bin/bash for stack in $(cdk list); do cdk deploy $stack --require-approval=never amp; done;
Хотя это отлично работает, должна быть более простая альтернатива, которая может напрямую импортировать другие стеки/конструкции в класс конвейера CDK.