如何让Azure Pipelines的GitHubComment任务仅在PR中执行一次?
为每个Pull Request仅添加一条GitHub评论的简便实现方式
你不需要维护变量组这么麻烦,有两种更直接的实现方式:
方法一:利用任务的更新模式(推荐)
GitHubComment@0任务支持upsert模式,会根据你指定的唯一标识符,自动判断是创建新评论还是更新已存在的同标识评论,这样每个PR只会保留一条评论(后续构建会更新内容,比如更新测试链接的dockertag)。
修改后的任务配置:
- task: GitHubComment@0 condition: succeeded() inputs: gitHubConnection: "MyConnection" repositoryName: "$(Build.Repository.Name)" comment: "PR available for testing on https://example.com/?=$(dockertag)" mode: "upsert" # 用PR ID作为唯一标识符,确保每个PR对应一条评论 identifier: "pr-test-deploy-link-$(System.PullRequest.PullRequestId)"
方法二:预先检查是否已有评论,仅在无评论时创建
如果你希望只创建一次评论(即使后续构建成功也不更新),可以先通过脚本调用GitHub API检查当前PR是否已有目标评论,再决定是否执行评论任务。
- 添加Bash脚本任务查询评论状态(需确保代理已安装jq工具):
PR_ID=$(System.PullRequest.PullRequestId) REPO=$(Build.Repository.Name) # 查询包含指定内容的评论数量 COMMENT_COUNT=$(curl -s -H "Authorization: token $(System.AccessToken)" \ "https://api.github.com/repos/$REPO/issues/$PR_ID/comments" | \ jq -r '.[] | select(.body | contains("PR available for testing on")) | .id' | wc -l) # 设置变量告诉后续任务是否需要创建评论 if [ $COMMENT_COUNT -eq 0 ]; then echo "##vso[task.setvariable variable=NEED_COMMENT]true" else echo "##vso[task.setvariable variable=NEED_COMMENT]false" fi
- 修改GitHubComment任务的条件:
- task: GitHubComment@0 condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'), eq(variables['NEED_COMMENT'], 'true')) inputs: gitHubConnection: "MyConnection" repositoryName: "$(Build.Repository.Name)" comment: "PR available for testing on https://example.com/?=$(dockertag)"
内容的提问来源于stack exchange,提问作者Alfonso Embid-Desmet
相关产品推荐
相关产品推荐

