В предыдущей части рассмотрен сам продукт, а также простенький пример работы с PaaS реализацией. Пойдем дальше. Поставим Ruby-on-Rail 4 с PostgreSQL. В процессе познакомимся:

1. С встроенными граблями.
2. Схемой разработки, она отличается от таковой у v2.
3. Некоторыми командами консольного клиента.

Создаем среду разработчика


Вообще готовая конфигурация «Ruby-on-Rail 4 с PostgreSQL» появлялась на web консоли и пропадала, так как вставала криво. Надежнее ручками по инструкции из репозитория на гитхабе. Коротко делаем форк себе, потом клонироуем локально.

Создаём проект:

$ oc new-project myror4
$ oc new-app openshift/templates/rails-postgresql.json -p SOURCE_REPOSITORY_URL=https://github.com/< yourusername >/rails-ex 

Что-то такое
   
--> Deploying template rails-postgresql-example for "openshift/templates/rails-postgresql.json"

     rails-postgresql-example
     ---------
     An example Rails application with a PostgreSQL database

     * With parameters:
        * Name=rails-postgresql-example
        * Namespace=openshift
        * Memory Limit=512Mi
        * Memory Limit (PostgreSQL)=512Mi
        * Git Repository URL=https://github.com/zirf0/rails-ex
        * Git Reference=
        * Context Directory=
        * Application Hostname=
        * GitHub Webhook Secret=epApEumIQAFhye32wPsXlnAaDrh34UdoJlw6fGyC # generated
        * Secret   Key=b7augcv4ehdml4lyicyvi0tykum1t6stpwbrv8wpkxydrjpsg5rsrsoovxkjb6lf3wcp45f0wwp60b8uxd7qk1ma7kdmpm3kc00620girongf5aoqlh16fv3xsr0lqh # generated
        * Application Username=openshift
        * Application Password=secret
        * Rails Environment=production
        * Database Service Name=postgresql
        * Database Username=userJSV # generated
        * Database Password=0gD2YwnJ # generated
        * Database Name=root
        * Maximum Database Connections=100
        * Shared Buffer Amount=12MB
        * Custom RubyGems Mirror URL=

    --> Creating resources with label app=rails-postgresql-example ...
    service "rails-postgresql-example" created
    route "rails-postgresql-example" created
    imagestream "rails-postgresql-example" created
    buildconfig "rails-postgresql-example" created
    deploymentconfig "rails-postgresql-example" created
    service "postgresql" created
    deploymentconfig "postgresql" created
    --> Success
    Build scheduled, use 'oc logs -f bc/rails-postgresql-example' to track its progress.
    Run 'oc status' to view your app. 


Вообще в этом выводе важная информация явкиимена/пароли/база PostgreSQL, и GitHub Webhook Secret, который понадобится ниже.

$ oc logs -f bc/rails-postgresql-example

А вот и лог

Pulling image "registry.ops.openshift.com/rhscl/ruby-23-rhel7@sha256:26423d3ba7749e77884580dfec370c0007d6bcfd331b89c2c24d45964f9da7ff" ...
Pulling image "registry.ops.openshift.com/rhscl/ruby-23-rhel7@sha256:26423d3ba7749e77884580dfec370c0007d6bcfd331b89c2c24d45964f9da7ff" ...
Cloning "https://github.com/zirf0/rails-ex" ...
        Commit: b857f63c0fdb991cf93a52b80d325f7ab635c775 (Merge pull request #61 from luciddreamz/master)
        Author: Ben Parees <bparees@users.noreply.github.com>
        Date:   Tue Sep 20 09:12:28 2016 -0400

---> Installing application source ...
---> Building your Ruby application from source ...
---> Running 'bundle install --deployment' ...
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Installing rake 10.4.2
Installing i18n 0.7.0
Installing json 1.8.2 with native extensions
Installing minitest 5.6.1
Installing thread_safe 0.3.5
Installing tzinfo 1.2.2
Installing activesupport 4.2.1
Installing builder 3.2.2
Installing erubis 2.7.0
Installing mini_portile 0.6.2
Installing nokogiri 1.6.6.2 with native extensions
Installing rails-deprecated_sanitizer 1.0.3
Installing rails-dom-testing 1.0.6
Installing loofah 2.0.1
Installing rails-html-sanitizer 1.0.2
Installing actionview 4.2.1
Installing rack 1.6.0
Installing rack-test 0.6.3
Installing actionpack 4.2.1
Installing globalid 0.3.5
Installing activejob 4.2.1
Installing mime-types 2.5
Installing mail 2.6.3
Installing actionmailer 4.2.1
Installing activemodel 4.2.1
Installing arel 6.0.0
Installing activerecord 4.2.1
Installing debug_inspector 0.0.2 with native extensions
Installing binding_of_caller 0.7.2 with native extensions
Installing columnize 0.9.0
Installing byebug 4.0.5 with native extensions
Installing coffee-script-source 1.9.1.1
Installing execjs 2.5.2
Installing coffee-script 2.4.1
Installing thor 0.19.1
Installing railties 4.2.1
Installing coffee-rails 4.1.0
Installing multi_json 1.11.0
Installing jbuilder 2.2.13
Installing jquery-rails 4.0.3
Installing pg 0.18.1 with native extensions
Installing puma 2.11.3 with native extensions
Using bundler 1.10.6
Installing sprockets 3.0.3
Installing sprockets-rails 2.2.4
Installing rails 4.2.1
Installing rdoc 4.2.0
Installing sass 3.4.13
Installing tilt 1.4.1
Installing sass-rails 5.0.3
Installing sdoc 0.4.1
Installing spring 1.3.4
Installing sqlite3 1.3.11 with native extensions
Installing turbolinks 2.5.3
Installing uglifier 2.7.1
Installing web-console 2.1.2
Bundle complete! 14 Gemfile dependencies, 56 gems now installed.
Bundled gems are installed into ./bundle.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
= 1.8.7 : gem install rdoc-data; rdoc-data --install
= 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
---> Cleaning up unused ruby gems ...
---> Starting asset compilation ...
I, [2016-10-12T12:07:17.702238 #18863]  INFO -- : Writing /opt/app-root/src/public/assets/application-dfda1387e2621704c9c53ddd9c1573c1f5099fd3108a2a96d2b02d9b79203f15.js
I, [2016-10-12T12:07:17.717678 #18863]  INFO -- : Writing /opt/app-root/src/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css

Running post commit hook ...
sh: cannot set terminal process group (-1): Inappropriate ioctl for device
sh: no job control in this shell
Run options: --seed 19349

Running:

.

Finished in 0.096597s, 10.3523 runs/s, 10.3523 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

Pushing image 172.30.47.227:5000/myror4/rails-postgresql-example:latest ...
Pushed 0/5 layers, 1% complete
Pushed 1/5 layers, 33% complete
Pushed 2/5 layers, 74% complete
Pushed 3/5 layers, 83% complete
Pushed 4/5 layers, 100% complete
Pushed 5/5 layers, 100% complete
Push successful


Переходим к «Overview» на web консоли дабы перейти к нашему приложению. Красуется наша public/index.html. Можем и у себя посмотреть, если что.

Настройка Github Webhook


Идея простая. На странице инструкция как настроить автодеплой на push на github.com. Там неточность(как и QuickStart'ом ROR4), в «Builds» > «rails-postgesql-example» > «Action»(выпадающее меню) > «Edit». Там «GitHub WebHook». Далее по инструкции. Но вообще GitHub Webhook Secret мы уже сохранили раньше, хук сам по себе:

https://api.preview.openshift.com/oapi/v1/namespaces/project.metadata.name/buildconfigs/buildConfig.metadata.name/webhooks/<Our GitHub WebHook Secret>/github.

То есть можно сразу переходить к гитхабу.

Теперь если вы что-то сделали локально и отправили на гитхаб, то автоматом изменение попадет на OpenShift PaaS.

Кстати, в копилку.

$ oc get -o wide pods
NAME                               READY     STATUS      RESTARTS   AGE       IP          NODE
postgresql-1-72xmi                 1/1       Running     0          1h        10.1.51.8   ip-172-31-10-169.ec2.internal
rails-postgresql-example-1-build   0/1       Completed   0          1h        10.1.8.4    ip-172-31-11-86.ec2.internal
rails-postgresql-example-1-z6q8d   1/1       Running     0          58m       10.1.8.4    ip-172-31-11-86.ec2.internal

$ oc rsh postgresql-1-72xmi
sh-4.2$ exit
$

К любому работающему поду можно подключиться. В v2 было подключение по ssh.

Что делать


Есть вариант пойти дальше ковырять платформу, но нет проектов в работе, а выдумывать задачу… Я склоняюсь к написанию компиляции по архитектуре продукта путем глубокого изучения документации. Результат будет не мгновенный, но документация сырая и только на английском.

UPD1. Webhook github отрабатывает, а OpenShift v3 отвечает 401, не авторизован, то есть ребилд нужно запускать вручную. Будем разбираться.
Поделиться с друзьями
-->

Комментарии (2)


  1. arzonus
    13.10.2016 15:37

    Добрый день!
    Спасибо за статью.

    Скажите пожалуйста, а что с данными PostgreSQL при ребилдинге? Стоит ли вообще запускать PostgreSQL в контейнере, так как непонятно где и как хранятся данные? А как дела с бекапом, репликами и HA?


    1. zirf
      13.10.2016 16:07

      Вообще, контейнер Docker с СУБД данных в себе содержать не должен. Контейнер — запущенный экземпляр образа (image), и если его удалить, то все внесенные в него данные будут потеряны. Новый контейнер будет содержать данные образа, а там движок и окружение. Поэтому содержимое хранят отдельно, к каталогу внутри контейнера монтируется каталог хранилища (можно другой контейнер, но не пользовался). Тут в темплэйтах все описывается. Скорее всего, данные хранятся снаружи. Пробовать надо. Я же говорю, перспективно выглядит, но under development.
      Тут в документации пока ясно, что репликацией и HA заведует слой pods(грубая аналогия — виртуальная или физическая машина для контейнеров)/services(сервера балансировки/репликации) — это понятия из kubernetes, у меня не хватает опыта работы, если честно. Поэтому и хочу с документацией разобраться.