Невозможно сделать сетевые запросы с gcr.io/cloud-builders/npm - PullRequest
0 голосов
/ 08 апреля 2019

У меня проблемы с запуском интеграционных тестов в Google Cloud Build.

Модульные тесты работают нормально, но интеграционные тесты, выполняющие запросы к внешнему API (с использованием Axios), отображают эту ошибку в Cloud Build:connect ECONNREFUSED 127.0.0.1:80.

Это приложение React, созданное с помощью приложения Create React.Вот cloudbuild.json:

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/npm",
      "entrypoint": "npm",
      "args": [
        "install"
      ],
    },
    {
      "name": "gcr.io/cloud-builders/npm",
      "entrypoint": "npm",
      "args": [
        "run", "build"
      ],
    },
    {
      "name": "gcr.io/cloud-builders/npm",
      "entrypoint": "npm",
      "args": [
        "test"
      ],
      "env": [
        "CI=true",
      ],
    }
  ]
}

Вот пример ошибки:

Step #1: src/reducers/readings › should update state appropriately when starting a fetch readings request
Step #1: 
Step #1: connect ECONNREFUSED 127.0.0.1:80

Любая помощь будет оценена!

-

Следуйтеup:

Я наконец-то отыскал проблему с этим.URL внешнего API был определен в файле .env.Поскольку Cloudbuild не имел доступа к этим переменным, по умолчанию Axios вызывает 127.0.0.1 (localhost), что не удалось.

Проблема была исправлена ​​путем шифрования файла env, сохранения его в качестве ключа Cloud KMS ипредоставив облачному доступу к нему доступ.

# Decrypt env variables
- name: gcr.io/cloud-builders/gcloud
  args:
  - kms
  - decrypt
  - --ciphertext-file=.env.enc
  - --plaintext-file=.env
  - --location=global
  - --keyring=[KEYRING]
  - --key=[KEY]

Спасибо за указатели @ ffd03e.

1 Ответ

0 голосов
/ 11 апреля 2019

Внешний API работает в Cloud Build или где-то еще?Было бы полезно увидеть тест.Кроме того, CI = true поднимается или тесты зависают в режиме наблюдения?(https://facebook.github.io/create-react-app/docs/running-tests#linux-macos-bash)

Похоже, ваш тест пытается подключиться к localhost, что не удается из-за того, что на localhost:80 ничего не работает. Cloud Build должен иметь возможность подключиться к внешнему API. Вотпример:

  • mkdir gcb-connect-test && cd gcb-connect-test
  • npx create-react-app .
  • touch cloudbuild.yaml
  • добавить тесты к src/App.test.js
// This test fails
it('connects with localhost', async () => {
  const response = await axios.get('localhost');
  console.log('axios localhost response: ' + response.data);
  expect(response).toBeTruthy();
});

// This test passes
it('connect with external source', async () => {
    const response = await axios.get('https://jsonplaceholder.typicode.com/users/10');
    console.log('axios external response: ' + response.data.name);
    expect(response.data.name).toBeTruthy();
});
  • edit cloudbuild.yaml (я предпочитаю yaml, потому что вы можете добавлять комментарии (-:)
steps:
  # npm install
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
  # npm run build
- name: 'gcr.io/cloud-builders/npm'
  args: ['run', 'build']

  # bash -c | CI=true npm test
  # syntax to add commands before npm (-:
- name: 'gcr.io/cloud-builders/npm'
  entrypoint: 'bash'
  args:
      - '-c'
      - |
        CI=true npm test
  • gcloud builds submit .

Если это приводит к более странной проблеме, чем просто случайное подключение к localhost, канал #cloudbuild на gcp slack является хорошим ресурсом: slack sign up link

...