使用PHP连接Jenkins Remote API

时间:2017-09-15 14:52:21

标签: php curl jenkins

为了为我们的应用程序创建一个统一的CICD进程,我正在尝试使用这个(文档记录不清)Jenkins-PHP API连接到我的Jenkins远程访问API,它实际上是用于访问a的cURL函数的包装器。远程网站。

这是我的测试连接:

$uname = '';
$pword = '';
$api_token = ''; // not yet used

$jenkins = new \JenkinsKhan\Jenkins("http://$uname:$pword@jenkins.svc.local/jobs");
var_dump($jenkins->isAvailable());

返回:

  

布尔(假)

isAvailable()函数是Jenkins API类的一部分:

public function isAvailable()
{
    $curl = curl_init($this->baseUrl . '/api/json');
    curl_setopt($curl, \CURLOPT_RETURNTRANSFER, 1);
    curl_exec($curl);

    if (curl_errno($curl)) {
        return false;
    } else {
        try {
            $this->getQueue();
        } catch (RuntimeException $e) {
            //en cours de lancement de jenkins, on devrait passer par là
            return false;
        }
    }

    return true;
}

编辑:我在函数的条件中添加了echo curl_error($curl);,它返回:

  

无法解析主机%mADA

注意:我正在运行的Web服务器和Jenkins实例位于同一网络上,并且Jenkins实例可以ping通。

我在Stack Overflow上发现了一些类似的问题,例如this one,但没有其他问题直接解决了连接到Jenkins实例的问题。

如果我更改URL字符串(删除用户名,用API令牌替换密码等),我最多会得到身份验证错误,并且至少会有403(访问被拒绝),所以我觉得好像我正在取得一些进展,但我认为Jenkins实例没有真正的身份验证。

我错过了一些明显的东西吗?如何与Jenkins远程API建立真正的连接?

1 个答案:

答案 0 :(得分:1)

事实证明使用JenkinsKahn API类存在一些问题。我只能责怪自己没有看到一年内没有对项目进行任何维护,因此我当前版本的Jenkins无法正常回复,但它确实给了我一些提示。

鉴于错误是:

  

无法解析主机

我开始查看我尝试访问的主机字符串,确定将字符串中的用户名和密码设置为主机无法解析(感谢一些问题/审讯/推销由一位好朋友)。单独使用主机字符串导致:

  

访问被拒绝(403)

首先,这意味着我正在接触主机,但我无法访问。因此,我写了一些纯cURL来处理主机字符串中不包括用户名和密码但让cURL进行身份验证的问题。

其次,如果我追加' / api / json' (根据Jenkin关于这个主题的文档)到我的网络浏览器中的URL我会得到一个JSON字符串。所以我确保包括' / api / json'在我的cURL电话的网址末尾。

以下是我最终的结果:

$url = "http://jenkins.svc.local/jobs/api/json";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$uname:$pword");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTHBASIC);
$output = curl_exec($ch);
curl_close($ch);

print_r(json_decode($output, true));

现在返回我期望看到并与之交互的信息数组。剩下要做的就是根据需要使用数据并在需要时执行命令。