typescript - AWS CDK-pipelinekonstruktion: Codebuild-fel 254
Jag är ganska ny på AWS CDK och jag försöker följa handledningen här gällande Cdk Pipeline-konstruktionen för att bygga min egen pipeline https://docs.aws.amazon.com/cdk/latest/guide/cdk_pipeline.html
Jag försökte börja med att skapa en enkel pipeline (se koden nedan) - men jag får hela tiden felet i CodeBuild som säger npm ERR! enoent ENOENT: no such file or directory, open '/codebuild/output/src503090835/src/package.json'. Jag är inte helt säker på varför detta är fallet eftersom jag använder en CdkPipeline-konstruktion, så jag skapar inte en CodeBuild-resurs direkt själv.
Har någon upplevt detta tidigare och kan kasta lite ljus över det?
lib/pipeline-stack.ts
import { Stack, StackProps, Construct, SecretValue } from '@aws-cdk/core';
import { CdkPipeline, SimpleSynthAction } from '@aws-cdk/pipelines';
import * as codepipeline from '@aws-cdk/aws-codepipeline';
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions';
import { GITHUB_VALUES} from '../lib/constants'
export class PipelineStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const sourceArtifact = new codepipeline.Artifact();
const cloudAssemblyArtifact = new codepipeline.Artifact();
const pipeline = new CdkPipeline(this, 'pipeline', {
pipelineName: 'cherry-client-pipeline',
cloudAssemblyArtifact,
sourceAction: new codepipeline_actions.GitHubSourceAction({
actionName: 'GitHub',
output: sourceArtifact,
oauthToken: SecretValue.secretsManager(GITHUB_VALUES.OAUTH_TOKEN_NAME),
trigger: codepipeline_actions.GitHubTrigger.POLL,
owner: GITHUB_VALUES.OWNER,
repo: GITHUB_VALUES.REPO,
branch: 'main'
}),
synthAction: SimpleSynthAction.standardNpmSynth({
sourceArtifact,
cloudAssemblyArtifact,
buildCommand: 'npm run build'
}),
});
}
}
bin/pipeline.ts
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { PipelineStack } from '../lib/pipeline-stack';
import { ENVIRONMENTS } from '../lib/constants'
const app = new cdk.App();
new PipelineStack(app, 'pipeline-stack', {
env: ENVIRONMENTS.DEV
});
app.synth();
cdk.json
{
"app": "npx ts-node --prefer-ts-exts bin/pipeline.ts",
"context": {
"@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true,
"@aws-cdk/core:enableStackNameDuplicates": "true",
"aws-cdk:enableDiffNoFail": "true",
"@aws-cdk/core:stackRelativeExports": "true",
"@aws-cdk/aws-ecr-assets:dockerIgnoreSupport": true,
"@aws-cdk/aws-secretsmanager:parseOwnedSecretName": true,
"@aws-cdk/aws-kms:defaultKeyPolicies": true,
"@aws-cdk/aws-s3:grantWriteWithoutAcl": true,
"@aws-cdk/aws-ecs-patterns:removeDefaultDesiredCount": true,
"@aws-cdk/aws-rds:lowercaseDbIdentifier": true,
"@aws-cdk/aws-efs:defaultEncryptionAtRest": true,
"@aws-cdk/aws-lambda:recognizeVersionProps": true,
"@aws-cdk/core:newStyleStackSynthesis": true
}
}
package.json
{
"name": "pipeline",
"version": "0.1.0",
"bin": {
"pipeline": "bin/pipeline.js"
},
"scripts": {
"build": "tsc",
"watch": "tsc -w",
"test": "jest",
"cdk": "cdk"
},
"devDependencies": {
"@aws-cdk/assert": "1.115.0",
"@types/jest": "^26.0.10",
"@types/node": "10.17.27",
"jest": "^26.4.2",
"ts-jest": "^26.2.0",
"aws-cdk": "1.115.0",
"ts-node": "^9.0.0",
"typescript": "~3.9.7"
},
"dependencies": {
"@aws-cdk/aws-codebuild": "^1.115.0",
"@aws-cdk/aws-codepipeline": "^1.115.0",
"@aws-cdk/aws-codepipeline-actions": "^1.115.0",
"@aws-cdk/aws-s3-deployment": "^1.115.0",
"@aws-cdk/core": "1.115.0",
"@aws-cdk/pipelines": "^1.115.0",
"source-map-support": "^0.5.16"
}
}
Svar #1
Jag har lyckats hitta ett svar (åtminstone för min situation) och postar det om detta kan hjälpa någon i framtiden.
CdkPipeline-konstruktionen har två huvudsakliga åtgärder
sourceActionsom hämtar koden från ett arkiv när den utlösessynthActionsom gör byggandet
synthAction har några standardinställningar som inte var omedelbart uppenbara för mig från dokumentationen/tutorialen. t.ex. - det förutsätter att det kommer att hitta cdk.json och (cdk)package.json i roten av kod-repot
Jag hade min cdk-applikation inne i en underkatalog som heter 'pipeline', så jag behövde använda egenskapen subdirectory
synthAction: SimpleSynthAction.standardNpmSynth({
sourceArtifact,
cloudAssemblyArtifact,
subdirectory: 'pipeline',
buildCommand: 'cd ../services/website && npm run build'
})
Svar #2
I mitt fall var felet i filen cdk.json. I värdet för appen:
{
"app" : "npx ts-node --prefer-ts-exts directory/function-name-stack.ts",
Felet var stackordet i slutet av funktionen, det korrekta sättet:
{
"app" : "npx ts-node --prefer-ts-exts directory/function-name-.ts",
