Skip to content

[Tests] Run integration tests #243

[Tests] Run integration tests

[Tests] Run integration tests #243

name: "[Tests] Run integration tests"
on:
schedule:
- cron: '0 0 * * 1-5' # At 00:00 on every day-of-week from Monday through Friday
workflow_dispatch: # or manually
issue_comment:
types: [ created ] # or by comment
# TODO: update workflow permissions to least privilege after auditing all the APIs used
# permissions: # limit the permissions of the GITHIUB_TOKEN to reading repository contents
# contents: read
jobs:
cancel_previous:
permissions:
actions: write # for styfle/cancel-workflow-action to cancel/stop running workflows
if: ${{ github.event_name != 'issue_comment'}}
runs-on: macos-latest
steps:
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.11.0
with:
access_token: '${{ secrets.GITHUB_TOKEN }}'
should_run_it:
runs-on: macos-latest
outputs:
run_integration_tests: ${{ steps.should-run-step.outputs.should_run }}
pr_number: ${{ steps.pr_number.outputs.number }}
steps:
- name: Get PR number
id: pr_number
if: ${{ github.event_name == 'issue_comment'}}
run: |
PR_URL="${{ github.event.issue.pull_request.url }}"
PR_NUMBER=${PR_URL##*/}
echo "number=$PR_NUMBER" >> $GITHUB_OUTPUT
- uses: khan/pull-request-comment-trigger@master
if: ${{ github.event_name == 'issue_comment'}}
id: check_issue_comment
with:
trigger: '@flank-it'
reaction: eyes
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
- name: Check if integrations tests should run
id: should-run-step
env:
run_it: ${{ steps.check_issue_comment.outputs.triggered == 'true'|| github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }}
run: |
echo "event name: ${{ github.event_name }}"
echo "issue command found: ${{ steps.check_issue_comment.outputs.triggered == 'true' }}"
echo "should_run=${{ env.run_it }}" >> $GITHUB_OUTPUT
integration-tests-post-link:
runs-on: macos-latest
needs: [ should_run_it ]
if: github.event_name == 'issue_comment' && needs.should_run_it.outputs.run_integration_tests == 'true'
outputs:
comment_id: ${{ steps.couc.outputs.comment-id }}
steps:
- name: Get current time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: 'YYYY-MM-DD HH:mm:ss'
utcOffset: "+00:00"
- name: Create comment that tests were triggered
uses: peter-evans/create-or-update-comment@v3
id: couc
with:
issue-number: ${{ needs.should_run_it.outputs.pr_number }}
body: |
**Integration tests were triggered at ${{ steps.current-time.outputs.formattedTime }}, you can track progress [here](https://github.com/Flank/flank/actions/runs/${{ github.run_id }})**
reactions: rocket
run-it-full-suite:
needs: [ should_run_it ]
if: needs.should_run_it.outputs.run_integration_tests == 'true'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ macos-latest, windows-latest, ubuntu-latest ]
fail-fast: false
outputs:
job_status: ${{ job.status }}
build-scan-url: ${{ steps.run-it.outputs.build-scan-url }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@v2
with:
egress-policy: audit
# TODO: change to 'egress-policy: block' after auditing a number of runs and updating the allowed-endpoints option accordingly
- name: Checkout code
uses: actions/checkout@v3
- name: Checkout Pull Request
if: github.event_name == 'issue_comment'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh pr checkout ${{ needs.should_run_it.outputs.pr_number }}
- uses: actions/cache@v3
with:
path: ~/.gradle/caches
key: macos-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: |
macos-gradle-
- name: Prepare Google Service Account
env:
GCLOUD_KEY: ${{ secrets.GCLOUD_KEY }}
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
GCLOUD_DIR=$HOMEPATH\\.config\\gcloud\\
mkdir -p $GCLOUD_DIR
echo $GCLOUD_KEY > key.txt
certutil -decode key.txt $GCLOUD_DIR\application_default_credentials.json
else
GCLOUD_DIR="$HOME/.config/gcloud/"
mkdir -p "$GCLOUD_DIR"
echo "$GCLOUD_KEY" | base64 --decode > "$GCLOUD_DIR/application_default_credentials.json"
fi
shell: bash
- name: Gradle integration tests
uses: gradle/gradle-build-action@v2.4.2
id: run-it
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HEAD_REF: ${{ github.ref }}
with:
arguments: "integrationTests"
- name: Export Variables for FlankScripts
if: ${{ always() }}
uses: UnlyEd/github-action-store-variable@v3.0.15
with:
variables: |
${{ runner.os }}=${{ job.status }}
${{ runner.os }}-bs=${{steps.run-it.outputs.build-scan-url}}
process-results:
needs: [ run-it-full-suite ]
runs-on: macos-latest
if: always() && github.event_name != 'issue_comment'
steps:
- name: Import variable
uses: UnlyEd/github-action-store-variable@v3.0.15
with:
delimiter: ','
variables: |
Windows,Windows-bs,macOS,macOS-bs,Linux,Linux-bs
- name: Checkout code
uses: actions/checkout@v3
- name: Download flankScripts and add it to PATH
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
./gradlew :flank-scripts:download
echo "./flank-scripts/bash" >> $GITHUB_PATH
- name: Process IT results
run: |
flankScripts integration_tests process_results \
--global-result=${{ needs.run-it-full-suite.outputs.job_status }} \
--run-result='${{ toJSON(env) }}' \
--github-token=${{ secrets.GITHUB_TOKEN }} \
--run-id=${{ github.run_id }}
post-comment_with_results:
needs: [ run-it-full-suite, integration-tests-post-link ]
runs-on: macos-latest
if: always() && github.event_name == 'issue_comment'
steps:
- name: Import variable
uses: UnlyEd/github-action-store-variable@v3.0.15
with:
delimiter: ','
variables: |
Windows,Windows-bs,macOS,macOS-bs,Linux,Linux-bs
- name: Update comment on failure
if: ${{ needs.run-it-full-suite.outputs.job_status == 'failure' }}
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ needs.integration-tests-post-link.outputs.comment_id }}
edit-mode: replace
body: |
**Integration tests failed :x:**
Windows status ${{ env.Windows }} - Build scan: ${{ env.Windows-bs }}
MacOS status ${{ env.macOS }} - Build scan: ${{ env.macOS-bs }}
Linux status ${{ env.Linux }} - Build scan: ${{ env.Linux-bs }}
Workflow run https://github.com/Flank/flank/actions/runs/${{ github.run_id }}
reactions: '-1'
- name: Update comment on success
if: ${{ needs.run-it-full-suite.outputs.job_status == 'success' }}
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ needs.integration-tests-post-link.outputs.comment_id }}
edit-mode: replace
body: |
**Integration tests succeed for all OSs :white_check_mark:**
Windows Build scan: ${{ env.Windows-bs }}
MacOS Build scan: ${{ env.macOS-bs }}
Linux Build scan: ${{ env.Linux-bs }}
Workflow run https://github.com/Flank/flank/actions/runs/${{ github.run_id }}
reactions: '+1'
trigger-pointer:
runs-on: ubuntu-latest
needs: [ process-results ]
if: always() && github.event_name != 'issue_comment'
steps:
- name: Harden Runner
uses: step-security/harden-runner@v2
with:
egress-policy: audit
# TODO: change to 'egress-policy: block' after auditing a number of runs and updating the allowed-endpoints option accordingly
- uses: tibdex/github-app-token@v1
id: generate-token
with:
app_id: ${{ secrets.FLANK_RELEASE_APP_ID }}
private_key: ${{ secrets.FLANK_RELEASE_PRIVATE_KEY }}
- name: Repository Dispatch
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ steps.generate-token.outputs.token }}
event-type: integration-pointer