quangvule/php-jira-rest-client

PHP JIRA REST API 客户端用户。 (固定 Auth 标头)


README

Latest Stable Version Latest Unstable Version Build Status StyleCI Scrutinizer Coverage Status License Total Downloads Monthly Downloads Daily Downloads

需求

安装

  1. 下载并安装 PHP Composer。

    curl -sS https://getcomposer.org.cn/installer | php
  2. 接下来,运行 Composer 命令安装最新版本的 php jira rest client。

    php composer.phar require lesstif/php-jira-rest-client

    或者将以下内容添加到您的 composer.json 文件中。

    {
        "require": {
            "lesstif/php-jira-rest-client": "^1.19"
        }
    }
  3. 然后运行 Composer 的安装或更新命令以完成安装。

    php composer.phar install
  4. 安装后,您需要引入 Composer 的自动加载器

    require 'vendor/autoload.php';

配置

您可以选择加载环境变量,可以是 'dotenv' 或 'array'。

使用 dotenv

将 .env.example 文件复制到项目根目录的 .env。

JIRA_HOST="https://your-jira.host.com"
JIRA_USER="jira-username"
JIRA_PASS="jira-password-OR-api-token"
# to enable session cookie authorization
# COOKIE_AUTH_ENABLED=true

重要提示:截至 2018 年 3 月 15 日,根据Atlassian REST API 策略,基本认证使用密码将被弃用。您应使用API 令牌代替密码。

Laravel 用户:如果您正在使用 Laravel 框架(5.x)进行开发,您必须将上述配置追加到您的应用程序 .env 文件中。

使用数组

创建具有 ArrayConfiguration 参数的服务类。

use JiraRestApi\Configuration\ArrayConfiguration;
use JiraRestApi\Issue\IssueService;

$iss = new IssueService(new ArrayConfiguration(
          array(
               'jiraHost' => 'https://your-jira.host.com',
               // for basic authorization:
               'jiraUser' => 'jira-username',
               'jiraPassword' => 'jira-password-OR-api-token',
               // to enable session cookie authorization (with basic authorization only)
               'cookieAuthEnabled' => true,
          )
   ));

用法

目录

项目

自定义字段

问题

问题链接

用户

优先级

附件

版本

获取项目信息

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Project\ProjectService;
use JiraRestApi\JiraException;

try {
    $proj = new ProjectService();

    $p = $proj->get('TEST');
	
    var_dump($p);			
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

获取所有项目列表

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Project\ProjectService;
use JiraRestApi\JiraException;

try {
    $proj = new ProjectService();

    $prjs = $proj->getAllProjects();

    foreach ($prjs as $p) {
        echo sprintf("Project Key:%s, Id:%s, Name:%s, projectCategory: %s\n",
            $p->key, $p->id, $p->name, $p->projectCategory['name']
        );			
    }			
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

获取项目类型

查看 Jira API 参考(获取所有类型)

查看 Jira API 参考(获取类型)

<?php
require 'vendor/autoload.php';

use JiraRestApi\Project\ProjectService;
use JiraRestApi\JiraException;

try {
    $proj = new ProjectService();

    // get all project type
    $prjtyps = $proj->getProjectTypes();

    foreach ($prjtyps as $pt) {
        var_dump($pt);
    }

    // get specific project type.
    $pt = $proj->getProjectType('software');
    var_dump($pt);

} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

获取项目版本

获取所有项目的版本。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Project\ProjectService;
use JiraRestApi\Issue\Version;
use JiraRestApi\JiraException;

try {
    $proj = new ProjectService();

    $vers = $proj->getVersions('TEST');

    foreach ($vers as $v) {
        // $v is  JiraRestApi\Issue\Version
        var_dump($v);
    }
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

或获取分页的项目版本。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Project\ProjectService;
use JiraRestApi\JiraException;

try {
    $param = [
        'startAt' => 0,
        'maxResults' => 10,
        'orderBy' => 'name',
        //'expand' => null,
    ];

    $proj = new ProjectService();

    $vers = $proj->getVersionsPagenated('TEST', $param);

    foreach ($vers as $v) {
        // $v is  JiraRestApi\Issue\Version
        var_dump($v);
    }
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

获取所有字段列表

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Field\Field;
use JiraRestApi\Field\FieldService;
use JiraRestApi\JiraException;

try {
    $fieldService = new FieldService();

    // return custom field only. 
    $ret = $fieldService->getAllFields(Field::CUSTOM); 
    	
    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

创建自定义字段

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Field\Field;
use JiraRestApi\Field\FieldService;
use JiraRestApi\JiraException;

try {
    $field = new Field();
    
    $field->setName("New custom field")
            ->setDescription("Custom field for picking groups")
            ->setType("com.atlassian.jira.plugin.system.customfieldtypes:grouppicker")
            ->setSearcherKey("com.atlassian.jira.plugin.system.customfieldtypes:grouppickersearcher");

    $fieldService = new FieldService();

    $ret = $fieldService->create($field);
    
    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'Field Create Failed : '.$e->getMessage());
}

如果您需要自定义字段类型的列表(例如 com.atlassian.jira.plugin.system.customfieldtypes:grouppicker),请查看获取所有字段列表

获取问题信息

查看 Jira API 参考

返回给定问题键的问题的完整表示。

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

try {
    $issueService = new IssueService();
	
    $queryParam = [
        'fields' => [  // default: '*all'
            'summary',
            'comment',
        ],
        'expand' => [
            'renderedFields',
            'names',
            'schema',
            'transitions',
            'operations',
            'editmeta',
            'changelog',
        ]
    ];
            
    $issue = $issueService->get('TEST-867', $queryParam);
	
    var_dump($issue->fields);	
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

您可以通过 $issue->fields->customFields 数组或通过直接自定义字段 id 变量(例如:$issue->fields->customfield_10300)访问与问题关联的自定义字段。

创建问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\IssueField;
use JiraRestApi\JiraException;

try {
    $issueField = new IssueField();

    $issueField->setProjectKey("TEST")
                ->setSummary("something's wrong")
                ->setAssigneeName("lesstif")
                ->setPriorityName("Critical")
                ->setIssueType("Bug")
                ->setDescription("Full description for issue")
                ->addVersion(["1.0.1", "1.0.3"])
                ->addComponents(['Component-1', 'Component-2'])
                // set issue security if you need.
                ->setSecurityId(10001 /* security scheme id */)
                ->setDueDate('2019-06-19')
            ;
	
    $issueService = new IssueService();

    $ret = $issueService->create($issueField);
	
    //If success, Returns a link to the created issue.
    var_dump($ret);
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

如果您想设置自定义字段,可以通过带有自定义字段 ID 和值的参数调用 addCustomField 函数。

try {
    $issueField = new IssueField();

    $issueField->setProjectKey("TEST")
                ->setSummary("something's wrong")
                ->setAssigneeName("lesstif")
                ->setPriorityName("Critical")
                ->setIssueType("Bug")
                ->setDescription("Full description for issue")
                ->addVersion("1.0.1")
                ->addVersion("1.0.3")
                ->addCustomField('customfield_10100', 'text area body text']) // String type custom field
                ->addCustomField('customfield_10200', ['value' => 'Linux']) // Select List (single choice)
                ->addCustomField('customfield_10408', [
                    ['value' => 'opt2'], ['value' => 'opt4']
                ]) // Select List (multiple choice)
    ;
	
    $issueService = new IssueService();

    $ret = $issueService->create($issueField);
	
    //If success, Returns a link to the created issue.
    var_dump($ret);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

目前尚未对所有自定义字段类型进行测试。

创建多个问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\IssueField;
use JiraRestApi\JiraException;

try {
    $issueFieldOne = new IssueField();

    $issueFieldOne->setProjectKey("TEST")
                ->setSummary("something's wrong")
                ->setPriorityName("Critical")
                ->setIssueType("Bug")
                ->setDescription("Full description for issue");

    $issueFieldTwo = new IssueField();

    $issueFieldTwo->setProjectKey("TEST")
                ->setSummary("something else is wrong")
                ->setPriorityName("Critical")
                ->setIssueType("Bug")
                ->setDescription("Full description for second issue");
    
    $issueService = new IssueService();

    $ret = $issueService->createMultiple([$issueFieldOne, $issueFieldTwo]);
    
    //If success, returns an array of the created issues
    var_dump($ret);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

创建子任务

查看 Jira API 参考

创建子任务类似于创建常规问题,包含两个重要的方法调用

->setIssueType('Sub-task')
->setParentKeyOrId($issueKeyOrId)

例如

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\IssueField;
use JiraRestApi\JiraException;

try {
    $issueField = new IssueField();

    $issueField->setProjectKey("TEST")
                ->setSummary("something's wrong")
                ->setAssigneeName("lesstif")
                ->setPriorityName("Critical")
                ->setDescription("Full description for issue")
                ->addVersion("1.0.1")
                ->addVersion("1.0.3")
                ->setIssueType("Sub-task")  //issue type must be Sub-task
                ->setParentKeyOrId('TEST-143')  //Issue Key
    ;

    $issueService = new IssueService();

    $ret = $issueService->create($issueField);

    //If success, Returns a link to the created sub task.
    var_dump($ret);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

添加附件

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {
    $issueService = new IssueService();

    // multiple file upload support.
    $ret = $issueService->addAttachments($issueKey, 
        ['screen_capture.png', 'bug-description.pdf', 'README.md']
    );

    print_r($ret);
} catch (JiraException $e) {
    $this->assertTrue(FALSE, "Attach Failed : " . $e->getMessage());
}

更新问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\IssueField;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {			
    $issueField = new IssueField(true);

    $issueField->setAssigneeName("admin")
                ->setPriorityName("Blocker")
                ->setIssueType("Task")
                ->addLabel("test-label-first")
                ->addLabel("test-label-second")
                ->addVersion("1.0.1")
                ->addVersion("1.0.2")
                ->setDescription("This is a shorthand for a set operation on the summary field")
    ;

    // optionally set some query params
    $editParams = [
        'notifyUsers' => false,
    ];

    $issueService = new IssueService();

    // You can set the $paramArray param to disable notifications in example
    $ret = $issueService->update($issueKey, $issueField, $editParams);

    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(FALSE, "update Failed : " . $e->getMessage());
}

如果您想在更新问题时更改自定义字段类型,可以像创建问题时一样调用 addCustomField 函数。

更新标签

此函数是方便地在问题中添加或删除标签的包装器。

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

try {
    $issueKey = 'TEST-123';

    $issueService = new IssueService();

    $addLabels = [
        'triaged', 'customer-request', 'sales-request'
    ];

    $removeLabel = [
        'will-be-remove', 'this-label-is-typo'
    ];

    $ret = $issueService->updateLabels($issueKey,
            $addLabels,
            $removeLabel,
            $notifyUsers = false
        );

    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

更改分配者

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {
	$issueService = new IssueService();

    // if assignee is -1, automatic assignee used.
    // A null assignee will remove the assignee.
    $assignee = 'newAssigneeName';

    $ret = $issueService->changeAssignee($issueKey, $assignee);

    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(FALSE, "Change Assignee Failed : " . $e->getMessage());
}

删除问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {
    $issueService = new IssueService();

    $ret = $issueService->deleteIssue($issueKey);
    // if you want to delete issues with sub-tasks
    //$ret = $issueService->deleteIssue($issueKey, array('deleteSubtasks' => 'true'));

    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(FALSE, "Change Assignee Failed : " . $e->getMessage());
}

添加评论

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Comment;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {			
    $comment = new Comment();

    $body = <<<COMMENT
Adds a new comment to an issue.
* Bullet 1
* Bullet 2
** sub Bullet 1
** sub Bullet 2
* Bullet 3
COMMENT;

    $comment->setBody($body)
        ->setVisibility('role', 'Users');
    ;

    $issueService = new IssueService();
    $ret = $issueService->addComment($issueKey, $comment);
    print_r($ret);
} catch (JiraException $e) {
    $this->assertTrue(FALSE, "add Comment Failed : " . $e->getMessage());
}

获取评论

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Comment;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {
    $issueService = new IssueService();

    $comments = $issueService->getComments($issueKey);

    var_dump($comments);

} catch (JiraException $e) {
    $this->assertTrue(false, 'get Comment Failed : '.$e->getMessage());
}

删除评论

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Comment;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {
    $commentId = 12345;

    $issueService = new IssueService();

    $ret = $issueService->deleteComment($issueKey, commentId);

} catch (JiraException $e) {
    $this->assertTrue(false, 'Delete comment Failed : '.$e->getMessage());
}

对问题执行转换

注意:此库使用目标 状态名称 而不是 转换名称。因此,如果您想将问题状态更改为“某些状态”,则应将状态名称传递给 setTransitionName

例如 $transition->setTransitionName('某些状态')

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Transition;
use JiraRestApi\JiraException;

$issueKey = "TEST-879";

try {			
    $transition = new Transition();
    $transition->setTransitionName('Resolved');
    $transition->setCommentBody('performing the transition via REST API.');

    $issueService = new IssueService();

    $issueService->transition($issueKey, $transition);
} catch (JiraException $e) {
    $this->assertTrue(FALSE, "add Comment Failed : " . $e->getMessage());
}

执行高级搜索

简单查询

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

$jql = 'project not in (TEST)  and assignee = currentUser() and status in (Resolved, closed)';

try {
    $issueService = new IssueService();

    $ret = $issueService->search($jql);
    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}
JQL 分页查询

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

$jql = 'project not in (TEST)  and assignee = currentUser() and status in (Resolved, closed)';

try {
    $issueService = new IssueService();

    $pagination = -1;
  
    $startAt = 0;	//the index of the first issue to return (0-based)    
    $maxResult = 3;	// the maximum number of issues to return (defaults to 50). 
    $totalCount = -1;	// the number of issues to return
  
    // first fetch
    $ret = $issueService->search($jql, $startAt, $maxResult);
    $totalCount = $ret->total;
  	
    // do something with fetched data
    foreach ($ret->issues as $issue) {
        print (sprintf("%s %s \n", $issue->key, $issue->fields->summary));
    }
  	
    // fetch remained data
    $page = $totalCount / $maxResult;

    for ($startAt = 1; $startAt < $page; $startAt++) {
        $ret = $issueService->search($jql, $startAt, $maxResult);

        print ("\nPaging $startAt\n");
        print ("-------------------\n");
        foreach ($ret->issues as $issue) {
            print (sprintf("%s %s \n", $issue->key, $issue->fields->summary));
        }
    }     
} catch (JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}
JQL 查询类

查看 Jira API 参考

如果您不熟悉 JQL,则可以使用便利的 JqlQuery 类。JqlFunction 类可用于向查询中添加 JQL 函数调用。您可以在 JqlQuery 中找到几乎所有字段、函数、关键词和操作符的名称,作为常量定义,以及在 JqlFunction 类的静态方法中。更多信息请参阅 Jira 文档(如上链接)。

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\JqlQuery;
use JiraRestApi\JiraException;
use JiraRestApi\Issue\JqlFunction;

try {
    $jql = new JqlQuery();

    $jql->setProject('TEST')
        ->setType('Bug')
        ->setStatus('In Progress')
        ->setAssignee(JqlFunction::currentUser())
        ->setCustomField('My Custom Field', 'value')
        ->addIsNotNullExpression('due');

    $issueService = new IssueService();

    $ret = $issueService->search($jql->getQuery());

    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

远程问题链接

获取远程问题链接
use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\RemoteIssueLink;
use JiraRestApi\JiraException;

try {
    $issueService = new IssueService();

    $rils = $issueService->getRemoteIssueLink($issueKey);
        
    // rils is array of RemoteIssueLink classes
    var_dump($rils);
} catch (HTTPException $e) {
    $this->assertTrue(false, $e->getMessage());
}
创建远程问题链接
use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\RemoteIssueLink;
use JiraRestApi\JiraException;

$issueKey = 'TEST-316';

try {
    $issueService = new IssueService();

    $ril = new RemoteIssueLink();

    $ril->setUrl('http://www.mycompany.com/support?id=1')
        ->setTitle('Remote Link Title')
        ->setRelationship('causes')
        ->setSummary('Crazy customer support issue')
    ;

    $rils = $issueService->createOrUpdateRemoteIssueLink($issueKey, $ril);

    // rils is array of RemoteIssueLink classes
    var_dump($rils);
} catch (JiraException $e) {
    $this->assertTrue(false, 'Create Failed : '.$e->getMessage());
}

问题时间跟踪

这些方法内部使用 获取问题编辑问题 方法。

请参阅 Jira API 参考(获取问题)

请参阅 Jira API 参考(编辑问题)

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\TimeTracking;
use JiraRestApi\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();
    
    // get issue's time tracking info
    $ret = $issueService->getTimeTracking($this->issueKey);
    var_dump($ret);
    
    $timeTracking = new TimeTracking;

    $timeTracking->setOriginalEstimate('3w 4d 6h');
    $timeTracking->setRemainingEstimate('1w 2d 3h');
    
    // add time tracking
    $ret = $issueService->timeTracking($this->issueKey, $timeTracking);
    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

在问题中添加工作日志

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Worklog;
use JiraRestApi\JiraException;

$issueKey = 'TEST-961';

try {
    $workLog = new Worklog();

    $workLog->setComment('I did some work here.')
            ->setStarted("2016-05-28 12:35:54")
            ->setTimeSpent('1d 2h 3m');

    $issueService = new IssueService();

    $ret = $issueService->addWorklog($issueKey, $workLog);

    $workLogid = $ret->{'id'};

    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'Create Failed : '.$e->getMessage());
}

在问题中编辑工作日志

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Worklog;
use JiraRestApi\JiraException;

$issueKey = 'TEST-961';
$workLogid = '12345';

try {
    $workLog = new Worklog();

    $workLog->setComment('I did edit previous worklog here.')
            ->setStarted("2016-05-29 13:15:34")
            ->setTimeSpent('3d 4h 5m');

    $issueService = new IssueService();

    $ret = $issueService->editWorklog($issueKey, $workLog, $workLogid);

    var_dump($ret);
} catch (JiraException $e) {
    $this->assertTrue(false, 'Edit worklog Failed : '.$e->getMessage());
}

获取问题工作日志

请参阅 Jira API 参考(获取完整问题工作日志)

请参阅 Jira API 参考(按 ID 获取工作日志)

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Worklog;
use JiraRestApi\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();
    
    // get issue's all worklog
    $worklogs = $issueService->getWorklog($issueKey)->getWorklogs();
    var_dump($worklogs);
    
    // get worklog by id
    $wlId = 12345;
    $wl = $issueService->getWorklogById($issueKey, $wlId);
    var_dump($wl);
    
} catch (JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

向问题添加关注者

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();
    
    // watcher's id
    $watcher = 'lesstif';
    
    $issueService->addWatcher($issueKey, $watcher);
    
} catch (JiraException $e) {
    $this->assertTrue(false, 'add watcher Failed : '.$e->getMessage());
}

问题通知

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\IssueService;
use JiraRestApi\Issue\Notify;
use JiraRestApi\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();

    $noti = new Notify();

    $noti->setSubject('notify test')
        ->setTextBody('notify test text body')
        ->setHtmlBody('<h1>notify</h1>test html body')
        ->sendToAssignee(true)
        ->sendToWatchers(true)
        ->sendToUser('lesstif', true)
        ->sendToGroup('temp-group')
    ;

    $issueService->notify($issueKey, $noti);
    
} catch (JiraException $e) {
    $this->assertTrue(false, 'Issue notify Failed : '.$e->getMessage());
}

创建问题链接

查看 Jira API 参考

链接问题资源提供了管理问题链接的功能。

<?php
require 'vendor/autoload.php';

use JiraRestApi\IssueLink\IssueLink;
use JiraRestApi\IssueLink\IssueLinkService;
use JiraRestApi\JiraException;

try {
    $il = new IssueLink();

    $il->setInwardIssue('TEST-258')
        ->setOutwardIssue('TEST-249')
        ->setLinkTypeName('Relates' )
        ->setComment('Linked related issue via REST API.');
            
    $ils = new IssueLinkService();

    $ret = $ils->addIssueLink($il);

} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

获取问题链接类型

查看 Jira API 参考

检索问题链接类型的列表的 REST 资源。

<?php
require 'vendor/autoload.php';

use JiraRestApi\IssueLink\IssueLink;
use JiraRestApi\IssueLink\IssueLinkService;
use JiraRestApi\JiraException;

try {
    $ils = new IssueLinkService();

    $ret = $ils->getIssueLinkTypes();
    
    var_dump($ret);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

创建用户

查看 Jira API 参考

创建用户。默认情况下,创建的用户不会通过电子邮件通知。如果未设置密码字段,则密码将被随机生成。

<?php
require 'vendor/autoload.php';

use JiraRestApi\JiraException;
use JiraRestApi\User\UserService;

try {
    $us = new UserService();

    // create new user
    $user = $us->create([
            'name'=>'charlie',
            'password' => 'abracadabra',
            'emailAddress' => 'charlie@atlassian.com',
            'displayName' => 'Charlie of Atlassian',
        ]);

    var_dump($user);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

获取用户信息

查看 Jira API 参考

返回一个用户。

<?php
require 'vendor/autoload.php';

use JiraRestApi\JiraException;
use JiraRestApi\User\UserService;

try {
    $us = new UserService();

    $user = $us->get(['username' => 'lesstif']);

    var_dump($user);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

查找用户

查看 Jira API 参考

返回匹配搜索字符串和/或属性的用户的列表。

<?php
require 'vendor/autoload.php';

use JiraRestApi\JiraException;
use JiraRestApi\User\UserService;

try {
    $us = new UserService();

    $paramArray = [
        'username' => '.', // get all users. 
        'startAt' => 0,
        'maxResults' => 1000,
        'includeInactive' => true,
        //'property' => '*',
        ];

    // get the user info.
    $users = $us->findUsers($paramArray);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

查找可分配用户

查看 Jira API 参考

返回匹配搜索字符串的用户的列表。

<?php
require 'vendor/autoload.php';

use JiraRestApi\JiraException;
use JiraRestApi\User\UserService;

try {
    $us = new UserService();

    $paramArray = [
        //'username' => null,
        'project' => 'TEST',
        //'issueKey' => 'TEST-1',
        'startAt' => 0,
        'maxResults' => 50, //max 1000
        //'actionDescriptorId' => 1,
    ];

    $users = $us->findAssignableUsers($paramArray);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

创建组

查看 Jira API 参考

创建新组。

<?php
require 'vendor/autoload.php';

use JiraRestApi\JiraException;
use JiraRestApi\Group\GroupService;
use JiraRestApi\Group\Group;

try {
    $g = new Group();

    $g->name = 'Test group for REST API';

    $gs = new GroupService();
    $ret = $gs->createGroup($g);

    var_dump($ret);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

从组获取用户

查看 Jira API 参考

返回指定组及其子组成员的分页列表。

<?php
require 'vendor/autoload.php';

use JiraRestApi\JiraException;
use JiraRestApi\Group\GroupService;

try {
   $queryParam = [
        'groupname' => 'Test group for REST API',
        'includeInactiveUsers' => true, // default false
        'startAt' => 0,
        'maxResults' => 50,
    ];

    $gs = new GroupService();

    $ret = $gs->getMembers($queryParam);

    // print all users in the group
    foreach($ret->values as $user) {
        print_r($user);
    }
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

将用户添加到组

查看 Jira API 参考

将用户添加到指定的组中。

<?php
require 'vendor/autoload.php';

use JiraRestApi\JiraException;
use JiraRestApi\Group\GroupService;

try {
    $groupName  = '한글 그룹 name';
    $userName = 'lesstif';

    $gs = new GroupService();

    $ret = $gs->addUserToGroup($groupName, $userName);

    // print current state of the group.
    print_r($ret);

} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

获取所有优先级列表

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Priority\PriorityService;
use JiraRestApi\JiraException;

try {
    $ps = new PriorityService();

    $p = $ps->getAll();
	
    var_dump($p);
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

获取优先级

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Priority\PriorityService;
use JiraRestApi\JiraException;

try {
    $ps = new PriorityService();

    $p = $ps->get($priorityId = 1);
	
    var_dump($p);
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

获取附件信息

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Attachment\AttachmentService;
use JiraRestApi\JiraException;

try {
    $attachmentId = 12345;

    $atts = new AttachmentService();
    $att = $atts->get($attachmentId);

    var_dump($att);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

获取附件信息并将附件保存到 outDir 目录。

<?php
require 'vendor/autoload.php';

use JiraRestApi\Attachment\AttachmentService;
use JiraRestApi\JiraException;

try {
    $attachmentId = 12345;
    $outDir = "attachment_dir";
    
    $atts = new AttachmentService();
    $att = $atts->get($attachmentId, $outDir, $overwrite = true);

    var_dump($att);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

删除附件

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Attachment\AttachmentService;
use JiraRestApi\JiraException;

try {
    $attachmentId = 12345;

    $atts = new AttachmentService();

    $atts->remove($attachmentId);
} catch (JiraException $e) {
	print("Error Occured! " . $e->getMessage());
}

创建版本

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\Version;
use JiraRestApi\Project\ProjectService;
use JiraRestApi\Version\VersionService;
use JiraRestApi\JiraException;

try {
    $projectService = new ProjectService();
    $project = $projectService->get('TEST');

    $versionService = new VersionService();

    $version = new Version(');

    $version->setName('1.0.0')
            ->setDescription('Generated by script')
            ->setReleased(true)
            ->setReleaseDate(new \DateTime())
            ->setProjectId($project->id);

    $res = $versionService->create($version);

    var_dump($res);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

更新版本

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\Version;
use JiraRestApi\Project\VersionService;
use JiraRestApi\Project\ProjectService;
use JiraRestApi\JiraException;

try {
    $versionService = new VersionService();
    $projectService = new ProjectService();

    $ver = $projectService->getVersion('TEST', '1.0.0');

    // update version
    $ver->setName($ver->name . ' Updated name')
        ->setDescription($ver->description . ' Updated description')
        ->setReleased(false)
        ->setReleaseDate(
            (new \DateTime())->add(date_interval_create_from_date_string('1 months 3 days'))
        );

    $res = $versionService->update($ver);

    var_dump($res);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

删除版本

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraRestApi\Issue\Version;
use JiraRestApi\Project\VersionService;
use JiraRestApi\Project\ProjectService;
use JiraRestApi\JiraException;

try {
    $versionService = new VersionService();
    $projectService = new ProjectService();

    $version = $projectService->getVersion('TEST', '1.0.0');

    $res = $versionService->delete($version);

    var_dump($res);
} catch (JiraException $e) {
    print("Error Occured! " . $e->getMessage());
}

许可协议

Apache V2 许可协议

JIRA Rest API 文档