gpt4 book ai didi

azure - 使用 Linux Shell 脚本通过 Azure DevOps 服务 REST API 创建拉取请求

转载 作者:行者123 更新时间:2023-12-03 02:13:25 26 4
gpt4 key购买 nike

我尝试通过 Azure DevOps Services REST API 创建拉取请求。我正在使用 PAT 来获取 WorkItems,例如:

#!/bin/bash
source ~/bin/variables.sh
id=${1}
url="$(organization)/$(project)/_apis/wit/workitems/${id}?api-version=7.1-preview.3"
workItem=$(curl -s -u $(presenter):$(PAT) -X GET "${url}")
  • organization 是我们的组织网址。
  • project 是项目名称。
  • 演示者是用户名(来自 az account show)
  • PAT 是个人访问 token 。

我创建了一个 Json,如下所示:

{
"sourceRefName": "refs/heads/U1367_My_Source_Branch",
"targetRefName": "refs/heads/F231_My_Target_Branch",
"title": "F231 Source bla foo. U1367 Target bla foo",
"description": "Bla foo WorkItem: #2117",
"isDraft": true
}

生成的 Json 没有换行符:

json='{"sourceRefName":"'${source}'","targetRefName":"'${target}'","title":"'${title}'","description":"'${description}'","isDraft":true}'

并发送以下内容:

 url="https://dev.azure.com/$(organizationName)/$(project)/_apis/git/repositories/${repo}/pullrequests?supportsIterations=true&api-version=7.1-preview.1"
response=$(curl -s -u $(presenter):$(PAT) -X POST -H "Content-Type: application/json" -d '${json}' "${url}")
  • organizationName 是我们的组织名称:-)
  • repo 是存储库的 ID(Guid)

我收到这样的回复:

{
"$id": "1",
"innerException": null,
"message": "TF400898: An Internal Error Occurred. Activity Id: 169c9863-5441-40a6-8e8d-4c826faf8308.",
"typeName": "Newtonsoft.Json.JsonReaderException, Newtonsoft.Json",
"typeKey": "JsonReaderException",
"errorCode": 0,
"eventId": 0
}

我检查了 PAT 的权限。我有权创建拉取请求。

对于通过 shell 脚本通过 API 创建工作拉取请求有什么建议吗?

最佳答案

my comment 扩展为完整答案:

在 shell 脚本中,我们使用引号(单引号或双引号)和/或反斜杠来让 shell 元字符进入变量的设置。单引号作用于双引号,双引号作用于单引号;当我们遇到匹配的关闭报价时,报价结束。例如:

DQ='"'

将变量$DQ设置为双引号符号,而:

SQ="'"

将变量$SQ设置为单引号(或撇号或任何你喜欢的称呼)符号。同时:

DONT='John yelled "don'"'"'t"'
# ---------------- = --

设置$DONT;内容部分是单引号(如 - 下划线)和部分双引号(如 = 下划线),并包含文字双引号和撇号/单引号,这样当展开时,我们会看到:

$ echo "$DONT"
John yelled "don't"

在这里,你有:

json='{"sourceRefName":"'${source}'","targetRefName":"'${target}\
'","title":"'${title}'","description":"'${description}'","isDraft":true}'

(但都在一行中 - 我将其拆分在这里只是为了 StackOverflow 发布),如果我们首先设置 sourcetarget 等,然后运行它并然后运行 ​​echo "$json",显示它正确设置了变量 json)。不幸的是,你有:

response=$(curl -s -u $(presenter):$(PAT) -X POST \
-H "Content-Type: application/json" -d '${json}' "${url}")

(我再次将其拆分以用于 StackOverflow 发布)。

当我们希望 shell 扩展某个变量时,我们不能使用单引号。所以 -d '${json}' 是错误的:你想要 -d "${json}" 或者只是 -d "$json".

(在 POSIX 风格的 shell 中,仅当 $var 后跟可能被解释为变量的多个字母的内容时,${var} 才需要大括号,或者如果我们想使用某些奇特的结构,例如 ${var?error} 等。因此,如果我们想打印变量 $v 的内容,后跟文字字符串 ariable,我们需要 ${v}ariable,这样它就不会被视为 ${variable},但如果我们想要 $v 后面跟着 $ariable 我们可以写 $v$ariable,当使用双引号时,如 "$var"例如,结束双引号足以让我们编写 "$v"ariable。)

何时使用哪种引号的精确规则在某些特殊情况下可能会变得很棘手,但记住这一点的简单方法是单引号比双引号更强大:

echo "$hello $world"

同时展开 $hello$world 但是:

echo '$hello $world'

两者都不展开。不过,将文字单引号转换为单引号是很丑陋的:我们得到的构造类似于上面的 DONT= 。有时设置变量 DQ 和 SQ 并使用双引号会很好:

DQ='"'
SQ="'"
DONT="John yelled ${DQ}Don${SQ}t${DQ}"

之后:

echo "$DONT"

打印我们想要的内容,但变量设置......几乎可读。

关于azure - 使用 Linux Shell 脚本通过 Azure DevOps 服务 REST API 创建拉取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72445647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com