从 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 包含我们想要的所有问题
- 每个问题都包含我们用来搜索我们的 git 存储库的几个自定义字段,通常它们是 "Repo Name" 和 "Tag Name"
- 我们的 Laravel 应用连接到 JIRA 的 api 并将所有问题收集到我们用来构建 table 列出每个问题信息的数组中
- 两个自定义字段 "Repo Name" 和 "Tag Name" 与我们的 git 存储库匹配,以确定向最终用户提供几个选项中的哪一个(克隆标签,如果存储库存在则创建标签但不存在标签,或者 none 如果两者都不存在)
我们曾短暂地考虑过向我们的 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 要求。
我们有一个 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 包含我们想要的所有问题
- 每个问题都包含我们用来搜索我们的 git 存储库的几个自定义字段,通常它们是 "Repo Name" 和 "Tag Name"
- 我们的 Laravel 应用连接到 JIRA 的 api 并将所有问题收集到我们用来构建 table 列出每个问题信息的数组中
- 两个自定义字段 "Repo Name" 和 "Tag Name" 与我们的 git 存储库匹配,以确定向最终用户提供几个选项中的哪一个(克隆标签,如果存储库存在则创建标签但不存在标签,或者 none 如果两者都不存在)
我们曾短暂地考虑过向我们的 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 要求。