Использование переменных окружения действий github для запуска различных базовых URL-адресов в функции и промежуточной стадии для теста Snowflake Cypress

У меня есть набор тестов Cypress, которые используют один и тот же базовый URL-адрес, за исключением одного устаревшего теста. В устаревшем тесте используется перехватчик before, у которого cy.visit равен http://e2etest.dev.my-company.com:8081/company/sign-in. Проблема в том, что этот тест запускает e2etest.dev, даже если он выполняется на промежуточном этапе.

Я создал оператор if в соответствующем коде:

if (Cypress.env('CYPRESS_ENV') === 'test') {
        cy.visit('http://e2etest.dev.my-company.com:8081/company/sign-in');
      } else {
        cy.visit('http://e2etest.staging.my-company.com:8081/company/sign-in');
}

У меня также есть Github Actions ci.yaml. У меня нет e2e.yaml. Принцип работы ci.yaml заключается в том, что он принимает имя ветки и запускает следующее:

echo "GITHUB_REF_NAME=${GITHUB_REF_NAME}"
          BUILD_REF = "${GITHUB_REF_NAME}"
          FORMATTED_BUILD_REF = "$(echo $BUILD_REF | sed 's/[^a-zA-Z0-9]/-/g')"
          VERSION = "$(date -u +'%Y%m%d')-$GITHUB_RUN_NUMBER-${GITHUB_SHA:0-7}"
          SERVICE='my-company-pro'
          case "${GITHUB_REF_NAME}" in
            "master")
              BASE_URL = "https://e2etest.my-company.com"
              API_HOST = "api.my-company.com"
              NAMESPACE = "app-prod"
              ;;
            "staging")
              BASE_URL = "https://e2etest.staging.my-company.com"
              API_HOST = "api.staging.my-company.com"
              NAMESPACE = "app-staging"
              CF_WORKER_ENV = "staging"
              ;;
            "sandbox")
              BASE_URL = "http://e2etest.sandbox.my-company.com"
              API_HOST = "api.sandbox.my-company.com"
              NAMESPACE = "app-sandbox"
              ;;
            *)
              BASE_URL = "https://e2etest.dev.my-company.com:3003"
              API_HOST = "api.staging.my-company.com"
              NAMESPACE = "app-test"
              CF_WORKER_ENV = "test"
              ;;

В задании cypress я распечатал доступные переменные и получил это обратно, указывая, что я правильно отредактировал yaml:

Run echo "CF Worker Env: staging" 
CF Worker Env: staging

и

Run echo "CYPRESS_ENV=${CYPRESS_ENV}"
CYPRESS_ENV=staging

Эти значения говорят о тестировании в функциональной ветке и промежуточной версии в промежуточной ветке. На панели инструментов Cypress я вижу, что в ветке функций он переходит к оператору if для среды разработки, и я вижу, что мой console.info(Cypress.env('CYPRESS_ENV')) распечатывает слово test.

Однако когда тест объединяется с промежуточным этапом в моем конвейере, он все равно печатает слово test и переходит в среду разработки.

Вот мой cypress.config.ts

import { defineConfig } from 'cypress';

export default defineConfig({
  chromeWebSecurity: false,
  pageLoadTimeout: 60000,
  blockHosts: '*datadoghq.com',
  projectId: '5cwnfh',
  defaultCommandTimeout: 40000,
  requestTimeout: 40000,
  responseTimeout: 40000,
  execTimeout: 15000,
  taskTimeout: 15000,
  viewportWidth: 1440,
  viewportHeight: 900,
  numTestsKeptInMemory: 0,
  retries: {
    runMode: 2,
  },
  env: {
    COMPANY_API_BASE_URL: 'api.staging.my-company.com',
    CYPRESS_ENV: 'test',
  },
  e2e: {
    fixturesFolder: 'fixtures',
    baseUrl: 'https://e2etest.dev.my-company.com:3003',
    specPattern: 'cypress/e2e/**/*.{ts,tsx}',
  },

  component: {
    devServer: {
      framework: 'next',
      bundler: 'webpack',
    },
  },
});

Я думаю, что тест в CI не пройден из-за моего CYPRESS_ENV, который я вставил в свой cypress.config.ts во время устранения неполадок. Однако, если я удалю CYPRESS_ENV из моего config.ts, тест перейдет к блоку else и запустится в промежуточном режиме, когда я запускаю его локально, потому что в console.info, когда я запускаю локально, он печатает «неопределено».

Как заставить Cypress запускать «тестовую» среду для CYPRESS_ENV локально, «тестовую» среду для CYPRESS_ENV, когда GITHUB_REF не промежуточный в CI, и «промежуточную» среду для CYPRESS_ENV, когда GITHUB_REF промежуточный в CI?

В других проектах у меня есть команда в задании кипариса в CI, где я могу корректировать значения в командной строке, но этот тест запускает кипарис автоматически. Вот моя кипарисовая работа в CI:

  cypress-test:
    needs: [workflow-info, build]
    runs-on: ubuntu-latest
    env:
      WORKER_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }}
      BASE_URL: ${{ needs.workflow-info.outputs.base-url }}
      API_BASE_URL: ${{ needs.workflow-info.outputs.api-host }}
      CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }} 
    strategy:
      fail-fast: false
      matrix:
        containers: [1, 2, 3, 4, 5, 6, 7, 8, 9]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          cache: 'yarn'
          node-version: '20.9.0'
      - name: Install Specific Chrome Version
        run: |
          sudo apt-get install -y wget
          sudo wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
          sudo apt-get install ./google-chrome-stable_current_amd64.deb
      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        shell: bash
        run: |
          echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
      - uses: actions/cache@v4
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: yarn-${{ hashFiles('yarn.lock') }}
          restore-keys: |
            yarn-
      - name: Restore next build and deps
        uses: actions/cache@v4
        with:
          path: |
            ./next/.next
            ./next/node_modules
            ./legacy/node_modules
            ./node_modules
            ~/.cache/Cypress
          key: next-build-${{ github.sha }}
      - name: Setup /etc/hosts
        run: sudo echo "127.0.0.1 e2etest.dev.my-company.com" | sudo tee -a /etc/hosts
      - name: Print CF Worker Env
        run: |
          echo "CF Worker Env: ${{ needs.workflow-info.outputs.cf-worker-env }}" 
      - name: Print CYPRESS_ENV
        run: echo "CYPRESS_ENV=${CYPRESS_ENV}" 
    
      - name: Run App
        run: yarn dev &
      - name: Run Cypress Tests
        uses: cypress-io/github-action@v6
        with:
          browser: chrome
          working-directory: next
          record: true
          parallel: true
          config: baseUrl=${{ needs.workflow-info.outputs.base-url }}
          ci-build-id: ${{ needs.workflow-info.outputs.cypress-run-id }}-${{ github.run_attempt }}
        env:
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_DASHBOARD_KEY_NEXT }}
          DEBUG: '@cypress/github-action'
          CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }}  

🤔 А знаете ли вы, что...
С Node.js можно создавать приложения, работающие в режиме реального времени, такие как чаты и игры.


1
79
2

Ответы:

Решено

Окружение var CYPESS_ENV не попадает в тестовый код, скорее всего, потому, что env является зарезервированным словом и поэтому отклоняется.

Экспериментирование

В чистом проекте (синтаксис Windows)

// package.json

{
  "dependencies": {
    "cypress": "^13.11.0"
  },
  "scripts": {
    "start1": "SET CYPRESS_ENV=legacy && npx cypress open",
    "start2": "SET CYPRESS_CYPRESS_ENV=legacy && npx cypress open",
  }
}
it('logs all Cypress.env()', () => {
  console.info('Cypress.env()', Cypress.env())
})

Запустив yarn start1 с CYPRESS_ENV=legacy, приведенный выше тест регистрирует пустой объект среды:

Cypress.env() ➤ {}

Запустив yarn start2 с CYPRESS_CYPRESS_ENV=legacy, приведенный выше тест регистрирует нужное значение среды:

Cypress.env() ➤ { CYPRESS_ENV: 'legacy' }

Обратите внимание, что по какой-то странной причине в конце значения есть дополнительный пробел.

Если вы добавите двойной префикс переменной окружения, то ваш код before() должен работать с .trim() в операторе if ():

if (Cypress.env('CYPRESS_ENV').trim() === 'legacy') {
  cy.visit('http://e2etest.dev.my-company.com:8081/company/sign-in');
} else {
  cy.visit('http://e2etest.staging.my-company.com:8081/company/sign-in');
}

Мне не удалось использовать для этого переменные CYPRESS_ENV в моем CI, но я смог использовать это, потому что в нем вызывается baseUrl. config: baseUrl=${{ needs.workflow-info.outputs.base-url }} в моем КИ. Я распечатал `console.info('base Url is', Cypress.config().baseUrl); чтобы получить это значение.

 cy.window().then((window) => {
        const baseUrl = Cypress.config().baseUrl;
        console.info('base Url is', baseUrl);

        if (baseUrl === 'https://e2etest.dev.updater.com:3003') {
          cy.visit('http://e2etest.dev.updater.com:8081/company/sign-in');
        } else if (baseUrl === 'https://e2etest.staging.updater.com') {
          cy.visit('http://e2etest.staging.updater.com/company/sign-in');
        } else {
          cy.visit('http://e2etest.updater.com/company/sign-in');
        }
      });

Надеюсь, кто-то найдет это полезным.