diff --git a/bin/init.sh b/bin/init.sh index ae5053b7f6..344f7bc484 100755 --- a/bin/init.sh +++ b/bin/init.sh @@ -131,6 +131,15 @@ fi echo $deletelog > $basePath/deletelog.sh echo "deletelog.sh ok" +# check jenkins task status. +if [ $requestType == 'PATH_INFO' ]; then + checkCibuild="$phpcli $basePath/ztcli '$pmsRoot/ci-checkCibuild'"; +else + checkCibuild="$phpcli $basePath/ztcli '$pmsRoot/index.php?m=ci&f=checkCibuild'"; +fi +echo $checkCibuild > $basePath/checkcibuild.sh +echo "checkcibuild.sh ok" + # cron if [ ! -d "$basePath/cron" ]; then mkdir $basePath/cron @@ -146,10 +155,13 @@ echo "1-59/5 * * * * $basePath/sendmail.sh # async send mail echo "1-59/5 * * * * $basePath/sendwebhook.sh # async send webhook." >> $basePath/cron/sys.cron echo "1 1 * * * $basePath/createcycle.sh # create cycle todo." >> $basePath/cron/sys.cron echo "30 1 * * * $basePath/deletelog.sh # delete log." >> $basePath/cron/sys.cron +echo "1-59/3 * * * * $basePath/checkcibuild.sh # check ci build status." >> $basePath/cron/sys.cron cron="$phpcli $basePath/php/crond.php" echo $cron > $basePath/cron.sh echo "cron.sh ok" +0 */1 * * * ? + chmod 755 $basePath/*.sh exit 0 diff --git a/module/ci/control.php b/module/ci/control.php index 13ce40beb4..8bfb94f6ff 100644 --- a/module/ci/control.php +++ b/module/ci/control.php @@ -346,6 +346,21 @@ class ci extends control $this->send(array('result' => 'success')); } + /** + * Send a request to jenkins to check build status. + * + * @param int $buildID + * @access public + * @return void + */ + public function checkCibuild($buildID) + { + $this->ci->checkCibuild($buildID); + if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); + + $this->send(array('result' => 'success')); + } + /** * Browse repo. * diff --git a/module/ci/model.php b/module/ci/model.php index 7c8b82fd28..10516a8f82 100644 --- a/module/ci/model.php +++ b/module/ci/model.php @@ -283,8 +283,8 @@ class ciModel extends model $jenkinsServer = str_replace('://', $r, $jenkinsServer); $buildUrl = sprintf('%s/job/%s/build/api/json', $jenkinsServer, $po->jenkinsTask); - $response = common::http($buildUrl, new stdClass()); - + $queueItem = $this->sendBuildRequest($buildUrl); + $po->queueItem = $queueItem; $this->saveCibuild($po); return !dao::isError(); @@ -301,13 +301,49 @@ class ciModel extends model $build = new stdClass(); $build->citask = $task->taskId; $build->name = $task->taskName . ' ' . helper::now(); - $build->status = 'start'; + $build->queueItem = $task->queueItem; + $build->status = 'created'; $build->createdBy = $this->app->user->account; $build->createdDate = helper::now(); $this->dao->insert(TABLE_CI_BUILD)->data($build)->exec(); } + /** + * Send a request to jenkins to check build status. + * + * @param int $buildID + * @access public + * @return bool + */ + public function checkCibuild() + { + $pos = $this->dao->select('build.*, jenkins.name jenkinsName,jenkins.serviceUrl,jenkins.credential') + ->from(TABLE_CI_BUILD)->alias('build') + ->leftJoin(TABLE_TASK)->alias('task')->on('build.citask=task.id') + ->leftJoin(TABLE_JENKINS)->alias('jenkins')->on('task.jenkins=jenkins.id') + ->where('build.status')->ne('completed') + ->fetchAll(); + + foreach($pos as $po) { + $credential = $this->getCredentialByID($po->credential); // jenkins must use a token or account credential + if ($credential->type === 'token') { + $jenkinsTokenOrPassword = $credential->token; + } else if ($credential->type === 'account') { + $jenkinsTokenOrPassword = $credential->password; + } + $jenkinsUser = $credential->username; + $jenkinsServer = $po->serviceUrl; + + $r = '://' . $jenkinsUser . ':' . $jenkinsTokenOrPassword . '@'; + $jenkinsServer = str_replace('://', $r, $jenkinsServer); + $buildUrl = sprintf('%s/queue/item/%/api/json', $jenkinsServer, $po->queueItem); + + $response = common::http($buildUrl, new stdClass()); + $buildNumb = 0; + } + } + /** * Get a repo by id. * @@ -782,4 +818,41 @@ class ciModel extends model $repos[''] = ''; return $repos; } + + public static function sendBuildRequest($url) + { + if(!extension_loaded('curl')) return json_encode(array('result' => 'fail', 'message' => $lang->error->noCurlExt)); + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_setopt($curl, CURLOPT_USERAGENT, 'Sae T OAuth2 v0.1'); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30); + curl_setopt($curl, CURLOPT_TIMEOUT, 30); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($curl, CURLOPT_ENCODING, ""); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); + curl_setopt($curl, CURLOPT_HEADER, FALSE); + + $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR']; + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE); +// + curl_setopt ($curl , CURLOPT_HEADER, 1 ); + + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, new stdClass()); + + $response = curl_exec($curl); + $errors = curl_error($curl); + curl_close($curl); + + if ( preg_match ( "!Location: .*item/(.*)/!", $response , $matches ) ) { + return $matches[1]; + } + + return ''; + } }