Как выполнить развертывание 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
чтобы сделать это как часть развертывания стека. Он создает настраиваемый ресурс, который копирует данные в корзину из ваших активов или из другой корзины. У него не будет собственного шага в конвейере, и он создаст под капотом лямбда-функцию, но его проще использовать.