让我告诉你og体育我在过去两周内建造的JIRA模块。我一直在考虑创建自己的模块一段时间。在最近的Powershell用户组后谈到了我的想法之后,我对这个想法有很多积极的反馈。所以我决定跳进去写它。

在这里设置舞台,我与之合作 jiraps. 有点。我们的开发周期深深集成了JIRA进入工作流程,因此我们周围有很多自动化。有时我们推动jiraps比打算被推动的更难。

指数

为什么不jiraps.

贾拉ps是og体育很棒的模块,很棒。有几个伟大的人,已经把很多时间放入了它,因为它具有如此良好的特征覆盖范围。它旨在适应您的验证。 jiraps与批量运营没有良好的用户故事,其中包含它的问题命令以及我最需要的问题。

它还拥有大量用户群,其中数十万个下载,并用于很多组织。此时对该模块进行的每og体育更改都需要非常密切关注向后兼容性。

干净的开始

通过构建自己的模块,我开始干净。我还没有用户基础,所以向后兼容性不是我必须处理的东西。我有机会做出非常不同的设计决策。最终,我正在为自己建造这个模块,但我觉得其他人会发现一些价值。

散装场景

我们的软件开发生命周期和工作流程非常依赖于Jira。我们对每个代码合并到主要分支中有og体育唯一的JIRA问题。我们拥有自动脚本,可在代码构建时更新问题,并再次将其发布到新环境中。我们最大的发布有超过800个问题,该问题被更新为生产部署的一部分。

这是我们在百次发布的那些较大的版本,一次通过Jiraps的释放数据转换和更新。在我们的环境中,对于问题的每个行动,它需要Jiraps大约2秒钟。因此,与释放相关的每个JIRA问题最终都会向释放添加3-4秒。每百个问题增加5-6分钟到发布时间。

我想看看我是否可以做一些事情来加速。

要求

我的主要要求是尽可能快地建立一些东西。 PowerShell对很多东西都很好,但速度往往不是那些东西之一。我决定将其作为C#中的二进制模块构建。如果我要以速度的名义创建自己的模块,我可能会一路走来。

我的初步计划是直接击中REST API。我嘲笑PowerShell的概念证明,以确保我能够管理身份验证和基本请求。在我移植到C#后,我发现了og体育带客户端库的Jira SDK。事实证明很容易与之合作。经过一点重构,我很高兴我将切换到SDK。

我的二级计划是为此模块补充Jiraps。我无法与其他模块已经存在的特征覆盖率竞争。此时我也没有计划尝试并复制所有其他功能。我会让Jiraps做到它所擅长的事情。我的希望是,如果我可以从一开始就可以敲入错误处理时,我可以在出现问题时提供更好的体验。

当前状态

我已经在这个模块上有很好的开始。我有5分cmdlet肉体,并使用良好的集成测试。这些命令应涵盖我正在研究的大部分用例。

最好考虑这个项目早期的alpha。它有效,但我还没有解决任何东西。因此,在我更接近官方发布之前,最好预计会发生变化。随意检查一下。我已经在Psgallery上发布了作为预发布版本。

    Find-Module jira -AllowPrerelease
    Install-Module -Scope CurrentUser -Name 贾拉 -AllowPrerelease
    开放式Jsession. -Credential (Get-Credential) -Uri "//youjiraserver" -Save
    Get-Jissue. -ID "Test-Issue"

The published version of the module that matches this article is 0.3.1-alpha. All the source is posted on github Kevinmarquette / Jira. 如果你想仔细看看。

要求和依赖性

This module depends on two other community modules. CredentialManager and PSFramework. These should install for you if you use Install-Module. Too soon to tell if I will still depend on these for the final release.

这也仅在PowerShell 5.1上进行了测试。我认为PowerShell的老验证将有问题,所以5.1现在是我现在的最低兼容性。因为我正在使用凭据,我可能会在PowerShell 6上发出问题,因为这是未经测试的。在此模块上完成工作之前,我计划支持PowerShell 6。

我是针对.NET标准2.0。如果您有Downlevel版本,您可能需要更新您的.NET版本。

cmdlets.

让我们来看看我已经实施的cmdlets。这就是你在这里的。

  • 开放式Jsession.
  • Get-Jissue.
  • 保存jissue.
  • Set-Jissue.
  • 加入jcomment.
  • 邀请jissuetransition.

The commands have very generic names at the moment. I expect the final version to have some kind of a prefix. Normally I would prefix them with 贾拉 but I am trying to avoid jiraps. name conflicts.

JIRA会议管理

我经常使用为我的模块创建会话的概念,其中我想要持续到常见的连接细节,而无需为每个命令提供。

    $Credential = Get-Credential
    $Uri = '//jira.contoso.com'
    开放式Jsession. -Credential $Credential -Uri $uri -Save

I added a -Save switch to persist those values for future sessions. So once you save your session info, then you can just call Open-JiraSession with no parameters.

    开放式Jsession.

When you call Open-JiraSession, a request is made to the Jira endpoint to verify that you can access the endpoint that you specified. It gives me a place to do some error handling before you need to use it for other commands.

获得问题

The whole point of this module is to get issues faster so I have to have a Get-Issue Cmdlet. Once you open your session, you can call Get-Issue to get the issue that you are looking for.

    Get-Jissue. TEST-1

运行这将从JIRA SDK中获取一些丰富的对象,该对象显示了您访问所有自定义字段的公共字段和赠款。您不仅可以查询单个问题,我们可以立即查询整个问题列表。

    $issues = 1..30 | ForEach-Object {"Test-$_"}
    Get-Jissue. $issues

从我可以告诉的,Jira SDK为所有这些问题做了og体育要求。这是我们开始看到最大的性能改进的地方。最后og体育选项是提供自己的自定义JQL查询以获取数据。

Get-Jissue. -Query "Key = Test-1" -MaxResults 200 -StartAt 0

这为您提供了灵活的,以获得您正在进行的仪表板的相同问题或您需要的其他任何问题。我还添加了一些基本分页功能,您可能需要它。

修改问题

一旦您有问题,您需要做的下一件事就是更改它。有两种方法可以更新问题。第og体育是修改对象,然后保存。

    $issue = Get-Jissue. -ID $issueID
    $issue.Description = 'This is a test issues'
    $issue | 保存jissue.

还支持修改自定义字段,但它们使用更像的语法更像如何更新Hashtable中的值。

    $issue["CustomField"] = 'Test value'
    $issue | 保存jissue.

The Save-Issue commits the changes that you made to the local object.

设置问题

The other way to make changes is to use the 设置问题 command and it will auto save your changes.

    Set-Jissue. -ID $issueID -Description 'This is a test issue'

    Get-Jissue. -ID $issueID | 
        Set-Jissue. -Description 'This is a test issue'

自定义字段以不同方式处理。现在,我接受og体育值的哈希特。

    Get-Jissue. $issueID |
        Set-Jissue. -CustomField @{
            CustomField = 'Test Value'
        } 

我正在寻找如何利用自定义字段的动态参数,但我还没有那个工作。

对于修改问题的所有命令,您应该能够指定问题ID或将现有问题对象传递给任何这些命令。有些命令需要有问题信息来进行更改。该设置问题是其中og体育命令之一,其中如果指定问题ID,那么它将首先获取问题,然后进行更改。

其他共同特征

目前,我还支持添加评论和转换问题。

    $issue = Get-Jissue. -ID $issueID
    $issue | 加入jcomment. 'Oh, Man! adding Comments'
    $issue | 邀请jissuetransition. -TransitionTo "In Progress"

这是关于我所有的标准问题更新所拥有的。我开始了这些,因为他们涵盖了我的大部分用例。我确定我会添加一些其他选项,如添加标签和附件。我想掩盖你可能批量做的功能,让你依靠它对它确实很好的东西依靠Jiraps。

异步实验

我在这个项目中拥有的og体育实验功能是为所有命令使用异步逻辑。有两种方式会影响这个模块。首先是您可以运行长查询,执行一些其他命令,然后回来收集结果。

    $asyncResult = Get-Jissue. -Query $largeQuery -Async
    Do-SomethingElse
    $issues | Receive-JAsyncResult
    $issues | 邀请jissuetransition. -TransitionTo "In Progress"

The idea is that the large query can go run on its own while I let other PowerShell run. When it is time to use the $issues, I can call Receive-AsyncResult to get them. If they are not ready yet, then we will wait for them to finish.

这是对模块影响的另一种方式是所有命令都在内部使用异步逻辑。因此,当我们管道大量问题列表时,每个动作都以异步方式启动。然后我等待所有结果在返回之前完成。看看这个例子。

    $issues = Get-Jissue. -Query $largeQuery
    $issues | 邀请jissuetransition. -TransitionTo "In Progress"

The Invoke-IssueTransition command will take a large list of issues and make an async call for each one of them to perform the transition. Those async calls are collected and Invoke-IssueTransition waits for them to finish before returning. My hope is that this will provide a noticeable performance difference when working with large sets of issues.

结束思想

异步逻辑是将制作或破坏此模块的逻辑。我已经在小规模上测试了这一切,一切都感到坚固。当我开始以更大的规模进行测试时,我会知道更多。我的目标用例是查询数千个问题并立即更新数百个问题。如果您可以在此模块中找到值,请告诉我。