Настройка непрерывной доставки (Continuous delivery CD) для вашего проекта c github.com

Hеобходимо:

  • Репозиторий на github.com
  • Сервер для Ansible (для примера ip: 1.1.1.1)
  • Сервер для развертывания вашего проекта (для примера ip: 2.2.2.2)
  • Локальная машина с настроенным проектом
  • Базовые знания работы в командной строке, Travis CI и Ansible

Настройка сервера, на котором мы развернем проект


[ root@2.2.2.2 ] adduser ansible #добавить пользователя, из под которого Ansible будет заходить на сервер и в директории которого развернем наш проект
[ root@2.2.2.2 ] su - ansible
[ ansible@2.2.2.2 ] ssh-keygen -t rsa -b 4096 -C 'github' -f ~/.ssh/github_key #сгенерировать ключ без passphrase для деплоя репозитория
[ ansible@2.2.2.2 ] eval "$(ssh-agent -s)"?
[ ansible@2.2.2.2 ] ssh-add ~/.ssh/github_key
[ ansible@2.2.2.2 ] cat ~/.ssh/github_key.pub #вывести на экран и скопировать публичный ключ github_key.pub

Добавить публичный ключ github_key.pub в ключи для деплоя репозитория на github.com
(В настройках репозитория github.com вкладка «Deploy keys»)

Настройка сервера с Ansible


[ root@1.1.1.1 ] yum install ansible
[ root@1.1.1.1 ] adduser ansible #добавить пользователя, из под которого Travis будет заходить на этот сервер
[ root@1.1.1.1 ] su - ansible
[ ansible@1.1.1.1 ] ssh-keygen -t rsa -b 4096 -C 'ansible' -f ~/.ssh/ansible_key #сгенерировать ключ без passphrase для подключения к серверу с проектом
[ ansible@1.1.1.1 ] eval "$(ssh-agent -s)"?
[ ansible@1.1.1.1 ] ssh-add ~/.ssh/ansible_key
[ ansible@1.1.1.1 ] cat ~/.ssh/ansible_key.pub #вывести на экран и скопировать публичный ключ  ansible_key.pub

Добавить публичный ключ ansible_key.pub на сервер нашего проекта

[ ansible@2.2.2.2 ] mcedit .ssh/authorized_keys
[ ansible@2.2.2.2 ] chmod 600 .ssh/authorized_keys

Добавить в файл hosts.yml ip сервера нашего проекта

[ ansible@1.1.1.1 ] mcedit /path/to/ansible/hosts.yml

hosts.yml
[ansible]
2.2.2.2

Написать небольшой playbook, который будет выкладывать актуальную версию ветки master

[ ansible@1.1.1.1 ] mcedit /path/to/ansible/playbook.yml

playbook.yml
- hosts: all
   user: ansible
   tasks:
       - name: Clone git repo
         git:
             repo: ssh://git@github.com/{github_username}/{github_repo}.git
             dest: /home/ansible/var/www/{github_repo}
             version: master
             accept_hostkey: yes
             force: yes

Настройка Travis


Зарегистрироваться на сайте travis-ci.org через свой аккаунт github.com
Включить интеграцию для нужного репозитория
В настройках репозитория Travis включить:

  • Build only if .travis.yml is present
  • Build branch updates

На своей локальной машине, где у вас развернут проект установить утилиту travis и авторизоваться:

[ user@local ] gem install travis
[ user@local ] travis login --auto

Сгенерировать ssh ключ без passphrase, с помощью которого Travis будет подключаться к серверу Ansible.

[ user@local ] ssh-keygen -t rsa -b 4096 -C 'travis' -f travis_key #сгенеририровать ключ без passphrase для подключения Travis к серверу с Ansible
[ user@local ] cat travis_key.pub #вывести на экран и скопировать публичный ключ  travis_key.pub

Добавить публичный ключ travis_key.pub на сервер Ansible в файл /home/ansible/.ssh/authorized_keys

 
[ ansible@1.1.1.1 ] mcedit /home/ansible/.ssh/authorized_keys
[ ansible@1.1.1.1 ] chmod 600 /home/ansible/.ssh/authorized_keys

Зашифровать приватный ключ утилитой travis:

[ user@local ] travis encrypt-file travis_key --add

На выходе должен появиться файл travis_key.enc и .travis.yml. В файле .travis.yml будет строка для дешифрования нашего ключа вроде этой

openssl aes-256-cbc -K $encrypted_412afa050e5f_key -iv $encrypted_412afa050e5f_iv -in travis_key.enc -out /tmp/travis_key -d

Добавить оба файла в git:

[ user@local ] git add travis_key.enc .travis.yml 

Отредактировть файл .travis.yml:

[ user@local ] mcedit /path/to/repo/.travis.yml

.travis.yml
language: node_js #проект будет на node_js
install: true #мы не будем устанавливать дополнительные зависимости и проводить тесты
sudo: false
branches: #деплой проекта будет только при изменениях в ветке master
  only:
      - master
script:
    - openssl aes-256-cbc -K $encrypted_412afa050e5f_key -iv $encrypted_412afa050e5f_iv -in travis_key.enc -out /tmp/travis_key -d #дешифруем ключ
    - eval "$(ssh-agent -s)"
    - chmod 600 /tmp/travis_key
    - ssh-add /tmp/travis_key
    - ssh -o "StrictHostKeyChecking no" ansible@1.1.1.1 'ansible-playbook playbook.yml' #подключаемся к серверу Ansible и запускаем playbook

Залить изменения в git:

[ user@local ] git push origin master

После этого на странице репозитория в Travis должен появиться примерно вот такой Build.

Travis Build
The command "openssl aes-256-cbc -K $encrypted_412afa050e5f_key -iv $encrypted_412afa050e5f_iv -in travis_key.enc -out /tmp/travis_key -d" exited with 0.

0.01s$ eval "$(ssh-agent -s)"
Agent pid 1842
The command "eval "$(ssh-agent -s)"" exited with 0.

0.01s$ chmod 600 /tmp/travis_key
The command "chmod 600 /tmp/travis_key" exited with 0.

0.01s$ ssh-add /tmp/travis_key
Identity added: /tmp/travis_key (/tmp/travis_key)
The command "ssh-add /tmp/travis_key" exited with 0.

16.68s$ ssh -o "StrictHostKeyChecking no" ansible@2.2.2.2 'ansible-playbook playbook.yml'
Warning: Permanently added '2.2.2.2' (ECDSA) to the list of known hosts.

PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [2.2.2.2]
TASK [Clone git repo] **********************************************************
changed: [2.2.2.2]
PLAY RECAP *********************************************************************
2.2.2.2               : ok=1   changed=1    unreachable=0    failed=0   
The command "ssh -o "StrictHostKeyChecking no" ansible@2.2.2.2 'ansible-playbook playbook.yml" exited with 0.
Done. Your build exited with 0.


Теперь при изменениях в ветке master запустится Travis, который вызовет Ansible, а тот выложит свежую версию вашего кода на сервер с проектом.

Надеюсь, что кому нибудь пригодится эта инструкция.
Поделиться с друзьями
-->

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


  1. Sovigod
    03.04.2017 10:42
    +1

    Выкладывать приватные ключи в репозиторий — плохая идея.
    Для вашего кейса достаточно вебхуков.


    1. mrsuh
      03.04.2017 11:04

      Приватные ключи шифруются утилитой travis cli. Так что все норм


  1. kronos
    03.04.2017 16:24
    +1

    Почему «Настройка сервера, на котором мы развернем проект» и «Настройка сервера с Ansible» собственно ансиблом и не настраиваются?


    1. mrsuh
      03.04.2017 16:36

      Сервер с Ansible можно было бы настроить самим Ansible (хотя на самом деле не всё, вроде смены пароля от рута и установки самого Ansible. Поэтому все равно прийдется руками что то настраивать)
      На сервер с проектом все равно нужно сначала настроить доступ, чтобы Ansible смог туда подключиться.


      1. kronos
        03.04.2017 17:03
        +1

        По паролю я бы вообще ходить не стал, сервер можно создать с ключом который у вас по идее должен быть, то есть свежесозданная тачка доступна. И ансибл можно поставить ансиблом ;)


        1. mrsuh
          03.04.2017 18:19

          По паролю никто и не ходит(для надежности, вдруг кто захочет sudo su сделать).
          Можете рассказать, как создать виртуалку сразу с моим ключем(это бы упростило мне жизнь)?


          1. le9i0nx
            03.04.2017 18:28

            1. mrsuh
              03.04.2017 18:31

              Здорово. Нужно попробовать AWS


  1. jsirex
    04.04.2017 11:02
    +1

    hello-world:

    git remote add prod ansible@2.2.2.2:/path/to/bare/repo
    git push prod master
    
    # ..  ну и post-receive hook который сделает checkout