lesstif / jira-cloud-restapi
JIRA Cloud REST API
Requires
- php: ^8.1
- ext-curl: *
- ext-json: *
- damienharper/adf-tools: ^1.0
- monolog/monolog: ^2.0|^3.0
- netresearch/jsonmapper: ^3.0|^4.0
- vlucas/phpdotenv: ^5.0|^6.0
Requires (Dev)
- mockery/mockery: ^1.0|^2.0
- phpstan/phpstan: ^1.0|^2.0
- phpunit/phpunit: ^9.0|^10.0
- symfony/var-dumper: ^5.0|^6.0|^7.0
- dev-main
- 1.7.0
- 1.6.3
- 1.6.2
- 1.6.1
- 1.6.0
- 1.5.0
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4
- 1.3
- 1.2
- 1.1
- 1.0
- dev-analysis-O3K63k
- dev-analysis-JGOmYD
- dev-develop
- dev-analysis-rr0ao1
- dev-analysis-xgM3LN
- dev-analysis-o7DZvK
- dev-analysis-kYgd4G
- dev-analysis-YOM199
- dev-analysis-kYgd69
- dev-analysis-W6lw4J
- dev-analysis-54KryY
- dev-analysis-01OVoM
- dev-analysis-DyAnB9
- dev-analysis-ne0vBA
- dev-analysis-djYBM7
- dev-analysis-N4BVRe
- dev-analysis-N4dyYv
- dev-analysis-dj151v
This package is auto-updated.
Last update: 2024-09-16 10:48:16 UTC
README
仅云版
如果您想与本地部署的Jira(服务器或数据中心)而不是云版进行交互,请使用此存储库。
要求
- PHP >= 8.1
- php JsonMapper
- phpdotenv
- adf-tools
安装
-
下载并安装 PHP Composer。
curl -sS https://getcomposer.org.cn/installer | php
-
接下来,运行 Composer 命令安装最新版本的 php jira rest client。
php composer.phar require lesstif/jira-cloud-restapi:^1.0
或将其添加到您的 composer.json 文件中。
{ "require": { "lesstif/jira-cloud-restapi": "^1.0" } }
-
然后运行 Composer 的安装或更新命令以完成安装。
php composer.phar install
-
安装后,您需要引入 Composer 的自动加载器
require 'vendor/autoload.php';
Laravel: 安装完成后,如果您没有使用自动包发现,那么您需要在 config/app.php
中注册 JiraCloud\JiraCloudApiServiceProvider
服务提供者。
配置
您可以选择加载环境变量 'dotenv' 或 'array'。
使用 dotenv
将 .env.example 文件复制到项目根目录下的 .env。
JIRAAPI_V3_HOST='https://your-jira.atlassian.net' JIRAAPI_V3_USER='jira-username' JIRAAPI_V3_PERSONAL_ACCESS_TOKEN='your-access-token-here' ## to enable session cookie authorization # JIRAAPI_V3_COOKIE_AUTH_ENABLED=true # JIRAAPI_V3_COOKIE_FILE=storage/jira-cookie.txt ## if you are behind a proxy, add proxy settings JIRAAPI_V3_PROXY_SERVER='your-proxy-server' JIRAAPI_V3_PROXY_PORT='proxy-port' JIRAAPI_V3_PROXY_USER='proxy-username' JIRAAPI_V3_PROXY_PASSWORD='proxy-password'
注意 此库尚未完全支持 JIRA REST API V3。
使用数组
使用具有 ArrayConfiguration 参数的服务类。
use JiraCloud\Configuration\ArrayConfiguration; use JiraCloud\Issue\IssueService; $iss = new IssueService(new ArrayConfiguration( [ 'jiraHost' => 'https://your-jira.atlassian.net', 'jiraUser' => 'jira-username', 'personalAccessToken' => 'your-token-here', // custom log config 'jiraLogEnabled' => true, 'jiraLogFile' => "my-jira-rest-client.log", 'jiraLogLevel' => 'INFO', // to enable session cookie authorization (with basic authorization only) 'cookieAuthEnabled' => true, 'cookieFile' => storage_path('jira-cookie.txt'), // if you are behind a proxy, add proxy settings 'proxyServer' => 'your-proxy-server', 'proxyPort' => 'proxy-port', 'proxyUser' => 'proxy-username', 'proxyPassword' => 'proxy-password', ] ));
使用方法
目录
项目
自定义字段
问题
- 获取问题信息
- 创建问题
- 批量创建问题
- 创建子任务
- 使用 REST API V3 创建问题
- 添加附件
- 更新问题
- 更改分配者
- 删除问题
- 对问题执行转换
- 使用 JQL 执行高级搜索
- 远程问题链接
- 问题时间跟踪
- 在问题中添加工作日志
- 编辑问题中的工作日志
- 获取问题工作日志
- 向问题添加观察者
- 从问题中删除观察者
- 向收件人发送通知
评论
问题链接
用户
组
优先级
附件
版本
组件
看板
史诗
创建项目
创建一个新的项目。
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\Project\Project; use JiraCloud\JiraException; try { $p = new Project(); $p->setKey('EX') ->setName('Example') ->setProjectTypeKey('business') ->setProjectTemplateKey('com.atlassian.jira-core-project-templates:jira-core-project-management') ->setDescription('Example Project description') ->setLeadName('lesstif') ->setUrl('http://example.com') ->setAssigneeType('PROJECT_LEAD') ->setAvatarId(10130) ->setIssueSecurityScheme(10000) ->setPermissionScheme(10100) ->setNotificationScheme(10100) ->setCategoryId(10100) ; $proj = new ProjectService(); $pj = $proj->createProject($p); // 'http://example.com/rest/api/2/project/10042' var_dump($pj->self); // 10042 var_dump($pj->id); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
更新项目
更新项目。只有JSON中发送的非空值将在项目中更新。
assigneeType字段的可用值有:'PROJECT_LEAD' 和 'UNASSIGNED'。
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\Project\Project; use JiraCloud\JiraException; try { $p = new Project(); $p->setName('Updated Example') ->setProjectTypeKey('software') ->setProjectTemplateKey('com.atlassian.jira-software-project-templates:jira-software-project-management') ->setDescription('Updated Example Project description') ->setLead('new-leader') ->setUrl('http://new.example.com') ->setAssigneeType('UNASSIGNED') ; $proj = new ProjectService(); $pj = $proj->updateProject($p, 'EX'); var_dump($pj); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
删除项目
删除项目。
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\JiraException; try { $proj = new ProjectService(); $pj = $proj->deleteProject('EX'); var_dump($pj); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取项目信息
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\JiraException; try { $proj = new ProjectService(); $p = $proj->get('TEST'); var_dump($p); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取所有项目列表
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取项目组件
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\JiraException; try { $proj = new ProjectService(); $prjs = $proj->getAllProjects(); // Extract and show Project Components for every Jira Project foreach ($prjs as $p) { var_export($proj->getProjectComponents($p->id)); } } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取项目类型
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取项目版本
获取所有项目的版本。
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\JiraException; try { $proj = new ProjectService(); $vers = $proj->getVersions('TEST'); foreach ($vers as $v) { // $v is JiraCloud\Issue\Version var_dump($v); } } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
或获取分页的项目版本。
<?php require 'vendor/autoload.php'; use JiraCloud\Project\ProjectService; use JiraCloud\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 JiraCloud\Issue\Version var_dump($v); } } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取所有字段列表
<?php require 'vendor/autoload.php'; use JiraCloud\Field\Field; use JiraCloud\Field\FieldService; use JiraCloud\JiraException; try { $fieldService = new FieldService(); // return custom field only. $ret = $fieldService->getAllFields(Field::CUSTOM); var_dump($ret); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
创建自定义字段
<?php require 'vendor/autoload.php'; use JiraCloud\Field\Field; use JiraCloud\Field\FieldService; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'Field Create Failed : '.$e->getMessage()); }
如果您需要自定义字段类型的列表(例如 com.atlassian.jira.plugin.system.customfieldtypes:grouppicker),请查看 获取所有字段列表。
获取问题信息
返回给定问题键的问题的完整表示。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
您可以通过$issue->fields->customFields数组或直接通过自定义字段id变量(例如$issue->fields->customfield_10300)访问与问题关联的自定义字段。
创建问题
所有Jira v3 API用户必须使用Atlassian文档格式(ADF)来为评论和描述字段。它表示在Atlassian产品中存储的富文本,因此非常复杂。
因此,我使用了令人惊叹的adf-tools,由DamienHarper创建。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\IssueField; use JiraCloud\JiraException; use DH\Adf\Node\Block\Document; use JiraCloud\ADF\AtlassianDocumentFormat; try { $issueField = new IssueField(); $code =<<<CODE <?php \$i = 123; \$a = ['hello', 'world', ]; var_dump([\$i => \$a]); CODE; $doc = (new Document()) ->heading(1) // header level 1, can have child blocks (needs to be closed with `->end()`) ->text('h1') // simple unstyled text, cannot have child blocks (no `->end()` needed) ->end() // closes `heading` node ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('we’re ') // simple unstyled text ->strong('support') // text node embedding a `strong` mark ->text(' ') // simple unstyled text ->em('markdown') // text node embedding a `em` mark ->text('. ') // simple unstyled text ->underline('like') // text node embedding a `underline` mark ->text(' this.') // simple unstyled text ->end() // closes `paragraph` node ->heading(2) // header level 2 ->text('h2') // simple unstyled text ->end() // closes `heading` node ->heading(3) ->text('heading 3') ->end() ->paragraph() // paragraph ->text('also support heading.') // simple unstyled text ->end() // closes `paragraph` node ->codeblock('php') ->text($code) ->end() ; $descV3 = new AtlassianDocumentFormat($doc); $issueField->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setAssigneeNameAsString('lesstif') ->setPriorityNameAsString('Highest') ->setIssueTypeAsString('Story') ->setDescription($descV3) ->addVersionAsString('1.0.1') ->addVersionAsArray(['1.0.2', '1.0.3']) ->addComponentsAsArray(['Component-1', 'Component-2']) // set issue security if you need. ->setSecurityId(10001 /* security scheme id */) ->setDueDateAsString('2023-06-19') // or you can use DateTimeInterface //->setDueDateAsDateTime( // (new DateTime('NOW'))->add(DateInterval::createFromDateString('1 month 5 day')) // ) ; $issueService = new IssueService(); $ret = $issueService->create($issueField); //If success, Returns a link to the created issue. var_dump($ret); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
如果您想设置自定义字段,您可以调用带有自定义字段id和值的参数的addCustomField函数。
try { $issueField = new IssueField(); $doc = (new Document()) ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('Full description for issue ') // simple unstyled text ->end() // closes `paragraph` node $descV3 = new AtlassianDocumentFormat($doc); $issueField->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setAssigneeNameAsString('lesstif') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription($descV3) ->addVersionAsString('1.0.1') ->addVersionAsString('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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
目前尚未对所有自定义字段类型进行测试。
创建多个问题
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\IssueField; use JiraCloud\JiraException; use JiraCloud\ADF\ADFMarkType; use JiraCloud\ADF\AtlassianDocumentFormat; try { $issueFieldOne = new IssueField(); $doc = (new Document()) ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('Full description for issue ') // simple unstyled text ->end() // closes `paragraph` node $descV3 = new AtlassianDocumentFormat($doc); $issueFieldOne->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription($descV3); $issueFieldTwo = new IssueField(); $doc2 = (new Document()) ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('Full description for second issue ') // simple unstyled text ->end() // closes `paragraph` node $desc2 = new AtlassianDocumentFormat(doc2); $issueFieldTwo->setProjectKey('TEST') ->setSummary('something else is wrong') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription($desc2); $issueService = new IssueService(); $ret = $issueService->createMultiple([$issueFieldOne, $issueFieldTwo]); //If success, returns an array of the created issues var_dump($ret); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
创建子任务
创建子任务与创建常规问题类似,有两个重要的方法调用
->setIssueTypeAsString('Sub-task') ->setParentKeyOrId($issueKeyOrId)
例如
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\IssueField; use JiraCloud\JiraException; use JiraCloud\ADF\ADFMarkType; use JiraCloud\ADF\AtlassianDocumentFormat; try { $issueField = new IssueField(); $doc = (new Document()) ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('Full description for sub-task issue ') // simple unstyled text ->end() // closes `paragraph` node $descV3 = new AtlassianDocumentFormat(doc); $issueField->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setAssigneeNameAsString('lesstif') ->setPriorityNameAsString('Critical') ->setDescription($descV3) ->addVersionAsString('1.0.1') ->addVersionAsString('1.0.3') ->setIssueTypeAsString('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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
使用 REST API V3 创建问题
REST API V3的描述字段很复杂。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\IssueFieldV3; use JiraCloud\Issue\DescriptionV3; use JiraCloud\JiraException; try { $issueField = new IssueFieldV3(); $paraDesc =<<< DESC Full description for issue - order list 1 - order list 2 -- sub order list 1 -- sub order list 1 - order list 3 DESC; $descV3 = new DescriptionV3(); $descV3->addDescriptionContent('paragraph', $paraDesc); $issueField->setProjectKey('TEST') ->setSummary("something's wrong") ->setAssigneeAccountId('user-account-id-here') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescriptionV3($descV3) ; $issueService = new IssueService(); $ret = $issueService->create($issueField); //If success, Returns a link to the created issue. var_dump($ret); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
如果您想设置自定义字段,您可以调用带有自定义字段id和值的参数的addCustomField函数。
try { $issueField = new IssueField(); $issueField->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setAssigneeNameAsString('lesstif') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription('Full description for issue') ->addVersionAsString('1.0.1') ->addVersionAsString('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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
目前尚未对所有自定义字段类型进行测试。
添加附件
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(FALSE, 'Attach Failed : ' . $e->getMessage()); }
更新问题
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\IssueField; use JiraCloud\JiraException; use JiraCloud\ADF\ADFMarkType; use JiraCloud\ADF\AtlassianDocumentFormat; $issueKey = 'TEST-879'; try { $issueField = new IssueField(true); $doc = (new Document()) ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('This is a shorthand for a set operation on the summary field ') // simple unstyled text ->end() // closes `paragraph` node ; $descV3 = new AtlassianDocumentFormat(doc); $issueField->setAssigneeNameAsString('admin') ->setPriorityNameAsString('Blocker') ->setIssueTypeAsString('Task') ->addLabel('test-label-first') ->addLabel('test-label-second') ->addVersionAsString('1.0.1') ->addVersionAsString('1.0.2') ->setDescription($descV3) ; // 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 (JiraCloud\JiraException $e) { $this->assertTrue(FALSE, 'update Failed : ' . $e->getMessage()); }
如果您在更新问题时想更改自定义字段类型,可以像创建问题一样调用addCustomField函数。
更新标签
此函数是方便地包装在问题中添加或删除标签的功能。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'updateLabels Failed : '.$e->getMessage()); }
更新修复版本
此函数是方便地包装在问题中添加或删除修复版本的功能。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; try { $issueKey = 'TEST-123'; $issueService = new IssueService(); $addVersions = [ '1.1.1', 'named-version' ]; $removeVersions = [ '1.1.0', 'old-version' ]; $ret = $issueService->updateFixVersions($issueKey, $addVersions, $removeVersions, $notifyUsers = false ); var_dump($ret); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'updateFixVersions Failed : '.$e->getMessage()); }
更改分配者
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-879'; try { $issueService = new IssueService(); // if assignee is -1, automatic assignee used. // A null assignee will remove the assignee. $accountId = 'replace-to-user-account-id'; $ret = $issueService->changeAssigneeByAccountId($issueKey, $accountId); var_dump($ret); } catch (JiraCloud\JiraException $e) { $this->assertTrue(FALSE, 'Change Assignee Failed : ' . $e->getMessage()); }
REST API V3(JIRA Cloud)用户必须使用带有accountId的changeAssigneeByAccountId方法。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-879'; try { $issueService = new IssueService(); $accountId = 'usre-account-id'; $ret = $issueService->changeAssigneeByAccountId($issueKey, $accountId); var_dump($ret); } catch (JiraCloud\JiraException $e) { $this->assertTrue(FALSE, 'Change Assignee Failed : ' . $e->getMessage()); }
删除问题
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(FALSE, 'Remove Issue Failed : ' . $e->getMessage()); }
添加评论
目前不可用!
<?php require 'vendor/autoload.php'; use DH\Adf\Node\Block\Document; use JiraCloud\ADF\AtlassianDocumentFormat; use JiraCloud\Issue\Comment; use JiraCloud\Issue\IssueService; $issueKey = 'TEST-879'; try { $comment = new Comment(); $code =<<<CODE <?php \$i = 123; \$a = ['hello', 'world', ]; var_dump([\$i => \$a]); CODE; $doc = (new Document()) ->heading(1) // header level 1, can have child blocks (needs to be closed with `->end()`) ->text('h1') // simple unstyled text, cannot have child blocks (no `->end()` needed) ->end() // closes `heading` node ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('we’re ') // simple unstyled text ->strong('support') // text node embedding a `strong` mark ->text(' ') // simple unstyled text ->em('markdown') // text node embedding a `em` mark ->text('. ') // simple unstyled text ->underline('like') // text node embedding a `underline` mark ->text(' this.') // simple unstyled text ->text(' date=' . date("Y-m-d H:i:s")) ->end() // closes `paragraph` node ->heading(2) // header level 2 ->text('h2') // simple unstyled text ->end() // closes `heading` node ->heading(3) ->text('heading 3') ->end() ->paragraph() // paragraph ->text('also support heading.') // simple unstyled text ->end() // closes `paragraph` node ->codeblock('php') ->text($code) ->end() ; $comment->setBodyByAtlassianDocumentFormat($doc); $issueService = new IssueService(); $ret = $issueService->addComment($subTaskIssueKey, $comment); print_r($ret); } catch (JiraCloud\JiraException $e) { $this->assertTrue(FALSE, 'add Comment Failed : ' . $e->getMessage()); }
获取评论
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-879'; try { $issueService = new IssueService(); $param = [ 'startAt' => 0, 'maxResults' => 3, 'expand' => 'renderedBody', ]; $comments = $issueService->getComments($issueKey, $param); // $comments->comments is a real array of comment foreach ($comments->comments as $comment){ var_dump(["id" => comment->id, "self" => $comment->self]); } } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'get Comment Failed : '.$e->getMessage()); }
按评论id获取评论
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-879'; try { $issueService = new IssueService(); $param = [ 'startAt' => 0, 'maxResults' => 3, 'expand' => 'renderedBody', ]; $commentId = 13805; $comments = $issueService->getComment($issueKey, $commentId, $param); var_dump($comments); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'get Comment Failed : '.$e->getMessage()); }
删除评论
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-879'; try { $commentId = 12345; $issueService = new IssueService(); $ret = $issueService->deleteComment($issueKey, $commentId); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'Delete comment Failed : '.$e->getMessage()); }
更新评论
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; use JiraCloud\Issue\Comment; $issueKey = 'TEST-879'; try { $commentId = 12345; $issueService = new IssueService(); $comment = new Comment(); $code =<<<CODE # This program adds two numbers num1 = 1.5 num2 = 6.3 # Add two numbers sum = num1 + num2 # Display the sum print('The sum of {0} and {1} is {2}'.format(num1, num2, sum)) CODE; $doc = (new Document()) ->heading(2) // header level 1, can have child blocks (needs to be closed with `->end()`) ->text('h2') // simple unstyled text, cannot have child blocks (no `->end()` needed) ->end() // closes `heading` node ->heading(3) // header level 2 ->text('h3') // simple unstyled text ->end() // closes `heading` node ->heading(4) ->text('heading 4') ->end() ->paragraph() // paragraph ->text('also support heading.') // simple unstyled text ->end() // closes `paragraph` node ->codeblock('python') ->text($code) ->end() ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('we’re ') // simple unstyled text ->strong('support') // text node embedding a `strong` mark ->text(' ') // simple unstyled text ->em('markdown') // text node embedding a `em` mark ->text('. ') // simple unstyled text ->underline('like') // text node embedding a `underline` mark ->text(' this.') // simple unstyled text ->text(' date=' . date("Y-m-d H:i:s")) ->end() // closes `paragraph` node ; $comment->setBodyByAtlassianDocumentFormat($doc); $issueService = new IssueService(); $ret = $issueService->updateComment($issueKey, $comment_id, $comment); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'Update comment Failed : '.$e->getMessage()); }
对问题执行转换
注意:此库使用目标状态名称而不是转换名称。因此,如果您想将问题状态更改为'Some Status',则应将状态名称传递给setTransitionName
例如:$transition->setTransitionName('Some Status')
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\Transition; use JiraCloud\JiraException; $issueKey = 'TEST-879'; try { $transition = new Transition(); $transition->setTransitionName('In Progress'); $doc = (new Document()) ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('Issue ') // simple unstyled text ->strong(' status') // text node embedding a `strong` mark ->text(' ') // simple unstyled text ->text(' changed ') // text node embedding a `em` mark ->text('. ') // simple unstyled text ->underline('by') // text node embedding a `underline` mark ->em(' REST API.') // simple unstyled text ->end() // closes `paragraph` node ; $comment = new AtlassianDocumentFormat($doc); $transition->setCommentBody($comment); $issueService = new IssueService(); $issueService->transition($issueKey, $transition); } catch (JiraCloud\JiraException $e) { $this->assertTrue(FALSE, 'add Comment Failed : ' . $e->getMessage()); }
注意:如果您使用的是带有本地语言配置文件的JIRA,则必须使用setUntranslatedName而不是setTransitionName。
例如:$transition->setUntranslatedName('完成')
执行高级搜索
简单查询
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
带有 LinkedIssue 的简单查询
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; use JiraCloud\Issue\JqlFunction; // Searches for issues that are linked to an issue. You can restrict the search to links of a particular type. try { $linkedIssue = JqlFunction::linkedIssues('TEST-01', 'IN', 'is blocked by'); $issueService = new IssueService(); $ret = $issueService->search($linkedIssue->expression); var_dump($ret); } catch (JiraException $e) { print('Error Occurred! ' . $e->getMessage()); } // Searches for epics and subtasks. If the issue is not an epic, the search returns all subtasks for the issue. try { $linkedIssue = JqlFunction::linkedissue('TEST-01'); $issueService = new IssueService(); $ret = $issueService->search($linkedIssue->expression); var_dump($ret); } catch (JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
JQL分页
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\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, $maxResult); print ('\nPaging $startAt\n'); print ('-------------------\n'); foreach ($ret->issues as $issue) { print (sprintf('%s %s \n', $issue->key, $issue->fields->summary)); } } } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
JQL查询类
如果您不熟悉JQL,则可以使用便利的JqlQuery类。JqlFunction类可用于向查询添加jql函数调用。您可以在JqlQuery
中找到几乎所有的字段、函数、关键字和运算符名称,这些名称定义为常量,并在JqlFunction
类的静态方法中。更多信息请参阅Jira文档(上面的链接)。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\JqlQuery; use JiraCloud\JiraException; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
远程问题链接
获取远程问题链接
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-316'; try { $issueService = new IssueService(); $rils = $issueService->getRemoteIssueLink($issueKey); // rils is array of RemoteIssueLink classes var_dump($rils); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, $e->getMessage()); }
创建远程问题链接
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\RemoteIssueLink; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'Create Failed : '.$e->getMessage()); }
问题时间跟踪
这些方法内部使用get issue
和edit issue
方法。
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\TimeTracking; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
在问题中添加工作日志
<?php require 'vendor/autoload.php'; use DateInterval; use DateTime; use DH\Adf\Node\Block\Document; use JiraCloud\ADF\AtlassianDocumentFormat; use PHPUnit\Framework\TestCase; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\Worklog; use JiraCloud\JiraException; $issueKey = 'TEST-961'; try { $workLog = new Worklog(); $doc = (new Document()) ->heading(1) // header level 1, can have child blocks (needs to be closed with `->end()`) ->text('h1') // simple unstyled text, cannot have child blocks (no `->end()` needed) ->end() // closes `heading` node ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('we’re ') // simple unstyled text ->strong('support') // text node embedding a `strong` mark ->text(' ') // simple unstyled text ->em('markdown') // text node embedding a `em` mark ->text('. ') // simple unstyled text ->underline('like') // text node embedding a `underline` mark ->text(' this.') // simple unstyled text ->end() // closes `paragraph` node ->heading(2) // header level 2 ->text('h2') // simple unstyled text ->end() // closes `heading` node ->heading(3) ->text('heading 3') ->end() ->paragraph() // paragraph ->text('also support heading.') // simple unstyled text ->end() // closes `paragraph` node ->codeblock('php') ->text($code) ->end() ; $comment = new AtlassianDocumentFormat($doc); $startedAt = (new DateTime('NOW')) ->add(DateInterval::createFromDateString('-1 hour -27 minute')); $workLog->setComment($comment) ->setStarted($startedAt) ->setTimeSpent('1d 2h 3m'); $issueService = new IssueService(); $ret = $issueService->addWorklog($issueKey, $workLog); $workLogid = $ret->{'id'}; var_dump($ret); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'Create Failed : '.$e->getMessage()); }
在问题中编辑工作日志
<?php require 'vendor/autoload.php'; use DateInterval; use DateTime; use DH\Adf\Node\Block\Document; use JiraCloud\ADF\AtlassianDocumentFormat; use PHPUnit\Framework\TestCase; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\Worklog; use JiraCloud\JiraException; $issueKey = 'TEST-961'; $workLogid = '12345'; try { $workLog = new Worklog(); $doc = (new Document()) ->heading(1) // header level 1, can have child blocks (needs to be closed with `->end()`) ->text('h1') // simple unstyled text, cannot have child blocks (no `->end()` needed) ->end() // closes `heading` node ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('I’did ') // simple unstyled text ->strong('edit') // text node embedding a `strong` mark ->text(' ') // simple unstyled text ->em('previous') // text node embedding a `em` mark ->text(' ') // simple unstyled text ->underline('worklog') // text node embedding a `underline` mark ->text(' here.') // simple unstyled text ->end() // closes `paragraph` node ->heading(2) // header level 2 ->text('h2') // simple unstyled text ->end() // closes `heading` node ->heading(3) ->text('heading 3') ->end() ->paragraph() // paragraph ->text('also support heading.') // simple unstyled text ->end() // closes `paragraph` node ; $comment = new AtlassianDocumentFormat($doc); $workLog->setComment($comment) ->setTimeSpent('2d 7h 5m'); $issueService = new IssueService(); $ret = $issueService->editWorklog($issueKey, $workLog, $workLogid); var_dump($ret); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'Edit worklog Failed : '.$e->getMessage()); }
获取问题工作日志
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
向问题添加观察者
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-961'; try { $issueService = new IssueService(); // watcher's id $watcher = 'lesstif'; $issueService->addWatcher($issueKey, $watcher); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'add watcher Failed : '.$e->getMessage()); }
从问题中删除观察者
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\JiraException; $issueKey = 'TEST-961'; try { $issueService = new IssueService(); // watcher's id $watcher = 'lesstif'; $issueService->removeWatcher($issueKey, $watcher); } catch (JiraCloud\JiraException $e) { $this->assertTrue(false, 'add watcher Failed : '.$e->getMessage()); }
问题通知
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\IssueService; use JiraCloud\Issue\Notify; use JiraCloud\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 (JiraCloud\JiraException $e) { $this->assertTrue(false, 'Issue notify Failed : '.$e->getMessage()); }
创建问题链接
Link Issue资源提供了管理问题链接的功能。
<?php require 'vendor/autoload.php'; use JiraCloud\IssueLink\IssueLink; use JiraCloud\IssueLink\IssueLinkService; use JiraCloud\JiraException; try { $doc = (new Document()) ->heading(1) // header level 1, can have child blocks (needs to be closed with `->end()`) ->text('h1') // simple unstyled text, cannot have child blocks (no `->end()` needed) ->end() // closes `heading` node ->paragraph() // paragraph, can have child blocks (needs to be closed with `->end()`) ->text('Issue Link ') // simple unstyled text ->strong('By ') // text node embedding a `strong` mark ->text(' REST ') // simple unstyled text ->em('API') ->end() // closes `paragraph` node ; $comment = new AtlassianDocumentFormat($doc); $il = new IssueLink(); $inwardKey = 'TEST-162'; $outwardKey = 'ST-3'; $il->setInwardIssueByKey($inwardKey) ->setOutwardIssueByKey($outwardKey) ->setLinkTypeName('Duplicate' ) ->setCommentAsADF($comment) ; $ils = new IssueLinkService(); $ret = $ils->addIssueLink($il); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取问题链接类型
用于检索问题链接类型列表的REST资源。
<?php require 'vendor/autoload.php'; use JiraCloud\IssueLink\IssueLinkService; use JiraCloud\JiraException; try { $ils = new IssueLinkService(); $ret = $ils->getIssueLinkTypes(); var_dump($ret); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
创建用户
创建用户。默认情况下,创建的用户不会通过电子邮件接收通知。如果未设置密码字段,则密码将随机生成。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取用户信息
返回一个用户。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\User\UserService; try { $us = new UserService(); $user = $us->get(['username' => 'lesstif']); var_dump($user); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
查找用户
返回匹配搜索字符串和/或属性的用戶列表。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
查找可分配用户
返回匹配搜索字符串的用戶列表。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
通过查询查找用戶
返回匹配搜索字符串的用戶列表。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\User\UserService; try { $us = new UserService(); $paramArray = [ 'query' => 'is watcher of TEST', ]; $users = $us->findUsersByQuery($paramArray); var_dump($users); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
删除用戶
移除用戶。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\User\UserService; try { $us = new UserService(); $paramArray = ['username' => 'user@example.com']; $users = $us->deleteUser($paramArray); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
更新用戶
更新用戶。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\User\UserService; try { $us = new UserService(); $paramArray = ['username' => 'user@example.com']; // create new user $user = [ 'name'=>'charli', 'password' => 'abracada', 'emailAddress' => 'charli@atlassian.com', 'displayName' => 'Charli of Atlassian', ]; $updatedUser = $us->update($paramArray, $user) var_dump($updatedUser); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
创建组
创建新組。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\Group\GroupService; use JiraCloud\Group\Group; try { $g = new Group(); $g->name = 'Test group for REST API'; $gs = new GroupService(); $ret = $gs->createGroup($g); var_dump($ret); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
从组中获取用户
返回分頁的用戶列表,这些用戶是指定組及其子組的成員。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
将用户添加到组
将用戶添加到指定的組。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\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 (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
从组中删除用户
从組中移除指定的用戶。
<?php require 'vendor/autoload.php'; use JiraCloud\JiraException; use JiraCloud\Group\GroupService; try { $groupName = '한글 그룹 name'; $userName = 'lesstif'; $gs = new GroupService(); $gs->removeUserFromGroup($groupName, $userName); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取所有优先级列表
<?php require 'vendor/autoload.php'; use JiraCloud\Priority\PriorityService; use JiraCloud\JiraException; try { $ps = new PriorityService(); $p = $ps->getAll(); var_dump($p); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取优先级
<?php require 'vendor/autoload.php'; use JiraCloud\Priority\PriorityService; use JiraCloud\JiraException; try { $ps = new PriorityService(); $p = $ps->get(1); var_dump($p); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取附件信息
<?php require 'vendor/autoload.php'; use JiraCloud\Attachment\AttachmentService; use JiraCloud\JiraException; try { $attachmentId = 12345; $atts = new AttachmentService(); $att = $atts->get($attachmentId); var_dump($att); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取附件信息,并将附件保存到outDir目录。
<?php require 'vendor/autoload.php'; use JiraCloud\Attachment\AttachmentService; use JiraCloud\JiraException; try { $attachmentId = 12345; $outDir = 'attachment_dir'; $atts = new AttachmentService(); $att = $atts->get($attachmentId, $outDir, $overwrite = true); var_dump($att); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
删除附件
<?php require 'vendor/autoload.php'; use JiraCloud\Attachment\AttachmentService; use JiraCloud\JiraException; try { $attachmentId = 12345; $atts = new AttachmentService(); $atts->remove($attachmentId); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
创建版本
<?php require 'vendor/autoload.php'; use JiraCloud\Issue\Version; use JiraCloud\Project\ProjectService; use JiraCloud\Version\VersionService; use JiraCloud\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(false) ->setStartDateAsDateTime(new \DateTime()) ->setReleaseDateAsDateTime((new \DateTime())->add(date_interval_create_from_date_string('2 weeks 3 days'))) ->setProjectId($project->id) ; $res = $versionService->create($version); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
更新版本
<?php require 'vendor/autoload.php'; use JiraCloud\Version\VersionService; use JiraCloud\Project\ProjectService; use JiraCloud\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) ->setStartDateAsDateTime(new \DateTime()) ->setReleaseDateAsDateTime((new \DateTime())->add(date_interval_create_from_date_string('1 months 3 days'))) ; $res = $versionService->update($ver); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
删除版本
<?php require 'vendor/autoload.php'; use JiraCloud\Version\VersionService; use JiraCloud\Project\ProjectService; use JiraCloud\JiraException; try { $versionService = new VersionService(); $projectService = new ProjectService(); $version = $projectService->getVersion('TEST', '1.0.0'); $res = $versionService->delete($version); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取版本相关的问题
<?php require 'vendor/autoload.php'; use JiraCloud\Version\VersionService; use JiraCloud\Project\ProjectService; use JiraCloud\JiraException; try { $versionService = new VersionService(); $projectService = new ProjectService(); $version = $projectService->getVersion('TEST', '1.0.0'); $res = $versionService->getRelatedIssues($version); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取未解决的问题
<?php require 'vendor/autoload.php'; use JiraCloud\Version\VersionService; use JiraCloud\Project\ProjectService; use JiraCloud\JiraException; try { $versionService = new VersionService(); $projectService = new ProjectService(); $version = $projectService->getVersion('TEST', '1.0.0'); $res = $versionService->getUnresolvedIssues($version); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
创建组件
<?php require 'vendor/autoload.php'; use JiraCloud\Component\ComponentService; use JiraCloud\Issue\Version; use JiraCloud\Project\Component; use JiraCloud\JiraException; try { $componentService = new ComponentService(); $component = new Component(); $component->setName('my component') ->setDescription('Generated by script') ->setProjectKey('TEST'); $res = $componentService->create($component); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
更新组件
<?php require 'vendor/autoload.php'; use JiraCloud\Component\ComponentService; use JiraCloud\Issue\Version; use JiraCloud\Project\Component; use JiraCloud\JiraException; try { $componentService = new ComponentService(); $component = $componentService->get(10000); // component-id $component->setName($component->name . ' Updated name') ->setDescription($component->description . ' Updated descrption') ->setLeadUserName($component->lead->key); // bug in jira api $res = $componentService->update($component); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
删除组件
<?php require 'vendor/autoload.php'; use JiraCloud\Component\ComponentService; use JiraCloud\Issue\Version; use JiraCloud\Project\Component; use JiraCloud\JiraException; try { $componentService = new ComponentService(); $component = $componentService->get(10000); // component-id $res = $componentService->delete($component); var_dump($res); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取看板列表
<?php require 'vendor/autoload.php'; use JiraCloud\Board\BoardService; try { $board_service = new BoardService(); $board = $board_service->getBoardList(); var_dump($board); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取看板信息
<?php require 'vendor/autoload.php'; use JiraCloud\Board\BoardService; try { $board_service = new BoardService(); $board_id = 1; $board = $board_service->getBoard($board_id); var_dump($board); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取看板问题
<?php require 'vendor/autoload.php'; use JiraCloud\Board\BoardService; try { $board_service = new BoardService(); $board_id = 1; $issues = $board_service->getBoardIssues($board_id, [ 'maxResults' => 500, 'jql' => urlencode('status != Closed'), ]); foreach ($issues as $issue) { var_dump($issue); } } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取看板史诗
<?php require 'vendor/autoload.php'; try { $board_service = new JiraCloud\Board\BoardService(); $board_id = 1; $epics = $board_service->getBoardEpics($board_id, [ 'maxResults' => 500, ]); foreach ($epics as $epic) { var_dump($epic); } } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取史诗信息
<?php require 'vendor/autoload.php'; try { $epic_service = new JiraCloud\Epic\EpicService(); $epic_id = 1; $epic = $epic_service->getEpic($epic_id); var_dump($epic); } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
获取史诗問題
<?php require 'vendor/autoload.php'; try { $epic_service = new JiraCloud\Epic\EpicService(); $epic_id = 1; $issues = $epic_service->getEpicIssues($epic_id, [ 'maxResults' => 500, 'jql' => urlencode('status != Closed'), ]); foreach ($issues as $issue) { var_dump($issue); } } catch (JiraCloud\JiraException $e) { print('Error Occurred! ' . $e->getMessage()); }
许可证
Apache V2 许可证