【问题标题】:AWS CodeBuild - EnvironmentVariables specified in action config does not match expected formatAWS CodeBuild - 操作配置中指定的 EnvironmentVariables 与预期格式不匹配
【发布时间】:2022-02-02 21:05:25
【问题描述】:

我正在尝试将环境变量添加到使用 AWS Codebuild 的管道操作。但是,无论我添加什么,如果我选择了 Secret Manager 类型,该步骤将失败并出现以下错误:

无效的动作配置

action config中指定的EnvironmentVariables与预期格式不匹配,预期格式为遵循以下格式的JSON数组:[{“name”:“string”,“type”:“string”,“value”:“string "}]

这是我在 UI 中输入的内容:

CodePipeline 生成的 JSON 如下所示:

[{"name":"SERVICE_CREDS","value":"my-secret:service_creds","type":"SECRETS_MANAGER"}]

这是怎么回事??我不知道我最终可能会出错。我在他们提供的框中输入文本。 Pipelines 从它们的输入框中生成的 JSON 在我看来是有效的。所以,我不知道为什么它说环境变量与预期的格式不匹配!

【问题讨论】:

  • "Value" 中不能有":",因为你放在那里。这将导致引擎盖下的 json 无效。
  • 我不确定这是否是问题所在。生成的 JSON 完全有效(这可以通过 jsonformatter.curiousconcept.com 进行验证)。此外,: 是您指定 Secret Manager 路径的方式,因此它们不能被删除。
  • 我也有同样的问题,你找到解决办法了吗?

标签: aws-codepipeline aws-codebuild


【解决方案1】:

如果有人在搜索错误后来到这个页面:

action config中指定的EnvironmentVariables与预期格式不匹配,预期格式为遵循以下格式的JSON数组

当您有一个 CodePipeline 将环境变量“#{SourceVariables.CommitMessage}”从 Source 操作提供给 CodeBuild 操作并且如果 CommitMessage 包含引号或为多行时,这是一个反复出现的问题,那么操作将因失败而失败到内部 json 解析器失败。

注意:CodeCommit 始终添加一个“\n”,因此 CodeCommit 始终会出现此问题。对于 GitHub,只有在您使用扩展提交消息时才会发生。

现在要在不丢失“COMMIT_MESSAGE”环境变量的情况下解决此问题,请按照以下步骤操作:

解决方法:

  • 从 CodeBuild 操作的 CodePipeline 配置中删除“COMMIT_MESSAGE”环境变量。

  • 确保您的 CodeBuild 项目的服务角色有权在管道上执行“ListPipelineExecutions”。

  • 在 Buildspec 'Install' 阶段添加以下内容以安装 'jq' 实用程序 [1]:

    - apt-get install jq
    
  • 在需要获取提交消息的 Buildspec 中添加以下内容(请更新为管道名称):

    - COMMIT_MESSAGE=$(aws codepipeline list-pipeline-executions  --pipeline-name <Pipeline_Name> --max-items 1 | jq -r '.pipelineExecutionSummaries[0].sourceRevisions[0].revisionSummary')
    - export COMMIT_MESSAGE
    - echo $COMMIT_MESSAGE # debug command only
    - printenv # debug command only
    

使用此方法,我们使用“list-pipeline-executions”[2] AWS CLI 调用来检索最近的管道执行并解析来自该执行的提交消息。 'COMMIT_MESSAGE' 变量将包含带有任何引号或换行符的完整提交消息。

参考资料:

[1] jq - https://stedolan.github.io/jq/

[2] 列表管道执行 - https://docs.aws.amazon.com/cli/latest/reference/codepipeline/list-pipeline-executions.html

【讨论】:

    【解决方案2】:

    继续上面的答案,我们还可以使用 AWS 内置查询标志/方法,而不是在 buildspec.yml 中使用/安装 jq。

    - COMMIT_MESSAGE=$(aws codepipeline list-pipeline-executions --pipeline-name <Pipeline_Name> --max-items 1 --query 'pipelineExecutionSummaries[0].sourceRevisions[0].revisionSummary')
    - echo COMMIT_MESSAGE $COMMIT_MESSAGE # debug command only
    

    参考 - https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html

    【讨论】:

      猜你喜欢
      • 2020-08-20
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多