您可以推送到 Concourse 中的拉取请求分支吗?

Can you push to a pull request branch in Concourse?

在 Concourse 中,当在 Github 中创建拉取请求时,我们使用 teliaoss/github-pr-resource 来 运行 拉取请求检查。我们所做的一项检查是 npm run prettier:fix,它确保所有代码的格式都符合标准。如果存储库显示更改,则任务失败,用户必须 运行 在本地执行命令并推送更改。这很好,但我们希望 运行 npm run prettier:fix 然后将更改提交到拉取请求分支,避免要求用户再次提交。

git 资源可用并允许您推送到存储库,但您必须在 yaml 中指定分支,我不知道有什么方法可以使其动态化。这是一个使用 git 资源

的简化示例
resource_types:
  - name: pull-request
    type: registry-image
    source:
      repository: teliaoss/github-pr-resource

resources:
- name: deployment-plan
  type: git
  source:
    branch: main # this needs to be the pull-request branch
    uri: ((git-base-uri))/myproject

- task: run-prettier
  config:
    platform: linux
    image_resource:
      type: registry-image
      source:
        repository: alpine/git
    inputs:
      - name: deployment-plan
    outputs:
      - name: deployment-plan-git-update
    run:
      path: sh
      args:
        - -exc
        - |
          git clone deployment-plan deployment-plan-git-update
          cd deployment-plan-git-update
          npm run prettier:fix
          git add .
          if [[ ! -z "$(git status --porcelain)" ]]; then
            git commit -m "run prettier"
          fi
  - put: deployment-plan
    params:
      repository: deployment-plan-git-update
    rebase: true

这可以直接推送到 git 存储库,前提是您已授予访问令牌用户对存储库的访问权限。

这是一个粗略的例子:

# Run commands to run formatter
if [[ "$(git status -s)" ]]; then
    git commit -m "Formatting Code"
    git push
else
    echo "No changes"
fi  

注意:在我们的回购中,我们必须通过 git push 和重置原点并推送到正确的分支来发挥创意。 teliaoss/github-pr-resource 自最初编写以来已经发生了很大变化,因此希望它们不再是必需的。

此外,由于您现在已经推送到 PR,这将触发另一个构建。我们通过在 PR 构建作业检查之前添加一个门来解决这个问题,以查看最后一次提交是否是带有生成的提交消息的 Concourse 用户,如果是,则跳过它并将 PR 状态检查标记为完成。

您仍然需要明确设置您的分支,但@Busches 的回答让我走上了正确的道路

- task: prettier
  config:
    platform: linux
    image_resource:
      type: docker-image
      source:
        repository: image-with-node-git-and-jq
        tag: 14
    inputs:
    - name: pull-request
    outputs:
      - name: pull-request
    params:
      USERNAME: ((access-token.username))
      ACCESS_TOKEN: ((access-token.git-access-token))
    run:
      path: sh
      dir: pull-request
      args:
      - -exc
      - |
        export NG_CLI_ANALYTICS=false

        prNumber=$(cat .git/resource/metadata.json | jq -r '.[] | select(.name=="pr") | .value')
        branchName=$(curl 'https://'${USERNAME}:${ACCESS_TOKEN}'@github.nwie.net/api/v3/repos/Nationwide/roundup/pulls/'${prNumber} | jq -r '.head.ref')

        git fetch
        git checkout ${branchName}

        # run any commands that change files here
        npm install -g prettier
        npm run prettier:fix

        git add .

        # only commit if there are changes otherwise the step fails
        if [[ ! -z "$(git status --porcelain)" ]]; then
          git commit -m "prettier fix"

          git push --set-upstream origin ${branchName}
        else
          echo "no changes found"
        fi