Получите идентификатор запроса извлечения из Bitbucket и перейдите к сценарию bash в Teamcity - PullRequest
0 голосов
/ 20 мая 2018

Я ищу способ получить идентификатор запроса на извлечение из текущей ветви и передать его скрипту bash внутри TeamCity.

Сейчас я передаю идентификатор запроса на получение вручную в терминале - но я ищу способ получить текущий идентификатор запроса на передачу и передать его через параметры TeamCity в этот скрипт Bash (я планируюзапустить это как шаг сборки).Похоже, что Teamcity API не поддерживает захват идентификатора запроса на получение.

 #!/bin/bash
 branch=$(git symbolic-ref --short HEAD)

 repository="${PWD##*/}"


 mvn sonar:sonar -Dsonar.projectKey="$repository" -Dsonar.analysis.mode=issues -Dsonar.stash.comments.reset \
        -Dsonar.stash.notification=true -Dsonar.stash.project=datasmurfen-repos  Dsonar.stash.repository="$repository" \
        -Dsonar.stash.pullrequest.id=$1   Dsonar.stash.password.variable=SONAR_STASH_PASSWORD

Я пробовал:

git ls-remote | grep refs/pull-requests/

Но это возвращает все запросы на получение всех ветвей.

Кто-нибудь знает, как получить идентификатор запроса на извлечение из TeamCity или bash - и передать его в сценарий?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Спасибо Кристи Хьюз за то, что указал мне правильное направление.

В итоге я вместо этого преобразовал свой скрипт в Python.XXX - это токен личного доступа, который я установил под своим пользователем в BitBucket Server, а sonar.stash.password.variable = SONAR_STASH_PASSWORD - это локальная переменная среды, указывающая пароль для пользователя SonarQube.

#!/usr/bin/python3

import os
import requests
import subprocess

pwd =  os.getcwd()
repository = str(pwd).split("/")[-1]

getbranch = subprocess.run("git symbolic-ref --short HEAD", shell=True, stdout=subprocess.PIPE,
                    universal_newlines=True)
branch = getbranch.stdout

projectid = "myproject"

url = "https://x.mydomain.com/rest/api/latest/projects/{}/repos/{}/pull-requests".format( projectid, repository )

headers = { "Authorization": "Bearer {}".format("XXXXXX")}
r = requests.get(url, headers=headers)
print(r.json())

jsondict = r.json()
print (jsondict)

for project in jsondict["values"]:
    if project["fromRef"]["displayId"] == branch.strip():
            prid =  project["id"]
            print(prid)


buildproject = "mvn compile && git reset --hard HEAD"
 os.system(buildproject)         
print(buildproject)

buildanalysis = "mvn sonar:sonar -Dsonar.projectKey={} -Dsonar.analysis.mode=issues -Dsonar.stash.comments.reset -Dsonar.stash.notification=true -Dsonar.stash.project={} -Dsonar.stash.repository={} -Dsonar.stash.pullrequest.id={} -Dsonar.stash.password.variable=SONAR_STASH_PASSWORD".format( repository, projectid, repository, prid ) 
os.system(buildanalysis)
print(buildanalysis)
0 голосов
/ 21 мая 2018

Я не уверен, знает ли TeamCity об идентификаторе запроса на получение.Это маловероятно, потому что сборка выполняется по коммиту, а не по запросу, и для отправки результата обратно на Bitbucket Server не требуется запрос на извлечение.Однако, безусловно, есть способы получить нужную информацию.

Первый вариант, о котором я могу подумать, - это использование REST API Bitbucket Server Pull Request (документация здесь ).Вам понадобятся учетные данные http, чтобы выполнить запрос.Я не уверен, есть ли в TeamCity какие-то доступные вам для использования, но если этого не произойдет, вы захотите сгенерировать личный токен доступа , чтобы этот сценарий ограничивался его доступом.

curl -u username:password https://url.to.bitbucket/rest/api/latest/projects/<project_name>/repos/<repo_name>/pull-requests?state=OPEN&at=refs/heads/<branchname>&direction=OUTGOING

Затем вам придется проанализировать json, чтобы получить запрос на получение ответа из ответа (возможно, сделать это в Python будет проще, чем в bash).Еще одним ограничением этого является то, что он не получит ваши PR, полученные с форка.

Если сделать это через REST API слишком сложно (из-за учетных данных и парсинга json), вы можете сделать это.с помощью git, используя git name-rev, чтобы найти ближайший запрос на извлечение ссылки.Это менее привычно, и я на самом деле не пытался сделать это, поэтому я думаю, что, вероятно, будет больше крайних случаев, о которых нужно позаботиться, в то время как REST API дает вам очень простой ответ.

Примерно так:

> git fetch origin refs/pull-requests/*:refs/pull-requests/* # fetch all the pull-request refs
> git name-rev --name-only --refs="refs/pull-requests/*/from" HEAD # Find the pull request 'from' ref that is closest to the latest commit
pull-requests/11732/from~4^2

Вы должны были бы удалить часть 'количество коммитов', если она присутствует (все после ~), и решить, что делать, если их было несколькотянуть запросы на этом коммите (name-rev даст вам только один реф), но вам не нужно настраивать свои учетные данные, и он работает для PR от вилок.

Другой сценарий, который вы будете использоватьВ любом случае необходимо учитывать, что еще не может быть создан запрос на извлечение.

Надеюсь, это поможет!

...