Тест интеграции Azure Pipelines с Google Cloud SQL DB с использованием облачного прокси - PullRequest
0 голосов
/ 09 декабря 2018

Я управляю репозиторием облачных функций NodeJS, который выполняет некоторые операции с БД, такие как 'userExists' и т. Д., И хотел бы провести интеграционный тест с моей БД Google Cloud SQL.Чтобы сделать это на моем локальном компьютере, я запускаю прокси-приложение на определенном порту, а затем настраиваю Knex на использование этого порта.

Однако я также хотел бы настроить CI / CD для этого с помощью конвейеров Azure.,Google позволяет загружать прокси как образ докера, что я и сделал.Я сделал доступным для него ключ учетной записи службы и успешно запустил его, однако, когда я запускаю свои тесты, они все еще не могут подключиться к прокси.

Часть файла YAML моего конвейера, которая имеет дело с проксии запуск тестов выглядит следующим образом:

- script: |
    docker run -d \
    -v 'qa-key.json':/config \
    -p 127.0.0.1:5432:5432 \
    gcr.io/cloudsql-docker/gce-proxy:1.12 /cloud_sql_proxy \
    -instances=$(DBInstanceConnectionName)=tcp:0.0.0.0:5432 -credential_file=/config
  displayName: 'Run GCP Proxy'

- task: Npm@1
  displayName: 'Run Tests'
  inputs:
    command: custom
    customCommand: 'test'

Доступна команда test, которая запускает тесты.Функция, которая настраивает knex, выглядит следующим образом:

const connectKnex = () => {
    const config = {
        user: 'my_user',
        password: 'my_users_password',
        database: 'my_db',
        port: 5432
    }

    return knex({
        client: 'pg',
        connection: config
    });
}

Я предполагаю, что моя проблема возникает из-за того, что задача, выполняющая прокси-сервер, больше не выполняется после запуска тестов, но я понятия не имею, как это проверить / исправить.

1 Ответ

0 голосов
/ 10 декабря 2018

Проблема 1: Я не видел вывод из моего док-контейнера

Я скопировал команду для запуска док-контейнера непосредственно со страницы поддержки Google .Проблема состоит в том, что эта команда содержит флаг -d (detach), который заставляет контейнер работать в фоновом режиме и скрывает его вывод, что затрудняет отладку.После удаления я смог увидеть, что образ прокси не смог найти файл учетных данных.

Проблема 2: Файл учетных данных не найден

Я не былв состоянии потратить время на поиск правильного решения этой проблемы.Поскольку я запускаю образ прокси на сервере сборки Azure, у меня нет доступа к интерактивному терминалу, с которого можно попытаться получить доступ к файловой системе образа, чтобы попытаться отладить монтирование.Эта проблема была исправлена ​​вместе со следующей проблемой.

Проблема 3: Я загружал файл-заполнитель для ключа учетной записи службы и заполнял его из секретной переменной в процессе сборки вместо использованияфункция безопасного файла в конвейерах Azure

Загрузка защищенного файла позволяет загружать файл в процессе сборки, не беспокоясь о том, где он хранится при загрузке, так как местоположение хранится в переменной., очень просто использовать .Я просто включил переменную location в команду запуска прокси, и она прошла гладко.

Проблема 4: Мне нужно, чтобы прокси все еще работал, когда я запускаю тесты

Прокси-сервер - это длительный процесс, поэтому запускающая его задача конвейера будет продолжать работать и блокировать выполнение остальной части конвейера до тех пор, пока прокси-сервер не остановится.Но прокси должен был работать во время выполнения тестов, поэтому единственное решение, о котором я мог подумать, это поставить их в одну и ту же задачу.

Я смог сделать это, выполнив следующую команду

<proxy launch command> & \
sleep 20 && \ //wait for the proxy to finish launching
yarn test && \
docker stop $(docker ps -a -q) //kill the proxy once tests finish running

Наконец, yaml, который загружает файл и запускает прокси-сервер и тесты, выглядит следующим образом:

- task: DownloadSecureFile@1
  displayName: Download QA Key
  inputs:
    secureFile: 'qa-key.json'

- script: |
    docker run \
    -v $(Agent.TempDirectory):/config \
    -p 127.0.0.1:5432:5432 \
    gcr.io/cloudsql-docker/gce-proxy:1.12 /cloud_sql_proxy \
    -instances=$(DBInstanceConnectionName)=tcp:0.0.0.0:5432 - 
    credential_file=/config/qa-key.json & \ 
    sleep 20 && \
    yarn test && \
    docker stop $(docker ps -a -q)
  displayName: 'Run Tests'
...