mirror of
https://github.com/Orange-OpenSource/hurl.git
synced 2024-12-24 03:21:40 +03:00
Create accept-pull-request.yml
This commit is contained in:
parent
fb057872fa
commit
d99cdcda75
162
.github/workflows/accept-pull-request.yml
vendored
Normal file
162
.github/workflows/accept-pull-request.yml
vendored
Normal file
@ -0,0 +1,162 @@
|
||||
name: accept-pull-request
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types:
|
||||
- created
|
||||
|
||||
jobs:
|
||||
accept-pull-request:
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
OWNER: ${{ github.repository_owner }}
|
||||
REPO: ${{ github.event.repository.name }}
|
||||
PR_NUMBER: ${{ github.event.issue.number }}
|
||||
COMMENT_USER_LOGIN: ${{ github.event.comment.user.login }}
|
||||
name: accept-pull-request
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.issue.pull_request && github.event.comment.body == '/accept'}}
|
||||
steps:
|
||||
|
||||
- name: Init all internal env vars
|
||||
run: |
|
||||
pr_detail_file="pr_detail.json"
|
||||
gh api repos/"${OWNER}"/"${REPO}"/pulls/"${PR_NUMBER}" > "${pr_detail_file}"
|
||||
jq . "${pr_detail_file}"
|
||||
HEAD_REPO_FULL_NAME=$(jq -rc .head.repo.full_name ${pr_detail_file})
|
||||
BASE_REPO_FULL_NAME=$(jq -rc .base.repo.full_name ${pr_detail_file})
|
||||
if [ "${HEAD_REPO_FULL_NAME}" = "${BASE_REPO_FULL_NAME}" ] ; then
|
||||
HEAD_TYPE=origin
|
||||
else
|
||||
HEAD_TYPE=fork
|
||||
fi
|
||||
echo "HEAD_REPO_FULL_NAME=${HEAD_REPO_FULL_NAME}" | tee -a "${GITHUB_ENV}"
|
||||
echo "BASE_REPO_FULL_NAME=${BASE_REPO_FULL_NAME}" | tee -a "${GITHUB_ENV}"
|
||||
echo "HEAD_TYPE=${HEAD_TYPE}" | tee -a "${GITHUB_ENV}"
|
||||
echo "HEAD_REF=$(jq -rc .head.ref ${pr_detail_file})" | tee -a "${GITHUB_ENV}"
|
||||
echo "BASE_REF=$(jq -rc .base.ref ${pr_detail_file})" | tee -a "${GITHUB_ENV}"
|
||||
echo "PR_STATE=$(jq -rc .state ${pr_detail_file})" | tee -a "${GITHUB_ENV}"
|
||||
echo "PR_DRAFT=$(jq -rc .draft ${pr_detail_file})" | tee -a "${GITHUB_ENV}"
|
||||
echo "PR_MERGEABLE=$(jq -rc .mergeable ${pr_detail_file})" | tee -a "${GITHUB_ENV}"
|
||||
echo "REMAINING_COMMITS_FILE=remaining_commits.txt" | tee -a "${GITHUB_ENV}"
|
||||
echo "NEW_COMMITS_FILE=new_commits.txt" | tee -a "${GITHUB_ENV}"
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ env.BASE_REF }}
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check comment user permission
|
||||
run: |
|
||||
comment_user_permission=$(gh api repos/"${OWNER}"/"${REPO}"/collaborators/"${COMMENT_USER_LOGIN}"/permission -q .permission)
|
||||
if [ "${comment_user_permission}" = "admin" ] ; then
|
||||
echo " - ✅ You have the ${comment_user_permission} permission then you are allowed to accept pull request n°${PR_NUMBER}"
|
||||
else
|
||||
comment="❌ Sorry \`${COMMENT_USER_LOGIN}\`, you are not allowed to accept this pull request because you do not have admin permission (actual permission=${comment_user_permission})."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Check if pull request state is open
|
||||
run: |
|
||||
if [ "${{ env.PR_STATE }}" = "open" ] ; then
|
||||
echo " - ✅ Pull request is ${{ env.PR_STATE }}."
|
||||
else
|
||||
comment="❌ Can not accept this pull request because it is not open (actual state=${{ env.PR_STATE }})."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Check if pull request is ready
|
||||
run: |
|
||||
if [ "${{ env.PR_DRAFT }}" = "false" ] ; then
|
||||
echo " - ✅ Pull request draft state is ${{ env.PR_DRAFT }}."
|
||||
else
|
||||
comment="❌ Can not accept this pull request because it is still in draft."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Check if pull request is mergeable
|
||||
run: |
|
||||
if [ "${{ env.PR_MERGEABLE }}" = "true" ] ; then
|
||||
echo " - ✅ Pull request mergeable state is ${{ env.PR_MERGEABLE }}."
|
||||
else
|
||||
comment="❌ Pull request is not mergeable, please check unresolved discussions and pull request messages."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Add remote source branch
|
||||
run: |
|
||||
if [ "${{ env.HEAD_TYPE }}" = "fork" ] ; then
|
||||
git remote add fork https://github.com/${{ env.HEAD_REPO_FULL_NAME}}
|
||||
git remote --verbose
|
||||
git fetch --all
|
||||
fi
|
||||
echo " - ✅ Source branch is from ${{ env.HEAD_TYPE }} repo"
|
||||
|
||||
- name: Check if source branch is rebased from target branch
|
||||
run: |
|
||||
git log --oneline --cherry ${{ env.HEAD_TYPE }}/${{ env.HEAD_REF }}...origin/${{ env.BASE_REF }} > "${{ env.REMAINING_COMMITS_FILE }}" && exit_code=0 || exit_code=1
|
||||
if [ ${exit_code} -eq 1 ] ; then
|
||||
comment="❌ Rebase check fails. Please refer to ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} logs."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
diff_count=$(grep -c ^+ ${{ env.REMAINING_COMMITS_FILE }} || true)
|
||||
if [ ${diff_count} -eq 0 ] ; then
|
||||
echo " - ✅ ${{ env.HEAD_REPO_FULL_NAME}}/${{ env.HEAD_REF }} is already rebased from ${{ env.BASE_REPO_FULL_NAME}}/${{ env.BASE_REF }}."
|
||||
else
|
||||
comment="❌ You have to rebase your \`${{ env.HEAD_REPO_FULL_NAME}}/${{ env.HEAD_REF }}\` branch first because there are new commits pending on target \`${{ env.BASE_REPO_FULL_NAME}}/${{ env.BASE_REF }}\` branch:<br>$(echo ; sed "s/+/-/g" ${{ env.REMAINING_COMMITS_FILE }})"
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Get new commits list
|
||||
run: |
|
||||
git log --oneline --cherry origin/${{ env.BASE_REF }}...${{ env.HEAD_TYPE }}/${{ env.HEAD_REF }} | tee ${{ env.NEW_COMMITS_FILE }}
|
||||
|
||||
- name: Merge fast forward head ref to base ref
|
||||
run: |
|
||||
git config --local user.email "action@github.com"
|
||||
git config --local user.name "GitHub Action"
|
||||
git merge ${{ env.HEAD_TYPE }}/${{ env.HEAD_REF }} --ff-only && exit_code=0 || exit_code=1
|
||||
if [ ${exit_code} -eq 0 ] ; then
|
||||
echo " - ✅ Merge fast forward succeeds."
|
||||
else
|
||||
comment="❌ Merge fast forward fails. Please refer to ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} logs."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
git push && exit_code=0 || exit_code=1
|
||||
if [ ${exit_code} -eq 0 ] ; then
|
||||
echo " - ✅ Push merge fast forward succeeds."
|
||||
else
|
||||
comment="❌ Push merge fast forward fails. Please refer to ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} logs."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Close pull request
|
||||
run: |
|
||||
comment="✅ Pull request accepted and closed by \`${COMMENT_USER_LOGIN}\` with fast forward merge."
|
||||
gh pr close "${PR_NUMBER}" --delete-branch --comment "${comment}.<br><br>\# List of commits merged from \`${{ env.HEAD_REPO_FULL_NAME}}/${{ env.HEAD_REF }}\` branch into \`${{ env.BASE_REPO_FULL_NAME}}/${{ env.BASE_REF }}\` branch:<br>$(echo ; sed "s/+/-/g" ${{ env.NEW_COMMITS_FILE }})" && exit_code=0 || exit_code=1
|
||||
if [ ${exit_code} -eq 0 ] ; then
|
||||
echo " - ${comment}"
|
||||
else
|
||||
comment="❌ A problem occured when closing pull request and/or deleting branch."
|
||||
echo " - ${comment}"
|
||||
gh pr comment "${PR_NUMBER}" --body "${comment} Please refer to ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID} logs."
|
||||
exit 1
|
||||
fi
|
Loading…
Reference in New Issue
Block a user