为了为我们的应用程序创建一个统一的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建立真正的连接?
答案 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));
现在返回我期望看到并与之交互的信息数组。剩下要做的就是根据需要使用数据并在需要时执行命令。