Repository: fidals/shopelectro

Issue:
Move CI to our server
Трэвис на беспланом серве билдит не очень.
Сейчас у нас один travis ci идёт ~20 мин. Учитывая, что мы будем оперировать задачами с оценкой по 15-30 мин, это слишком долго.
Кроме того, Трэвис часто отваливается по ресурсам, что плодит нам в ci рандомные ошибки. А это очень дорого, конечно же.

Исследуй разные коробки. Например travis, jenkins, team-city и тд.
Нам нужно что-то простенькое, позже развернём коробку на своём серве.

Результат задачи - отчёт по исследованию здесь в комментах, решение по инструменту принято, создана новая задача по внедрению инструмента

Концы от нашего хоста бери у @duker33


Discussion:
Рассматриваются только opensource решения?

[Jenkins CI](https://jenkins.io) - хороший вариант (в последнее время он [очень сильно поменялся]( https://jenkins.io/projects/blueocean/)), развитое сообщество, есть тонны всяческих плагинов. Отпугивает - [какой-то странный синтаксис для pipelines](https://jenkins.io/doc/book/pipeline/) и общая сложность

[Drone CI](https://github.com/drone/drone) - написан на Go, используется похожий на travis конфигурационный файл, есть поддержка нескольких вариантов деплоя из коробки (например, может пригодится [обновление сервисов kubernetes](http://plugins.drone.io/mactynow/drone-kubernetes/), если мы выберем его в #177), умеет собирать докер-образы и пушить их в регистр, [тоже из коробки](http://plugins.drone.io/drone-plugins/drone-docker/).
@dveselov , имхо Drone CI выглядит неплохо.
@artemiy312 , что думаешь?
@duker33 , да я бы тоже предпочел Drone CI
@dveselov , пару моментов по процессу:

- знаю из чатика, что ты настроил Drone CI на прод-серве и осталось нашлёпать для него конфиг. Пиши о таких вещах в комменты плз. Чтобы было видно всем и мы сами могли легко вспомнить что происходит с задачей
- для задачи "сделать drone CI конфиг" по канонам pdd нужно поступить так: создаёшь болванку конфиг-файла, пишешь в неё `@todo "Создай конфиг, Drone CI уже есть на прод-серве"`. Создай плз. Ну или я сам позже доблестно ворвусь и создам

Resolving patch:
diff --git a/shopelectro/settings/base.py b/shopelectro/settings/base.py
--- a/shopelectro/settings/base.py
+++ b/shopelectro/settings/base.py
@@ -182,6 +182,8 @@
     },
 }
 
+SELENIUM_URL = os.environ.get('SELENIUM_URL', 'http://se-selenium:4444/wd/hub')
+
 SITE_CREATED = datetime(2013, 1, 1)
 
 LOCALHOST = 'http://127.0.0.1:8000/'


Test patch:
diff --git a/shopelectro/tests/helpers.py b/shopelectro/tests/helpers.py
--- a/shopelectro/tests/helpers.py
+++ b/shopelectro/tests/helpers.py
@@ -1,3 +1,4 @@
+from django.conf import settings
 from django.test import LiveServerTestCase, override_settings
 from selenium.common.exceptions import InvalidElementStateException
 from selenium.webdriver.common.action_chains import ActionChains
@@ -44,7 +45,7 @@ def setUpClass(cls):
         """Instantiate browser instance."""
         super(SeleniumTestCase, cls).setUpClass()
         cls.browser = Remote(
-            command_executor='http://se-selenium:4444/wd/hub',
+            command_executor=settings.SELENIUM_URL,
             desired_capabilities=DesiredCapabilities.CHROME
         )
         cls.wait = WebDriverWait(cls.browser, 120)
diff --git a/shopelectro/tests/tests_selenium_mobile.py b/shopelectro/tests/tests_selenium_mobile.py
--- a/shopelectro/tests/tests_selenium_mobile.py
+++ b/shopelectro/tests/tests_selenium_mobile.py
@@ -4,6 +4,7 @@
 If you need to create new test-suite, subclass it from SeleniumTestCase class.
 Every Selenium-based test suite uses fixture called dump.json.
 """
+from django.conf import settings
 from django.test import LiveServerTestCase
 from django.urls import reverse
 from selenium import webdriver
@@ -30,7 +31,7 @@ def setUpClass(cls):
             },
         }
         cls.browser = webdriver.Remote(
-            command_executor='http://se-selenium:4444/wd/hub',
+            command_executor=settings.SELENIUM_URL,
             desired_capabilities=capabilities
         )
         cls.wait = WebDriverWait(cls.browser, 120)