2017-02-20 24 views
0

Как сохранить данные MySQL между различными этапами сборки?Gitlab CI: Сохранять данные MySQL между этапами

У меня MySQL настроен как служба, однако при переходе от этапа сборки к развертыванию база данных MySQL пуста, и я не могу найти никакой информации об этом.

Пример gitlab-ci.yml:

image: php:latest 
services: 
    - mysql:5.6 
stages: 
    - build 
    - deploy 

build: 
    stage: build 
    script: 
    - [INSERT MYSQL DATA] 
    allow_failure: false 
    artifacts: 
    when: on_success 
    paths: 
     - /var/lib/mysql/ 
deploy: 
    stage: deploy 
    script: 
    - [MYSQL DUMP] 
    dependencies: 
    - build 
    allow_failure: false 
    when: on_success 

Свалка MySQL будет пустой, несмотря на успешно вставляя данные на этапе сборки.

ответ

1

Согласно странице проблем Gitlab: Share service between build stages. Таким образом, что Gitlab-CI устанавливается такой, что:

каждая работа выполняется в каждом задании выполняется независимо от других, в том числе потенциально , работающие на разных машинах. И услуги выполняются локально на каждом бегуне. Нет никакого способа для одного задания получить доступ к службе на другом бегуне. На GitLab.com мы даже перерабатываем машину после того, как каждое задание выполняется, чтобы все службы были уничтожены. @markpundsack

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

Таким образом, вы можете справиться с этим в течение нескольких способов:

  1. имеют те setup и test в той же работе
  2. Создание SQL докер со всеми данными, добавил уже (плохая практика, но если вам это нужно)
  3. Создание дампа в setup и делиться, как артефакт затем перезагрузить эти данные с test

EDIT: Добавление примечания о том, что использование компонента expire_in для артефактов может быть полезным, поскольку вы не хотите хранить кучу данных, которые вам могут понадобиться навсегда.

EDIT2: После изучения еще нескольких, я нашел this от gitlab. Вы можете сделать следующее:

services: 
- mysql 
variables: 
    # Configure mysql service (https://hub.docker.com/_/mysql/) 
    MYSQL_DATABASE: hello_world_test 
    MYSQL_ROOT_PASSWORD: mysql 
connect: 
    image: mysql 
    script: 
    - echo "SELECT 'OK';" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE" 
    - SOME DATABASE DUMPING 
artifacts: 
    when: on_success 
    paths: 
     - /var/lib/mysql/ 
+0

Это не представляется возможным разделить данные из '/ вар/Lib/mysql' на службе тузд в хост-контейнер и использовать его как артефакт? –

+0

Чтобы получить доступ к сервису, вам понадобится '/ var/lib/mysql'. При использовании 'artifact' вы делаете это для текущего изображения. Вы можете попробовать и использовать mysql в качестве изображения для этапа сборки. – jrbeverly

+0

Сделано для ответа, чтобы включить документированный случай gitlab. С этим вы можете заполнить базу данных, а затем поделиться выходом как артефактом. – jrbeverly