Как выполнить развертывание S3 с современной версией CodePipeline

Я пытаюсь настроить новый конвейер с последней версией AWS CDK для машинописного текста (1.128).

Создание конвейера довольно простое. Я без проблем добавил исходники и этапы сборки. Цель здесь - автоматическое развертывание статической целевой страницы.

Пока у меня есть этот фрагмент кода:

              const landingPageStep = new ShellStep(`${PREFIX}LandingPageCodeBuildStep`, {
            input: CodePipelineSource.connection(`${GIT_ORG}/vicinialandingpage`, GIT_MAIN, {
                connectionArn: GIT_CONNECTION_ARN, // Created using the AWS console
            }),
            installCommands: [
                'npm ci',
            ],
            commands: [
                'npm run build',
            ],
            primaryOutputDirectory: 'out',
        })

        const pipeline = new CodePipeline(this, `${PREFIX}Pipeline`, {
            pipelineName: `${PREFIX}Pipeline`,
            synth: new ShellStep(`${PREFIX}Synth`, {
                input: CodePipelineSource.connection(`${GIT_ORG}/viciniacdk`, GIT_MAIN, {
                    connectionArn: GIT_CONNECTION_ARN, // Created using the AWS console
                    }),
                commands: [
                    'npm ci',
                    'npm run build',
                    'npx cdk synth',
                ],
                additionalInputs: {
                    'landing_page': landingPageStep,
                },
            }),
        });

Шаг, на котором я не уверен, как этого добиться, - это как развернуть на S3, используя вывод "landing_page". В предыдущих версиях Pipelines интенсивно использовались объекты Artifacts и CodePipelineActions, что-то похожее на это, где sourceOutput является объектом Artifact:

          const targetBucket = new s3.Bucket(this, 'MyBucket', {});

    const pipeline = new codepipeline.Pipeline(this, 'MyPipeline');
    const deployAction = new codepipeline_actions.S3DeployAction({
        actionName: 'S3Deploy',
        stage: deployStage,
        bucket: targetBucket,
        input: sourceOutput,
    });
    const deployStage = pipeline.addStage({
        stageName: 'Deploy',
        actions: [deployAction],
    });

Теперь все по-другому, так как у вас есть доступ к объектам FileSet, и, очевидно, шаги сборки предназначены для использования при вложении выходных данных, как в примере выше. Каждый выходной файл сохраняется в корзине с уродливыми именами файлов, поэтому он также не предназначен для прямого доступа.

Я видел несколько хитрых подходов, заменяющих ShellStep на CodeBuildStep и использующих в качестве команды postbuild в файле buildspec.yml что-то вроде этого:

      aws s3 sync out s3://cicd-codebuild-static-website/

Но он решается на этапе сборки, а не на этапе развертывания, где он будет идеальным существовать.

Я не нашел ничего интересного в документации, поэтому любые предложения приветствуются. Спасибо!

1 ответ

Вы можете продлить Step и реализовать ICodePipelineActionFactory. Это интерфейс, который получаетcodepipeline.IStage и добавляет любые действия, которые вам нужно добавить.

Когда у вас есть заводской шаг, вы передаете его как pre или post варианты addStage() вариант метода.

Что-то близкое к следующему должно работать:

      class S3DeployStep extends Step implements ICodePipelineActionFactory {
  constructor(private readonly provider: codepipeline_actions.JenkinsProvider, private readonly input: FileSet) {
  }

  public produceAction(stage: codepipeline.IStage, options: ProduceActionOptions): CodePipelineActionFactoryResult {

    stage.addAction(new codepipeline_actions.S3DeployAction({
        actionName: 'S3Deploy',
        stage: deployStage,
        bucket: targetBucket,
        input: sourceOutput,
    }));

    return { runOrdersConsumed: 1 };
  }
}

// ...

pipeline.addStage(stage, {post: [new S3DeployStep()]});

Но более простой способ - использовать BucketDeploymentчтобы сделать это как часть развертывания стека. Он создает настраиваемый ресурс, который копирует данные в корзину из ваших активов или из другой корзины. У него не будет собственного шага в конвейере, и он создаст под капотом лямбда-функцию, но его проще использовать.

Другие вопросы по тегам