| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| name: JIRA link |
| on: |
| schedule: |
| - cron: | |
| */15 * * * * |
| jobs: |
| comment: |
| name: Comment |
| runs-on: ubuntu-latest |
| steps: |
| - name: Comment JIRA URL |
| uses: actions/github-script@0.2.0 |
| with: |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| script: | |
| const {owner: owner, repo: repo} = context.repo; |
| |
| function detectJIRAID(title) { |
| if (!title) { |
| return null; |
| } |
| const matched = /^ARROW-\d+/.exec(title); |
| if (!matched) { |
| return null; |
| } |
| return matched[0]; |
| } |
| |
| async function haveComment(pullRequestNumber, body) { |
| const options = { |
| owner: owner, |
| repo: repo, |
| issue_number: pullRequestNumber, |
| page: 1 |
| }; |
| while (true) { |
| const response = await github.issues.listComments(options); |
| if (response.data.some(comment => comment.body === body)) { |
| return true; |
| } |
| if (!/;\s*rel="next"/.test(response.headers.link || "")) { |
| break; |
| } |
| options.page++; |
| } |
| return false; |
| } |
| |
| async function commentJIRAURL(pullRequestNumber, jiraID) { |
| const jiraURL = `https://issues.apache.org/jira/browse/${jiraID}`; |
| if (await haveComment(pullRequestNumber, jiraURL)) { |
| return; |
| } |
| await github.issues.createComment({ |
| owner: owner, |
| repo: repo, |
| issue_number: pullRequestNumber, |
| body: jiraURL |
| }); |
| } |
| |
| (async () => { |
| const {data: pulls} = await github.pulls.list({ |
| owner: owner, |
| repo: repo, |
| }); |
| pulls.forEach(async (pull) => { |
| const pullRequestNumber = pull.number; |
| const title = pull.title; |
| const jiraID = detectJIRAID(title); |
| if (jiraID) { |
| await commentJIRAURL(pullRequestNumber, jiraID); |
| } |
| }); |
| })(); |