git — поиск определенного тега GitLab из переполнения стека

У нас есть экземпляр JIRA, из которого извлекает наше пользовательское PHP-приложение, созданное в Laravel, и для каждой проблемы проверяется, существует ли конкретная ветка или тег:

chdir($path . $repo);
exec("git rev-parse --verify ".$branch, $branch_dump, $return_var);
if ($return_var == 0) {
return true;
} else {
return false;
}

Однако мы перенесли все наши git-проекты в GitLab, и этот метод больше не работает, так как вам нужен root, чтобы попасть в каталог данных репозитория GitLab.

Мы посмотрели на API GitLab и обнаружили, что можем сделать это:

http://gitlab/api/v3/projects/10/repository/commits/OUR-TAG-HERE?private_token=XXX

Однако это требует от нас указания произвольного идентификатора проекта GitLab (в данном случае 10) и поэтому не предсказуемо, поэтому мы не можем программно выполнить поиск для каждого возврата API JIRA, как мы делали раньше. Этот метод сработал бы, если бы мы могли просто искать теги, используя только имя проекта, но я не могу найти способ сделать это.

Вот обзор того, как работает приложение:

  • JIRA содержит все вопросы, которые мы хотим
  • Каждая проблема содержит несколько настраиваемых полей, которые мы используем для поиска в наших git-репозиториях, обычно это «Repo Name» и «Tag Name»
  • Наше приложение Laravel подключается к API-интерфейсу JIRA и собирает все проблемы в массив, который мы используем для построения таблицы с информацией о каждой проблеме.
  • Два пользовательских поля «Имя репо» и «Имя тега» сопоставляются с нашими репозиториями git, чтобы определить, какой из нескольких вариантов предоставить конечному пользователю (клонировать тег, создать тег, если репозиторий существует, но тега нет, или нет, если нет ни одного)

Мы кратко рассмотрели вопрос о добавлении еще одного настраиваемого поля в наши проблемы JIRA, которые мы бы заполнили идентификатором проекта GitLab, но у нас есть сотни проблем, и это неэффективное решение, которое действительно действует только как еще одна потенциальная точка отказа, не говоря уже о дополнительном обслуживании. ,

Есть идеи?

1

Решение

Лучшее решение, которое я нашел в этой проблеме, — использовать API для получения списка проектов и использовать этот список для сопряжения имени и идентификатора.

Например, этот код выведет имена тегов для всех ваших проектов:

//Get Projects list via API
$header = array("PRIVATE-TOKEN: <YOUR_TOKEN>");

$ch = curl_init("https://<YOUR_GITLAB_DOMAIN>/api/v3/projects/");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);

//Parse returned list to an array
$projectsArray= json_decode($result, true);

//Loop over the array of projects accessing the list of tags via the API
foreach ($projectsArray as $project) {
echo $project["name"] . " Tags:<br>";

$tagURL = "https://<YOUR_GITLAB_DOMAIN>/api/v3/projects/" . $project["id"] . "/repository/tags";
$ch2 = curl_init($tagURL);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch2, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
$result2 = curl_exec($ch2);
curl_close($ch2);

$tagsArray= json_decode($result2, true);
foreach ($tagsArray as $tag) {echo $tag["name"] . "<br>";}
echo "<br>";
}
1

Другие решения

Поскольку для этой функции API GitLab все еще требуются произвольные идентификаторы проектов, мы полностью удалили API. Вместо этого мы теперь просто оборачиваем HTTP-коды ответов. Вот один из наших методов, чтобы увидеть, есть ли у проблемы тег:

public function HasTag($projectName, $nameSpace, $tagName)
{
$url=$this->gitLabUrl.'/'.$nameSpace.'/'.$projectName.'/tags/'.$tagName;
$ch = curl_init();                                  // Initiate curl
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    // Disable SSL verification
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     // Will return the response, if false print the response
curl_setopt($ch, CURLOPT_URL, $url);                // Set the url
curl_exec($ch);                                     // Execute
$info = curl_getinfo($ch);
curl_close($ch);

if ($info['http_code'] == 200) {
return true;
} else {
return false;
}
}

А вот наш метод проверки ветки:

public function HasBranch($projectName, $nameSpace, $branchName)
{
$url=$this->gitLabUrl.'/'.$nameSpace.'/'.$projectName.'/tree/'.$branchName;
$ch = curl_init();                                  // Initiate curl
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    // Disable SSL verification
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     // Will return the response, if false print the response
curl_setopt($ch, CURLOPT_URL, $url);                // Set the url
curl_exec($ch);                                     // Execute
$info = curl_getinfo($ch);
curl_close($ch);

if ($info['http_code'] == 200) {
return true;
} else {
return false;
}
}

Как вы можете видеть, это довольно просто и хакерски, но работает для нашей реализации, потому что ни один из проектов, к которым осуществляется доступ, не является частным (наш экземпляр GitLab является чисто внутренним).

Надеемся, что в будущем GitLab удалит требование ID из своего API.

1

По вопросам рекламы [email protected]