У нас есть экземпляр 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, которые мы бы заполнили идентификатором проекта GitLab, но у нас есть сотни проблем, и это неэффективное решение, которое действительно действует только как еще одна потенциальная точка отказа, не говоря уже о дополнительном обслуживании. ,
Есть идеи?
Лучшее решение, которое я нашел в этой проблеме, — использовать 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>";
}
Поскольку для этой функции 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.