Skip to content

[tests] Move workspace integration tests to Github Actions #16872

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 16, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
181 changes: 181 additions & 0 deletions .github/workflows/workspace-integration-tests.yml
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a test

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's visible from a workspace, thanks Github extension!

Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
name: "Workspace integration tests"
on:
workflow_dispatch:
inputs:
name:
required: true
description: "The name of the preview environment"
version:
required: true
description: "The version of Gitpod to install"
skip_deploy:
required: false
type: boolean
description: "Skip deploy preview environment (debug only)"
skip_delete:
required: false
type: boolean
description: "Skip delete preview environment (debug only)"
schedule:
- cron: "0 3 * * *"
jobs:
configuration:
name: Configuration
runs-on: [self-hosted]
container:
image: eu.gcr.io/gitpod-core-dev/dev/dev-environment:kylos101-kubecdl-home.1
outputs:
name: ${{ steps.configuration.outputs.name }}
version: ${{ steps.configuration.outputs.version }}
steps:
- name: "Set outputs"
id: configuration
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if [[ '${{ github.event.inputs.name }}' != '' && '${{ github.event.inputs.name }}' != 'latest' ]]; then
# The workflow was triggered by workflow_dispatch
{
echo "version=${{ github.event.inputs.version }}"
echo "name=${{ github.event.inputs.name }}"
} >> $GITHUB_OUTPUT
else
# others
RUNID=$(gh run list -R gitpod-io/gitpod -b main -w Build --limit 1 --json databaseId --jq .[0].databaseId)
if ! gh run watch "$RUNID" --exit-status -R gitpod-io/gitpod >/dev/null 2>&1; then
echo main branch build is failed, see https://github.com/gitpod-io/gitpod/actions/runs/"$RUNID" for detail | tee -a $GITHUB_STEP_SUMMARY
exit 1
fi

{
echo "version=$(gh run view "$RUNID" --log -R gitpod-io/gitpod | grep 'main-gha.[0-9]*' -o | head -n 1)"
echo "name=workspace-integration-test-${{ github.run_id }}-${{ github.run_attempt }}"
} >> $GITHUB_OUTPUT
fi
- name: Get Secrets from GCP
id: 'secrets'
uses: 'google-github-actions/get-secretmanager-secrets@v1'
with:
secrets: |-
WORKSPACE_SLACK_WEBHOOK:gitpod-core-dev/workspace-slack-webhook
- name: Slack Notification
uses: rtCamp/action-slack-notify@v2
if: failure()
env:
SLACK_WEBHOOK: ${{ steps.secrets.outputs.WORKSPACE_SLACK_WEBHOOK }}
SLACK_COLOR: ${{ job.status }}
SLACK_MESSAGE: main branch build failed
check:
name: Check for regressions
needs: [configuration]
runs-on: [self-hosted]
container:
image: eu.gcr.io/gitpod-core-dev/dev/dev-environment:kylos101-kubecdl-home.1
steps:
- uses: actions/checkout@v3
- name: Create preview environment infrastructure
uses: ./.github/actions/preview-create
with:
name: ${{ needs.configuration.outputs.name }}
infrastructure_provider: harvester
large_vm: true
sa_key: ${{ secrets.GCP_CREDENTIALS }}
- name: Deploy Gitpod to the preview environment
if: github.event.inputs.skip_deploy != 'true'
id: deploy-gitpod
uses: ./.github/actions/deploy-gitpod
with:
name: ${{ needs.configuration.outputs.name }}
sa_key: ${{ secrets.GCP_CREDENTIALS }}
version: ${{ needs.configuration.outputs.version}}
- name: Get Secrets from GCP
id: 'secrets'
uses: 'google-github-actions/get-secretmanager-secrets@v1'
with:
secrets: |-
WORKSPACE_SLACK_WEBHOOK:gitpod-core-dev/workspace-slack-webhook
WORKSPACE_INTEGRATION_TEST_USERNAME:gitpod-core-dev/workspace-integration-test-username
WORKSPACE_INTEGRATION_TEST_USER_TOKEN:gitpod-core-dev/workspace-integration-test-user-token
- name: Integration Test
shell: bash
env:
ROBOQUAT_TOKEN: ${{ secrets.GITHUB_TOKEN }}
USERNAME: ${{ steps.secrets.outputs.WORKSPACE_INTEGRATION_TEST_USERNAME }}
USER_TOKEN: ${{ steps.secrets.outputs.WORKSPACE_INTEGRATION_TEST_USER_TOKEN }}
PREVIEW_ENV_DEV_SA_KEY: ${{ secrets.GCP_CREDENTIALS }}
PREVIEW_NAME: ${{ needs.configuration.outputs.name }}
run: |
set -euo pipefail
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it might be cleaner to keep this script in a separate bash file, and run that file here. That way we keep e.g. syntax highlighting, bash linting, etc.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do in a follow-on PR, or, if I have trouble getting having the tests run general. So, expect another PR. ;)


export LEEWAY_WORKSPACE_ROOT="$(pwd)"
export HOME="/home/gitpod"
export PREVIEW_ENV_DEV_SA_KEY_PATH="/home/gitpod/.config/gcloud/preview-environment-dev-sa.json"

echo "${PREVIEW_ENV_DEV_SA_KEY}" > "${PREVIEW_ENV_DEV_SA_KEY_PATH}"
gcloud auth activate-service-account --key-file "${PREVIEW_ENV_DEV_SA_KEY_PATH}"

leeway run dev/preview/previewctl:install

echo "Setting up access to core-dev and harvester"
previewctl get-credentials --gcp-service-account "${PREVIEW_ENV_DEV_SA_KEY_PATH}"

previewctl install-context --branch "${PREVIEW_NAME}" --log-level debug --timeout 1m --gcp-service-account "${PREVIEW_ENV_DEV_SA_KEY_PATH}"

# start integration test
args=()
args+=( "-kubeconfig=/home/gitpod/.kube/config" )
args+=( "-namespace=default" )
[[ "$USERNAME" != "" ]] && args+=( "-username=$USERNAME" )
args+=( "-timeout=60m" )

BASE_TESTS_DIR="$GITHUB_WORKSPACE/test/tests"
CONTENT_SERVICE_TESTS="$BASE_TESTS_DIR/components/content-service"
IMAGE_BUILDER_TESTS="$BASE_TESTS_DIR/components/image-builder"
DATABASE_TESTS="$BASE_TESTS_DIR/components/database"
SERVER_TESTS="$BASE_TESTS_DIR/components/server"
WS_DAEMON_TESTS="$BASE_TESTS_DIR/components/ws-daemon"
WS_MANAGER_TESTS="$BASE_TESTS_DIR/components/ws-manager"
WORKSPACE_TESTS="$BASE_TESTS_DIR/components/workspace"

go install github.com/jstemmer/go-junit-report/v2@latest

FAILURE_COUNT=0

WORKSPACE_TEST_LIST=("$CONTENT_SERVICE_TESTS" "$IMAGE_BUILDER_TESTS" "$DATABASE_TESTS" "$SERVER_TESTS" "$WS_DAEMON_TESTS" "$WS_MANAGER_TESTS" "$WORKSPACE_TESTS")
for TEST_PATH in "${WORKSPACE_TEST_LIST[@]}"
do
TEST_NAME=$(basename "${TEST_PATH}")
echo "running integration for ${TEST_NAME}"

cd "${TEST_PATH}"
set +e
go test -v ./... "${args[@]}" 2>&1 | go-junit-report -subtest-mode=exclude-parents -set-exit-code -out "TEST-${TEST_NAME}.xml" -iocopy
RC=${PIPESTATUS[0]}
set -e

if [ "${RC}" -ne "0" ]; then
FAILURE_COUNT=$((FAILURE_COUNT+1))
fi
done

exit $FAILURE_COUNT
- name: Test Summary
id: test_summary
uses: test-summary/action@v2
with:
paths: "test/tests/**/TEST-*.xml"
if: always()
- name: Slack Notification
uses: rtCamp/action-slack-notify@v2
if: success() || failure()
env:
SLACK_WEBHOOK: ${{ steps.secrets.outputs.WORKSPACE_SLACK_WEBHOOK }}
SLACK_COLOR: ${{ job.status }}
SLACK_MESSAGE: ${{ steps.test_summary.outputs.passed }}/${{ steps.test_summary.outputs.total }} tests passed
- name: Delete preview environment
if: github.event.inputs.skip_delete != 'true' && (success() || failure())
uses: ./.github/actions/delete-preview
with:
name: ${{ needs.configuration.outputs.name }}
sa_key: ${{ secrets.GCP_CREDENTIALS }}