name: EndToEnd Test env: IMAGE_NAME: ghcr.io/alcionai/corso on: workflow_dispatch: pull_request: push: # TODO: remove e2eTest from here branches: [main, e2eTest] tags: ["v*.*.*"] repository_dispatch: types: [ok-to-test-command] 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: ci-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: # ---------------------------------------------------------------------------------------------------- # --- Prechecks and Checkouts ------------------------------------------------------------------------ # ---------------------------------------------------------------------------------------------------- Precheck: uses: alcionai/corso/.github/workflows/_filechange_checker.yml@main Checkout: needs: [Precheck] 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 if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || needs.precheck.outputs.websitefileschanged == 'true' 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: | if ${{ startsWith(github.ref, 'refs/tags/') }}; then echo "environment=Production" | tee -a $GITHUB_OUTPUT else echo "environment=Testing" | tee -a $GITHUB_OUTPUT fi # ---------------------------------------------------------------------------------------------------- # --- Integration and Unit Testing ------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------- Test-Suite-Trusted: needs: [Precheck, Checkout, SetM365App] environment: Testing runs-on: ubuntu-latest if: (startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main') || (needs.precheck.outputs.srcfileschanged == 'true' && github.event.pull_request.head.repo.full_name == github.repository) 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_CI_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