fix #193
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: PR Actions | |
on: | |
issue_comment: | |
types: [created] | |
pull_request: | |
types: | |
- labeled | |
- synchronize | |
# FIXME: The global env seems not work. | |
env: | |
GH_TOKEN: ${{ secrets.AGENT_TOKEN }} | |
jobs: | |
pr-workflow: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v2 | |
- name: Remove lgtm label on new push | |
if: github.event_name == 'pull_request' && github.event.action == 'synchronize' | |
env: | |
GH_TOKEN: ${{ secrets.AGENT_TOKEN }} | |
run: | | |
PR_NUMBER=$(jq -r '.issue.number' $GITHUB_EVENT_PATH) | |
if [ -z "$PR_NUMBER" ]; then | |
echo "No PR number found in push event context." | |
exit 0 | |
fi | |
if gh pr view $PR_NUMBER --json labels --jq '.labels[].name' | grep -q "lgtm"; then | |
gh pr edit $pr --remove-label lgtm | |
echo "Removed 'lgtm' label due to new push." | |
fi | |
- name: Set up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: '3.x' | |
- name: Install yq | |
run: pip install yq | |
- name: Handle PR Comments | |
if: github.event_name == 'issue_comment' && github.event.action == 'created' | |
env: | |
GH_TOKEN: ${{ secrets.AGENT_TOKEN }} | |
run: | | |
COMMENT_BODY=$(jq -r '.comment.body' $GITHUB_EVENT_PATH) | |
PR_NUMBER=$(jq -r '.issue.number' $GITHUB_EVENT_PATH) | |
COMMENT_USER=$(jq -r '.comment.user.login' $GITHUB_EVENT_PATH) | |
while IFS= read -r COMMENT_LINE; do | |
COMMENT_LINE=$(echo "$COMMENT_LINE" | sed 's/^[ \t]*//;s/[ \t]*$//' | tr -d '\n' | awk '{$1=$1};1') | |
LABEL=$(echo "$COMMENT_LINE" | awk '{print $2}') | |
LABEL=$(echo "$LABEL" | sed 's/^[ \t]*//;s/[ \t]*$//' | tr -d '\n' | awk '{$1=$1};1') | |
# Handle lgtm command | |
if [[ "$COMMENT_LINE" =~ ^/lgtm ]]; then | |
if [[ "$LABEL" =~ ^cancel ]]; then | |
gh pr edit $PR_NUMBER --remove-label lgtm | |
echo "Remove label: lgtm" | |
else | |
gh pr edit $PR_NUMBER --add-label lgtm | |
echo "Add label: lgtm" | |
fi | |
fi | |
# Handle approved command | |
if [[ "$COMMENT_LINE" =~ ^/approve ]]; then | |
if yq ".approvers[] | select(. == \"$COMMENT_USER\") " OWNERS | grep -q "$COMMENT_USER"; then | |
if [[ "$LABEL" =~ ^cancel ]]; then | |
gh pr edit $PR_NUMBER --remove-label approved | |
echo "Remove label: approved" | |
else | |
gh pr edit $PR_NUMBER --add-label approved | |
echo "Add label: approved" | |
fi | |
else | |
gh pr comment $PR_NUMBER --body "Sorry, @$COMMENT_USER is not authorized to approve/unapprove this PR." | |
echo "User $COMMENT_USER is not authorized to approve/unapprove this PR" | |
fi | |
fi | |
# Handle hold command | |
if [[ "$COMMENT_LINE" =~ ^/hold ]]; then | |
if [[ "$LABEL" =~ ^cancel ]]; then | |
gh pr edit $PR_NUMBER --remove-label do-not-merge/hold | |
echo "Remove label: do-not-merge/hold" | |
else | |
gh pr edit $PR_NUMBER --add-label do-not-merge/hold | |
echo "Add label: do-not-merge/hold" | |
fi | |
# Handle kind command | |
elif [[ "$COMMENT_LINE" =~ ^/kind ]]; then | |
if [[ "$LABEL" =~ ^lgtm || "$LABEL" =~ ^approve ]]; then | |
echo "The label '$LABEL' cannot be added using /kind." | |
else | |
gh pr edit $PR_NUMBER --add-label $LABEL | |
echo "Add label: '$LABEL'" | |
fi | |
elif [[ "$COMMENT_LINE" =~ ^/remove-kind ]]; then | |
if [[ "$LABEL" =~ ^lgtm || "$LABEL" =~ ^approve ]]; then | |
echo "The label '$LABEL' cannot be removed using /remove-kind." | |
else | |
gh pr edit $PR_NUMBER --remove-label $LABEL | |
echo "Remove label: '$LABEL'" | |
fi | |
# Handle assignment | |
elif [[ "$COMMENT_LINE" =~ ^/assign ]]; then | |
USERNAME=$(echo "$LABEL" | sed 's/@//') | |
if [[ -n "$USERNAME" ]]; then | |
gh pr edit $PR_NUMBER --add-assignee "$USERNAME" | |
echo "Assign to $USERNAME" | |
else | |
echo "No username provided for assignment." | |
fi | |
elif [[ "$COMMENT_LINE" =~ ^/unassign ]]; then | |
USERNAME=$(echo "$LABEL" | sed 's/@//') | |
if [[ -n "$USERNAME" ]]; then | |
gh pr edit $PR_NUMBER --remove-assignee "$USERNAME" | |
echo "Unassign to $USERNAME" | |
else | |
echo "No username provided for unassignment." | |
fi | |
else | |
echo "$COMMENT_LINE is not supported" | |
fi | |
done <<< "$COMMENT_BODY" | |
- name: Merge PR if approved and lgtm | |
if: github.event_name == 'pull_request' && github.event.action == 'labeled' | |
env: | |
GH_TOKEN: ${{ secrets.AGENT_TOKEN }} | |
run: | | |
LABELS=$(gh pr view $PR_NUMBER --json labels --jq '.labels[].name') | |
if [[ "$LABELS" == *"lgtm"* && "$LABELS" == *"approved"* && "$LABELS" != *"do-not-merge/hold"* ]]; then | |
gh pr merge $PR_NUMBER --merge | |
echo "Merge!" | |
else | |
echo "Not ready to merge" | |
fi |