从PHP

时间:2015-12-17 17:57:25

标签: php git laravel gitlab

我们有一个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)因此是不可预测的,因此我们无法像以前那样以编程方式执行每个JIRA API返回的搜索。如果我们只使用项目名称搜索标签,这种方法就可以工作,但我找不到办法做到这一点。

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

  • JIRA包含我们想要的所有问题
  • 每个问题都包含几个我们用来搜索我们的git repos的自定义字段,一般来说它们是“Repo Name”和“Tag Name”
  • 我们的Laravel应用程序连接到JIRA的api并将所有问题收集到一个数组中,我们用它来构建一个列出每个问题的信息的表格
  • 两个自定义字段“Repo Name”和“Tag Name”与我们的git存储库匹配,以确定提供最终用户的几个选项中的哪一个(克隆标记,如果存在repo但不存在标记,则创建标记,如果存在,则不创建标记两者都不是)

我们简要地考虑在我们的JIRA问题中添加另一个自定义字段,我们将用GitLab的项目ID填充,但我们有数百个问题,这是一个不优雅的解决方案,实际上只是另一个潜在的失败点,更不用说额外的维护。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于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,但它适用于我们的实现,因为所访问的项目都不是私有的(我们的GitLab实例纯粹是内部的)。

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