Использование переменных окружения действий 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 }}  

Cypress будет анализировать любые переменные среды CYPRESS_* как переменные среды Cypress, удаляя часть переменной среды CYPRESS_. Вы пытались установить переменную среды как CYPRESS_CYPRESS_ENV? docs.cypress.io/guides/guides/…

agoff 14.06.2024 19:05

Похоже, что тест не пройден локально, и если я это сделаю, console.info вернется неопределенным. Я собираюсь предположить то же самое и в CI, пока жду, пока это пройдет.

Pix81 14.06.2024 19:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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');
}

спасибо, но если вы посмотрите на мой yaml выше, то там негде запустить скрипт. Он берет переменную непосредственно из задания workflow-info и запускает ее как для разработки, так и для промежуточной обработки. Я не использую сценарий, я использую файлы конфигурации, поэтому это может быть полезно для тех, кто использует другую настройку CI, но это не решает мою проблему.

Pix81 21.06.2024 17:19

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

Eddy Gilmour 22.06.2024 10:32

Я попытался установить CYPRESS_CYPRESs_ENV в своем файле конфигурации и обернуть его в оператор if if (Cypress.env('CYPRESS_ENV').trim() === 'test') {, и я получил Cannot read properties of undefined (reading 'trim') обратно из теста, и тест не удалось запустить. Кроме того, это полезно, но мне все равно нужно знать, как использовать его с действиями github. вставлен выше, потому что мне нужен оператор if для разработки, if else для постановки и else для производства. Моя проблема связана с переменными окружения и действиями github, а не только с переменными окружения.

Pix81 24.06.2024 16:49

Это работает, я запускал его в локальной системе, но, к сожалению, не могу понять, в чем ваша проблема, из комментария.

Eddy Gilmour 24.06.2024 23:28

Действие GH устанавливает env точно так же, как и локальные сценарии, поэтому, очевидно, вы хотите CYPRESS_CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }} предположить, что ${{ needs.workflow-info.outputs.cf-worker-env }} правильный синтаксис - скорее всего, так оно и есть, если другие переменные env работают.

Eddy Gilmour 24.06.2024 23:30

Мне не удалось использовать для этого переменные 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');
        }
      });

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

Другие вопросы по теме