From dd30c0e0a2913e28d3eeb9bb9f8513117b3ec460 Mon Sep 17 00:00:00 2001 From: neha_gupta Date: Wed, 12 Apr 2023 13:39:58 +0530 Subject: [PATCH] nightly test for corso (#2989) separate workflow for nightly test to run on merge to main #### Does this PR need a docs update or release note? - [ ] :white_check_mark: Yes, it's included - [ ] :clock1: Yes, but in a later PR - [ ] :no_entry: No #### Type of change - [ ] :sunflower: Feature - [ ] :bug: Bugfix - [ ] :world_map: Documentation - [ ] :robot: Supportability/Tests - [ ] :computer: CI/Deployment - [ ] :broom: Tech Debt/Cleanup #### Issue(s) * # #### Test Plan - [ ] :muscle: Manual - [ ] :zap: Unit test - [ ] :green_heart: E2E --- .github/workflows/nightly_test.yml | 184 +++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 .github/workflows/nightly_test.yml diff --git a/.github/workflows/nightly_test.yml b/.github/workflows/nightly_test.yml new file mode 100644 index 000000000..a65d196af --- /dev/null +++ b/.github/workflows/nightly_test.yml @@ -0,0 +1,184 @@ +name: Nightly Test Corso +on: + workflow_dispatch: + + schedule: + # Run every day at 0 minutes and 0 hours (midnight GMT) + - cron: "0 0 * * *" + + push: + branches: [main] + tags: ["v*.*.*"] + +permissions: + # required to retrieve AWS credentials + id-token: write + contents: write + packages: write + pull-requests: read + +# cancel currently running jobs if a new version of the branch is pushed +concurrency: + group: nightly-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + # ---------------------------------------------------------------------------------------------------- + # --- Checkouts ------------------------------------------------------------------------ + # ---------------------------------------------------------------------------------------------------- + + Checkout: + environment: Testing + runs-on: ubuntu-latest + defaults: + run: + working-directory: src + steps: + - uses: actions/checkout@v3 + + # single setup and sum cache handling here. + # the results will cascade onto both testing and linting. + - name: Setup Golang with cache + uses: ./.github/actions/go-setup-cache + with: + go-version-file: src/go.mod + + # SetM365App will decide which M365 app to use for this CI run + SetM365App: + environment: Testing + runs-on: ubuntu-latest + outputs: + client_app_slot: ${{ steps.roundrobin.outputs.CLIENT_APP_SLOT }} + client_id_env: ${{ steps.roundrobin.outputs.CLIENT_ID_ENV }} + client_secret_env: ${{ steps.roundrobin.outputs.CLIENT_SECRET_ENV }} + steps: + - name: Figure out which client id to use + id: roundrobin + run: | + slot=$((GITHUB_RUN_NUMBER % 4)) + echo "CLIENT_APP_SLOT=$slot" >> $GITHUB_OUTPUT + + case $slot in + + 0) + echo "CLIENT_ID_ENV=CLIENT_ID" >> $GITHUB_OUTPUT + echo "CLIENT_SECRET_ENV=CLIENT_SECRET" >> $GITHUB_OUTPUT + ;; + 1) + echo "CLIENT_ID_ENV=CLIENT_ID_2" >> $GITHUB_OUTPUT + echo "CLIENT_SECRET_ENV=CLIENT_SECRET_2" >> $GITHUB_OUTPUT + ;; + 2) + echo "CLIENT_ID_ENV=CLIENT_ID_3" >> $GITHUB_OUTPUT + echo "CLIENT_SECRET_ENV=CLIENT_SECRET_3" >> $GITHUB_OUTPUT + ;; + 3) + echo "CLIENT_ID_ENV=CLIENT_ID_4" >> $GITHUB_OUTPUT + echo "CLIENT_SECRET_ENV=CLIENT_SECRET_4" >> $GITHUB_OUTPUT + ;; + esac + + SetEnv: + environment: Testing + runs-on: ubuntu-latest + outputs: + environment: ${{ steps.environment.outputs.environment }} + version: ${{ steps.version.outputs.version }} + website-bucket: ${{ steps.website-bucket.outputs.website-bucket }} + website-cfid: ${{ steps.website-cfid.outputs.website-cfid }} + steps: + - uses: actions/checkout@v3 + + - name: Figure out environment + id: environment + run: | + echo "environment=Testing" | tee -a $GITHUB_OUTPUT + + - name: Get version string + id: version + run: | + if ${{ startsWith(github.ref, 'refs/tags/') }}; then + echo "version=$(git describe --exact-match --tags $(git rev-parse HEAD))" | tee -a $GITHUB_OUTPUT + else + echo "version=$(echo unreleased-$(git rev-parse --short HEAD))" | tee -a $GITHUB_OUTPUT + fi + + - name: Get bucket name for website + id: website-bucket + run: | + if ${{ startsWith(github.ref, 'refs/tags/') }}; then + echo "website-bucket=corsobackup.io" | tee -a $GITHUB_OUTPUT + else + echo "website-bucket=test-corso-docs" | tee -a $GITHUB_OUTPUT + fi + + # ---------------------------------------------------------------------------------------------------- + # --- Nightly Testing ------------------------------------------------------------------- + # ---------------------------------------------------------------------------------------------------- + + Test-Suite-Trusted: + needs: [ Checkout, SetM365App] + environment: Testing + runs-on: ubuntu-latest + defaults: + run: + working-directory: src + env: + # Resolve the name of the secret that contains the Azure client ID/secret + AZURE_CLIENT_ID_NAME: ${{ needs.SetM365App.outputs.client_id_env }} + AZURE_CLIENT_SECRET_NAME: ${{ needs.SetM365App.outputs.client_secret_env }} + CLIENT_APP_SLOT: ${{ needs.SetM365App.outputs.client_app_slot }} + steps: + - uses: actions/checkout@v3 + + - name: Setup Golang with cache + uses: magnetikonline/action-golang-cache@v4 + with: + go-version-file: src/go.mod + + - run: mkdir testlog + + # Install gotestfmt + - name: Set up gotestfmt + run: go install github.com/gotesttools/gotestfmt/v2/cmd/gotestfmt@latest + + # AWS creds + - name: Configure AWS credentials from Test account + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: ${{ secrets.AWS_IAM_ROLE }} + role-session-name: integration-testing + aws-region: us-east-1 + + # run the tests + - name: Integration Tests + env: + AZURE_CLIENT_ID: ${{ secrets[env.AZURE_CLIENT_ID_NAME] }} + AZURE_CLIENT_SECRET: ${{ secrets[env.AZURE_CLIENT_SECRET_NAME] }} + AZURE_TENANT_ID: ${{ secrets.TENANT_ID }} + CORSO_NIGHTLY_TESTS: true + CORSO_M365_TEST_USER_ID: ${{ secrets.CORSO_M365_TEST_USER_ID }} + CORSO_SECONDARY_M365_TEST_USER_ID: ${{ secrets.CORSO_SECONDARY_M365_TEST_USER_ID }} + CORSO_PASSPHRASE: ${{ secrets.INTEGRATION_TEST_CORSO_PASSPHRASE }} + CORSO_LOG_FILE: ./src/testlog/testlogging.log + LOG_GRAPH_REQUESTS: true + run: | + set -euo pipefail + go test \ + -tags testing \ + -json \ + -v \ + -failfast \ + -p 1 \ + -timeout 15m \ + ./... 2>&1 | tee ./testlog/gotest.log | gotestfmt -hide successful-tests + + # Upload the original go test output as an artifact for later review. + - name: Upload test log + if: failure() + uses: actions/upload-artifact@v3 + with: + name: test-log + path: src/testlog/* + if-no-files-found: error + retention-days: 14