从 PHP 中查找特定的 GitLab 标签

Finding a specific GitLab tag from PHP

我们有一个 JIRA 实例,我们在 Laravel 中内置的自定义 PHP 应用程序从中提取每个问题,并查看是否存在特定分支或标签:

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 的 repo 数据目录。

我们查看了 GitLab 的 API,发现我们可以这样做:

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

然而,这需要我们指定一个任意的 GitLab 项目 ID(在本例中为 10),因此不是 predictable,因此我们无法以编程方式对每个 JIRA 执行搜索 API return 就像我们之前做的那样。如果我们可以仅使用项目名称简单地搜索标签,则此方法会起作用,但我找不到这样做的方法。

下面是对应用程序工作方式的忽视:

我们曾短暂地考虑过向我们的 JIRA 问题添加另一个自定义字段,我们将用 GitLab 的项目 ID 填充它,但我们有数百个问题,这是一个不优雅的解决方案,实际上只会作为另一个潜在的故障点,说没有额外的维护。

有什么想法吗?

我发现这个问题的最佳解决方案是使用 API 获取项目列表并使用该列表将名称和 ID 配对。

例如,此代码将输出您所有项目的标签名称:

//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>";
}

由于 GitLab API 仍然需要任意项目 ID 才能实现此功能,因此我们完全取消了 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;
    }
}

正如您所看到的,这非常简单和 hacky,但它适用于我们的实施,因为 none 正在访问的项目是私有的(我们的 GitLab 实例是纯内部的)。

希望 GitLab 将来能从其 API 中删除 ID 要求。