opentelemetry-java-instrume.../.github/workflows/comment-driven-pr-automatio...

140 lines
5.0 KiB
YAML

name: Comment driven automations
on:
issue_comment:
types: [ created ]
jobs:
comment-driven-automation:
if: |
github.event.issue.pull_request &&
startsWith(github.event.comment.body, '@opentelemetrybot ')
runs-on: ubuntu-latest
steps:
- name: Get command
env:
BODY: ${{ github.event.comment.body }}
run: |
# intentionally only looking at the first line of the body
command=$(echo "$BODY" | head -1 | sed "s/^@opentelemetrybot //")
echo "COMMAND=$command" >> $GITHUB_ENV
- uses: actions/checkout@v3
with:
# history is needed for the update command to run "git merge"
fetch-depth: ${{ env.COMMAND == 'update' && '0' || '1' }}
# this is the personal access token used for "git push" below
# which is needed in order to trigger workflows
token: ${{ secrets.OPENTELEMETRYBOT_GITHUB_TOKEN }}
- name: Check out PR branch
if: |
env.COMMAND == 'spotless' ||
env.COMMAND == 'license' ||
env.COMMAND == 'apidiff' ||
env.COMMAND == 'update'
env:
NUMBER: ${{ github.event.issue.number }}
GH_TOKEN: ${{ github.token }}
run: |
gh pr checkout $NUMBER
- name: This could take me a few minutes...
if: |
env.COMMAND == 'spotless' ||
env.COMMAND == 'license' ||
env.COMMAND == 'apidiff'
env:
GH_TOKEN: ${{ secrets.OPENTELEMETRYBOT_GITHUB_TOKEN }}
run: |
if [[ "$COMMAND" == "spotless" ]]; then
command="./gradlew spotlessApply"
elif [[ "$COMMAND" == "license" ]]; then
command="./gradlew generateLicenseReport"
elif [[ "$COMMAND" == "apidiff" ]]; then
command="./gradlew jApiCmp"
fi
gh pr comment $NUMBER --body "Running \`$command\`, this could take a few minutes..."
- name: Set up Gradle cache
if: |
env.COMMAND == 'spotless' ||
env.COMMAND == 'license' ||
env.COMMAND == 'apidiff'
uses: gradle/gradle-build-action@v2
with:
cache-read-only: true
- name: Use CLA approved github bot
if: |
env.COMMAND == 'spotless' ||
env.COMMAND == 'license' ||
env.COMMAND == 'apidiff' ||
env.COMMAND == 'update'
run: .github/scripts/use-cla-approved-github-bot.sh
- name: Set up JDK for running Gradle
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17.0.6
- name: Run command
env:
NUMBER: ${{ github.event.issue.number }}
GH_TOKEN: ${{ secrets.OPENTELEMETRYBOT_GITHUB_TOKEN }}
run: |
available_commands="Available commands:
* \`@opentelemetrybot spotless\` - runs \`./gradlew spotlessApply\`
* \`@opentelemetrybot license\` - runs \`./gradlew generateLicenseReport\`
* \`@opentelemetrybot apidiff\` - runs \`./gradlew jApiCmp\`
* \`@opentelemetrybot update\` - updates branch with merge commit
* \`@opentelemetrybot rerun\` - re-runs failed checks (NOT IMPLEMENTED YET)
* \`@opentelemetrybot help\` - displays available commands
"
# TODO add thumbs up on triggering comment
if [[ "$COMMAND" == "spotless" ]]; then
./gradlew spotlessApply
if git diff --quiet; then
gh pr comment $NUMBER --body "Already up-to-date"
exit 0 # success
fi
git commit -a -m "./gradlew spotlessApply"
git push
elif [[ "$COMMAND" == "license" ]]; then
./gradlew generateLicenseReport
git add licenses
# there's always going to one line difference due to the timestamp included in the report
if [[ $(git diff --cached --shortstat licenses) == " 1 file changed, 1 insertion(+), 1 deletion(-)" ]]
then
gh pr comment $NUMBER --body "Already up-to-date"
exit 0 # success
fi
git commit -m "./gradlew generateLicenseReport"
git push
elif [[ "$COMMAND" == "apidiff" ]]; then
./gradlew jApiCmp
git add docs/apidiffs
if git diff --cached --quiet; then
gh pr comment $NUMBER --body "Already up-to-date"
exit 0 # success
fi
git commit -m "./gradlew jApiCmp"
git push
elif [[ "$COMMAND" == "update" ]]; then
# TODO check for up-to-date
git merge --no-edit origin/main
git push
elif [[ "$COMMAND" == "rerun" ]]; then
echo TODO
# gh run rerun --failed
elif [[ "$COMMAND" == "help" ]]; then
gh pr comment $NUMBER --body "$available_commands"
else
body="Unknown command: \`$COMMAND\`
$available_commands
"
gh pr comment $NUMBER --body "$body"
fi