2017-09-15 119 views
2

为了为我们的应用程序创建统一的CICD过程,我试图连接到我的Jenkins远程访问API,利用这个(文档记录不完整)Jenkins-PHP API,它本质上是所使用的cURL函数的包装用于访问远程网站。使用PHP连接到Jenkins远程API

这里是我的测试连接:

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

$jenkins = new \JenkinsKhan\Jenkins("http://$uname:[email protected]/jobs"); 
var_dump($jenkins->isAvailable()); 

这将返回:

布尔(假)

isAvailable()功能,詹金斯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实例可以ping通。

我发现堆栈溢出的一些未解答的问题是相似的,如this one但没有其他人直接解决连接到Jenkins实例的问题。

如果我更改URL字符串(删除用户名,用API令牌等替换密码),我至多得到身份验证错误和至少403(拒绝访问),所以我觉得尽管我正在取得一些进展,但我相信Jenkins实例不会发生真正的身份验证。

我在这里错过了一些明显的东西吗?我怎样才能真正连接到Jenkins远程API?

+0

看起来你会碰到'jenkins.svc.local/jobs/api/json'而不是'jenkins.svc.local/api/json'(即构造函数中的URL是错误的) –

+0

所有远程API的文档说你应该打开URL加'/ api/json' @DarenChandisingh为什么你认为这个URL是错误的?顺便说一句,用更多的错误信息编辑这个问题。 –

+0

我认为这是错误的,因为您使用jenkins.svc.local/**作业**,但我期望API直接位于根目录下。它无论如何都在我的Jenkins服务器上。 (尽管您添加的附加信息表明在此之前还存在问题)。 –

回答

1

事实证明,使用JenkinsKahn API类有几个问题。我只能责怪自己没有看到一年中没有对项目进行维护,,所以我目前的Jenkins版本不会正确响应,但它确实给了我一些提示。

由于错误是:

无法解析主机

我开始寻找在主机字符串我试图访问和确定把用户名和密码字符串中让主人无法解决(感谢一些问题/讯问/由好朋友刺激)。单独使用主机字符串导致:

访问被拒绝(403)

首先,这意味着我到达主机,但我无法访问。因此,我写了一些纯cURL来处理在主机字符串中不包含用户名和密码的问题,但让cURL进行身份验证。其次,如果我在Web浏览器的URL中追加'/ api/json'(根据Jenkin关于这个主题的文档),我会返回一个JSON字符串。所以我确保在我的cURL调用的URL末尾包含'/ api/json'。

这里是我结束了:

$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)); 

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