2
1
0

親チケットのステータスを「Done」(完了)に変更したときに配下の子チケットのステータスも合わせて完了にするにはどのようにすればよいでしょうか?

    Commentコメントを追加...

    2 回答

    1.  
      3
      2
      1

      こちらは標準の機能では実現できないです。例えば下記のアドオンを利用しますと、

      https://marketplace.atlassian.com/apps/5048/jsu-suite-utilities-for-jira?hosting=server&tab=overview

      事後操作に、

      • Transition on linked issues (or on sub-tasks, issues in epic)

      という機能が追加になりますので、実現できるかと思います。

        Commentコメントを追加...
      1.  
        1
        0
        -1

        ご回答ありがとうございます。
        標準機能ではできないのですね。
        当方、スクリプトを使ってMutableIssueクラスのsetStatusIdメソッドで更新させる方法でやってみたのですが、
        うまくいきませんでした。

        JSUは当環境にアドオン済みでした。
        事後操作リストには「Transition on linked issues (or on sub-tasks, issues in epic)」がないのですが、
        「Linked Transition(JSU)」というのはあります。もう少し詳しく教えてください。

        1. RYOITO

          このブログで紹介されてますね。

          Linked Transitionでよさそうですよ、詳細としてJSUのマニュアルがリンクされてました。トリガとするリンクのタイプ、実行するトランジション、実行するユーザを選択していけば動くような感じっぽいですね。

          使ったことはないですが、(ターゲットにリンクされたIssueがたくさんある場合)リンクするIssueのステータスを検査をしてくれるようなので、子供が終了したら親を終了させるなども出来そうだし、結構使えそうな事後操作ですね。 

        2. 樋口晃

          私が使っているJSU のバージョンと、 だい さんが使っているバージョンが違う様です。どのバージョンをお使いですか? 

          ちなみに、スクリプトを使う場合は トランジションを実行しなければいけないので、複雑だったと記憶しています。こちらにサンプルが有りました。

          https://developer.atlassian.com/server/jira/platform/performing-issue-operations/#transitioning-an-existing-issue

        3. Shuzaburo Doba

          なるほど、スクリプトからだとトランジションを実行する必要があるのですね!

          確かに、以下のようにサブタスクに対してトランジションを実行させたらうまくいったように思えます。

          import com.atlassian.jira.component.ComponentAccessor;
          import com.atlassian.jira.bc.issue.IssueService;
          import com.atlassian.jira.issue.changehistory.ChangeHistoryManager;
          import com.atlassian.jira.issue.IssueManager;
          import com.atlassian.jira.issue.Issue;
          import org.ofbiz.core.entity.GenericValue;
          import com.atlassian.jira.issue.changehistory.ChangeHistory;
          import com.atlassian.jira.issue.history.ChangeItemBean;
          import com.atlassian.jira.user.ApplicationUser;
          import com.atlassian.jira.issue.status.Status;
          import com.atlassian.jira.bc.issue.IssueService.TransitionValidationResult;
          import com.atlassian.jira.bc.issue.IssueService.IssueResult;
          import com.atlassian.jira.issue.IssueInputParametersImpl;
          import java.util.*;
          
          // サブタスクに実行させるトランジション ID
          int actionId = 31;
          // 判定する親課題のステータスの名前
          String validateStatusName = "完了";
          
          ChangeHistoryManager changeHistoryManager = ComponentAccessor.getChangeHistoryManager();
          IssueManager issueManager = ComponentAccessor.getIssueManager();
          IssueService issueService = ComponentAccessor.getIssueService();
          
          Issue issue = issueManager.getIssueObject(event.getIssue().getId());
          // CustomField progressField = customFieldManager.getCustomFieldObject(progressFieldId);
          
          // プロジェクトリーダーが更新したことにする
          ApplicationUser updateUser = issue.getProjectObject().getProjectLead();
          
          GenericValue changeLog = event.getChangeLog();
          
          if(changeLog){
              ChangeHistory changeHistory = changeHistoryManager.getChangeHistoryById(changeLog.getLong("id"));
              List<ChangeItemBean> changeItemBeans = changeHistory.getChangeItemBeans();
          
              for(ChangeItemBean changeItemBean : changeItemBeans){
                  if(changeItemBean.getField() == "status"){
                      Status status = issue.getStatus();
                      String statusName = status.getSimpleStatus().getName();
                      Collection<Issue> subTaskObjects = issue.getSubTaskObjects();
                      
                      if(statusName.equals(validateStatusName) && subTaskObjects.size() > 0){
                          TransitionValidationResult transitionValidationResult;
                          IssueResult transitionResult;
                          
                          for(Issue subTaskObject : subTaskObjects){
                              Issue subTask = issueManager.getIssueObject(subTaskObject.getId());
                              transitionValidationResult = issueService.validateTransition(updateUser, subTask.getId(), actionId, new IssueInputParametersImpl());
                              
                              if(transitionValidationResult.isValid()){
                                  transitionResult = issueService.transition(updateUser, transitionValidationResult);
                              }
                          }
                      }
                  }
              }
          }

          ただ、サブタスクの現在のステータスにも依存してしまいますし、
          確かに複雑な操作が必要ですね...

        4. 樋口晃

          スクリプトは便利ですが、JIRA をバージョンアップする時に API が利用不可になってしまうという事が有ります。

          バージョンアップの手間を考えると、JSU でできる事は JSU でやった方が良いと思います。

        5. だい

          みなさま

          ご回答ありがとうございます。
          @樋口晃さんの仰る通り、バージョンは最新ではありません。
          以前JIRA本体だったと思いますが、バージョンアップして設定や表示が結構変わってしまい、
          難儀した体験からバージョンアップに慎重になってしまっています。アドオンだときっと大丈夫だとは思いますが。。。

          スクリプトではなくJSUで攻めてみたいと思います。

        Commentコメントを追加...