[Из песочницы] Интеграция AppCenter и GitLab

Трям, здравствуйте!

Хочу рассказать о своём опыте настройки интергации GitLab и AppCenter через BitBucket.

Необходимость такой интеграции возникла в ходе настройки автоматического запуска UI тестов для кроссплатформенного проекта на Xamarin. Подробный туториал под катом!

* Об автоматизации UI тестирования в условиях кроссплатформенности сделаю отдельную статью, если публика заинтересуется.

Подобного материала нарыла только одну статью. Поэтому моя статья может кому-нибудь помочь.

Задача: Настроить автоматический запуск UI тестов на AppCenter при том, что наша команда использует GitLab как систему контроля версий.

Проблема оказалась в том, что AppCenter не интергируется с GitLab напрямую. Как одино из решений был выбран обход через BitBucket.


Шаги

Не вижу необходимости описывать это подробнее:)

Нам нужно, чтобы при push/merge в репозиторий изменения заливались еще и на BitBucket. Для этого добавляем runner (или редактируем существующий .gitlab-ci.yml файл).

Cначала добавляем команды в секцию before_scripts

 - git config --global user.email "user@email"
 - git config --global user.name "username"

Потом добавляем следующую команду в нужный stage:

- git push --mirror https://username:password@bitbucket.org/username/projectname.git

В моём случае получился вот такой файл

before_script:
 - git config --global user.email "user@email"
 - git config --global user.name "username"

stages:
  - mirror
mirror:
  stage: mirror
  script:
    - git push --mirror https://****:*****@bitbucket.org/****/testapp.git

Запускаем билд, проверяем, что на BitBucket легли наши изменения/файлы.
* как показала практика, настройка SSH ключей необязательна. Но, на всякий случай, приведу алгоритм настройки соединения именно через SSH ниже


Подключение через SSH

Сначала нужно сгенерировать SSH ключ. Об этом написано множество статей. Для примера можете посмотреть тут.
Сгенерированные ключи выглядят примерно так:
ugcrgvuenvg5wsrmxuq8ludp-1k.png

Далее секретный ключ нужно добавить как переменную на GitLab. Для этого идем в Settings > CI/CD > Enviroment Variables. Добавляем ВСЁ содержимое файла, в который вы сохранили секретный ключ. Назовём переменную SSH_PRIVATE_KEY.
* этот файл, в отличие от файла с открытым ключем, не будет иметь расширения
o5f-xmhtxjhhzi1y2odkpbyjmie.png

Отлично, дальше нужно добавить открытый ключ на BitBucket. Для этого открываем репозиторий, переходим в Settings > Access Keys.

czeygufhhay8dgh917qwcr-8gyw.png

Тут наживаем Add Key и вставляем содержимое файла с публичным ключем (файл с расширением .pub).

Следующим шагом будет использование ключей в gitlab-runner. Используйте эти команды, но укажите вместо звёздочек свои данные

image: timbru31/node-alpine-git:latest

stages:
  - mirror

before_script:
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
  - git config --global user.email "*****@***"
  - git config --global user.name "****"
  - ssh -T git@bitbucket.org

mirror:
  stage: mirror
  script:
    - git push --mirror https://****:****@bitbucket.org/*****/*****.git

Создаём новое приложение на AppCenter.


b6zq3uabgsvdxe5wicbpzrf4u0q.png

Указываем язык/платформу


wkc8uegmqonpwiop4mcidzk7xnw.png

Далее заходим в секцию Build только что созданного приложения. Выбираем там BitBucket и репозиторий, созданный на этапе 1.

Отлично, теперь нужно настроить билд. Для этого находим иконку шестеренки


0-lkxoxqhryeqwsrszupmdpdqua.png

В принципе, там всё интуитивно понятно. Выбираем проект и конфигурацию. При необходимости включаем запуск тестов после билда. Они будут запускаться автоматически.

В принципе, на этом всё. Звучит несложно, но, естественно, гладко всё не пройдёт. Поэтому опишу некоторые ошибки, с которыми я столкнулась во время работы:


'ssh-keygen' is not recognized as an internal or external command.

Возникает и-за того, что путь к ssh-keygen.exe не добавлен в переменные окружения.
Варианта два: добавьте C:\Program Files\Git\usr\bin в Enviroment Variables (применится после перезагрузки машины), или запускайте консоль из этой директории.


AppCenter подключился не к тому BitBucket аккаунту?

Для решения проблемы нужно отвязать аккаунт BitBucket от AppCenter. Заходим в неправильный BitBucket аккаунт, идем в профиль пользователя.

ghi_chb6kzscs_6kdwuqfvgok9i.png

Далее переходим в Settings > Access Management > OAuth

rlpera7hzl23shual1n9fepqu-q.png

Нажимаем Revoke, чтобы отвязать аккаунт.

l2wyiui7z47aitc7epcvax94dbe.png

После этого нужно залогиниться под нужным BitBucket аккаунтом
* В крайнем случае еще и почистить кэш браузера

Теперь переходим в AppCenter. переходим в секцию Build, нажимаем Disconnect BitBucket account

cj0v9pww1pmjwxrssz7ddag3tnk.png

Когда старый аккаунт будет отвязан, привязываем AppCenter заново. Теперь уже к нужному аккаунту.


'eval' is not recognized as an internal or external command

Используем вместо команды

  - eval $(ssh-agent -s)

Команду:

  - ssh-agent

В некоторых случаях придётся или указать полный путь к C:\Program Files\Git\usr\bin\ssh-agent.exe, или добавить этот путь в системные переменные на машине, где запущен runner


AppCenter Build пытается запустить билд для проекта из неактуального bitBucket репозитория

В моём случае проблема возникла из-за того, что я работала с несколькими аккаунтами. Решилась очисткой кэша.

© Habrahabr.ru