diff --git a/Pipfile b/Pipfile index d80ff30..70f3124 100644 --- a/Pipfile +++ b/Pipfile @@ -6,7 +6,7 @@ verify_ssl = true [packages] flask = "~=2.3.0" requests = "~=2.32.3" -jira = "~=3.0.0" +jira = "~=3.10.0" logging-formatter-anticrlf = "~=1.2.1" [dev-packages] diff --git a/action.yml b/action.yml index 544f767..7a04a62 100644 --- a/action.yml +++ b/action.yml @@ -35,6 +35,10 @@ inputs: description: 'Custom reopen state' required: false default: 'To Do' + jira_api_version: + description: 'Jira REST API version. Use "3" for Jira Cloud (default), "2" for Jira Server/Data Center.' + required: false + default: '3' runs: using: composite steps: @@ -51,6 +55,7 @@ runs: INPUTS_SYNC_DIRECTION: ${{ inputs.sync_direction }} INPUTS_ISSUE_END_STATE: ${{ inputs.issue_end_state }} INPUTS_ISSUE_REOPEN_STATE: ${{ inputs.issue_reopen_state }} + INPUTS_JIRA_API_VERSION: ${{ inputs.jira_api_version }} run: | pip3 install pipenv pipenv install @@ -68,4 +73,5 @@ runs: --jira-labels "$INPUTS_JIRA_LABELS" \ --direction "$INPUTS_SYNC_DIRECTION" \ --issue-end-state "$INPUTS_ISSUE_END_STATE" \ - --issue-reopen-state "$INPUTS_ISSUE_REOPEN_STATE" + --issue-reopen-state "$INPUTS_ISSUE_REOPEN_STATE" \ + --jira-api-version "$INPUTS_JIRA_API_VERSION" diff --git a/cli.py b/cli.py index c2aa558..8099aac 100644 --- a/cli.py +++ b/cli.py @@ -52,7 +52,7 @@ def serve(args): fail("No Webhook secret specified!") github = ghlib.GitHub(args.gh_url, args.gh_token) - jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token) + jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token, args.jira_api_version) s = Sync( github, jira.getProject(args.jira_project, args.jira_labels), @@ -81,7 +81,7 @@ def sync(args): fail("No GitHub repository specified!") github = ghlib.GitHub(args.gh_url, args.gh_token) - jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token) + jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token, args.jira_api_version) jira_project = jira.getProject( args.jira_project, args.issue_end_state, @@ -143,7 +143,7 @@ def install_hooks(args): if args.jira_url: if not args.jira_user or not args.jira_token: fail("No JIRA credentials specified!") - jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token) + jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token, args.jira_api_version) jira.create_hook("github_jira_synchronization_hook", args.hook_url, args.secret) @@ -175,7 +175,7 @@ def list_hooks(args): if not args.jira_user or not args.jira_token: fail("No JIRA credentials specified!") - jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token) + jira = jiralib.Jira(args.jira_url, args.jira_user, args.jira_token, args.jira_api_version) for h in jira.list_hooks(): print(json.dumps(h, indent=4)) @@ -203,6 +203,11 @@ def main(): ) credential_base.add_argument("--jira-project", help="JIRA project key") credential_base.add_argument("--jira-labels", help="JIRA bug label(s)") + credential_base.add_argument( + "--jira-api-version", + help="JIRA REST API version (default: 3). Use '2' for Jira Server/Data Center.", + default=os.getenv("GH2JIRA_JIRA_API_VERSION", "3"), + ) credential_base.add_argument( "--secret", help="Webhook secret. Alternatively, the GH2JIRA_SECRET may be set.", diff --git a/jiralib.py b/jiralib.py index a6bf0e9..2790f83 100644 --- a/jiralib.py +++ b/jiralib.py @@ -46,11 +46,11 @@ class Jira: - def __init__(self, url, user, token): + def __init__(self, url, user, token, api_version="3"): self.url = url self.user = user self.token = token - self.j = JIRA(url, basic_auth=(user, token)) + self.j = JIRA(url, basic_auth=(user, token), options={"rest_api_version": api_version}) def auth(self): return self.user, self.token @@ -119,7 +119,7 @@ def get_state_issue(self, issue_key="-"): issues = list( filter( lambda i: i.fields.summary == STATE_ISSUE_SUMMARY, - self.j.search_issues(issue_search, maxResults=0), + self.j.enhanced_search_issues(issue_search, maxResults=0), ) ) @@ -218,7 +218,7 @@ def fetch_issues(self, key): lambda i: i.is_managed(), [ JiraIssue(self, raw) - for raw in self.j.search_issues(issue_search, maxResults=0) + for raw in self.j.enhanced_search_issues(issue_search, maxResults=0) ], ) )