2
1
0

Configuration Managerを利用してプロジェクトデータを移行しようと考えていますが、移行元と先で課題タイプ、ステータス、カスタムフィールド、トランジション等のIDが変わった場合、移行先に合わせてIDを修正しないとスクリプトが動作しなくなります。

またBehavioursで特定トランジションで実行されることを「Condition」で設定できますが、この設定は自動で移行されず手動設定が必要になるため、その手間も省けたらと考えております。

この問題を回避する方法を教えて下さい。


    Commentコメントを追加...

    1 回答

    1.  
      3
      2
      1

      データをIDではなく名称から取得するが良いと思います。

      名称を変更する場合は、スクリプトの修正が必要になりますが、リリースされた後に余程のことが無い限りは、そこまで頻繁に名称変更することもないと思いますし、それよりも移行後のスクリプト修正が必要でなくなるため、移行後の負荷は減るし環境毎のソース差異がなくなるため運用は楽になるのかなと考えております。

      逆にIDだと名称変更に左右されないメリットがあると思うので、どちらが良いかはもちろん状況によります。

      サンプル

      import com.atlassian.jira.component.ComponentAccessor
      import com.atlassian.jira.workflow.WorkflowManager;
      import com.atlassian.jira.workflow.JiraWorkflow;
      import com.atlassian.jira.issue.Issue;
      import com.atlassian.jira.issue.status.Status;
      
      // API
      final WorkflowManager workflowManager = ComponentAccessor.getWorkflowManager();
      
      // フィールドID
      final Long CUSTOM_FIELD_ID_IMPORTANT = customFieldManager.getCustomFieldObjectsByName("重要度").getAt(0).getIdAsLong();
      
      // トランジション名:IT部門承認者クローズ待ち → 品質管理責任者クローズ待ち
      final String TRANSITION_NAME_FROM_IT_DEPT_APPROVER_CLOSE_PENDING_TO_QUALITY_MANAGEMENT_REPRESENTATIVE_CLOSE_PENDING = "承認";
      
      // スクリプトを実行させたいトランジション箇所
      List<Integer> transitionIdList = new ArrayList<Integer>();
      
      // トランジションを実行した場合
      if(underlyingIssue != null && getAction() != null && getAction().id != null){
      
          Issue incidentIssue = (Issue)underlyingIssue;
          JiraWorkflow workflow = workflowManager.getWorkflow(incidentIssue);
          List<Status> statusList = workflow.getLinkedStatusObjects()
      
          for(int i = 0; i < statusList.size(); i++){
              Status status = statusList.getAt(i);
              String statusName = status.getName().replaceAll(" ", "");
              if(statusName.equals("ステータス名")){
                  Iterator actions = workflow.getLinkedStep(status).getActions().iterator();
                  while (actions.hasNext()){
                      com.opensymphony.workflow.loader.ActionDescriptor action = (com.opensymphony.workflow.loader.ActionDescriptor)actions.next();
                      if( action.getName().equals(TRANSITION_NAME_FROM_IT_DEPT_APPROVER_CLOSE_PENDING_TO_QUALITY_MANAGEMENT_REPRESENTATIVE_CLOSE_PENDING)){
                          transitionIdList.add(action.getId());
                          break; // 複数トランジションで制御すしたい場合は不要
                      }
                  }
              }
          }
          if(transitionIdList.contains(getAction().id)){
              getFieldById("customfield_" + CUSTOM_FIELD_ID_IMPORTANT).setHidden(true);
          }
      }
        Commentコメントを追加...