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

  • sourceAction som hämtar koden från ett arkiv när den utlöses
  • synthAction som 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",