使用 Jenkins 管道上的 AWS cli “期望用双引号括起来的属性名称”

Posted

技术标签:

【中文标题】使用 Jenkins 管道上的 AWS cli “期望用双引号括起来的属性名称”【英文标题】:"Expecting property name enclosed in double quotes" with AWS cli on Jenkins Pipeline 【发布时间】:2017-09-27 09:42:48 【问题描述】:

我收到一条错误消息

期望用双引号括起来的属性名称:第 1 行第 3 列(字符 2)

在 Jenkins 管道上运行 AWS CLI 以创建 EC2 容器服务的任务定义。有趣的是这个脚本能够在命令行中运行而没有任何错误。

aws ecs register-task-definition --family $FAMILY --container-definitions "[\"name\":\"wildfly\",\"image\":\"$REPOSITORY\",\"memory\":3024,\"essential\":true,\"portMappings\":[\"containerPort\":8080,\"hostPort\":8080,\"protocol\":\"tcp\"]]"` 

这是完整的错误信息

aws ecs register-task-definition --family wildfly2-b47 --container-definitions [name:wildfly, image:****/backend:b47, memory:3024, essential:true, portMappings:[containerPort:8080, hostPort:8080, protocol:tcp]]

期望用双引号括起来的属性名称:第 1 行第 3 列 (字符 2)

这是詹金斯阶段代码

    stage('Deploy')
        withCredentials([string(credentialsId: 'ecr-repository', variable: 'repo'), 
        [$class: 'AmazonWebServicesCredentialsBinding', 
        accessKeyVariable: 'AWS_ACCESS_KEY_ID', 
        credentialsId: 'ecr-credentials', 
        secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) 
            sh '''
            bash
            set -x
            export AWS_DEFAULT_REGION=us-west-2
            CLUSTER="default"
            VERSION=b$BUILD_NUMBER
            FAMILY=nxpmp2-$VERSION
            SERVICE="backend"
            REPOSITORY=$repo/backend:$VERSION
            #Register the task definition in the repository
            aws ecs register-task-definition --family $FAMILY --container-definitions "["name": "wildfly", "image": $REPOSITORY, "memory": 3024, "essential": true, "portMappings": ["containerPort": 8080, "hostPort": 8080, "protocol": "tcp"  ] ]"
            #Update the Service
            #aws ecs update-service --cluster $CLUSTER --region $AWS_DEFAULT_REGION --service $SERVICE --task-definition $FAMILY
--desired-count 1
            '''
        

请帮帮我

【问题讨论】:

【参考方案1】:

查看--container-definitions 部分。您已经通过语法高亮看到它:

--container-definitions "["name":

您在双引号内使用双引号(name 附近)。

以下应该可以代替:

--container-definitions '["name": ...]'

【讨论】:

【参考方案2】:

如果你想在管道的 shell 脚本中使用一些 groovy 变量,我上面的答案是有问题的。

问题是 aws cli 坚持一个 quete,然后你不能将你的 froovy 变量指向如下:

FOO = "bar"
sh'''
   aws ecs ...  --container-definitions '["name": $FOO]'
'''

这不会给你 bar 作为输出,但会给 $FOO 这将导致错误。 经过几个小时的折腾并未能找到干净的解决方案后,我在这篇文章中找到了解决方法 Access a Groovy variable from within shell step in Jenkins pipeline

所以解决办法是

FOO = "bar"
sh'''
   aws ecs ...  --container-definitions '["name":''' + $FOO + ''']'
'''

希望能帮到你

【讨论】:

以上是关于使用 Jenkins 管道上的 AWS cli “期望用双引号括起来的属性名称”的主要内容,如果未能解决你的问题,请参考以下文章

捆绑安装在 Jenkins 管道上真的很慢(AWS EC2 实例)

在 Kubernetes 上的 Jenkins 管道中使用 npm 构建 ReactJs 应用程序

AWS EC2 实例上的 Jenkins 错误 503

使用 Jenkins Pipeline 将 webapp 部署到 AWS Elastic Beanstalk

描述 EC2 实例 使用 AWS cli 过滤实例名称

AWS ECS Fargate 上的 Jenkins 工作人员:并行运行几个作业