Как я заставил Travis CI пушить документацию в репозиторий

в 23:12, , рубрики: Песочница, метки: ,

Предисловие

Конечно, есть простой вариант автоматического деплоймента одной строчкой конфига groc'a на github pages, но мы же не ищем лёгких путей.

После 5-х часов мучений на винде и дюжины неудачных сборок, я всё-таки пересел на linux. Так как ruby поставился, gem тоже и даже gem install travis сработал. Но вот travis encrypt я так и не смог заставить работать. Ничего не понятно? Читай дальше.

Зачем это нужно?

  1. Удобно — не надо париться с обновлением документации. После каждой сборки и прохождения тестов генерится новая документация и пушится в репозиторий.
  2. Travis encrypt позволяет не выкладывать всем напоказ в паблик репозиторий свой private ssh.

К чему я пришёл

  1. Нужно сгенерить свой ssh-key и связать его с githab'ом (в первом ответе хорошо объясняется);
  2. Добавить в файл .travis/deploy_key.pem свой private ssh;
  3. Добавить на travis-виртуальной машинке свой ssh;
  4. Выполнить всё, что надо со своим репозиторием.

Пробема: все увидят твой private ssh key.

Для решения этой проблемки и нужен travis encrypt. Скормив ему свой ключик и получив rsa из aes'a, можно не бояться, что кто-то чужой, злой и нуждающийся в твоём бесполезном репозитории злоумышленник сможет так легко сломать твой проект.

Реализация всего этого

Итак, объясняю, как всё делать в консоли linux:

  1. Ставим руби (версию 1.9.3 или выше):
    sudo apt-get install ruby1.9.3

  2. Ставим travis (может потребовать установить какие-нибудь зависимости для gem'а, но это не проблема):
    gem install travis

  3. Теперь можно шифровать свои файлики и переменные окружения.
    • Генерим ssh-key и соединяемся с репозиторием (в моём случае это github) по нему (ссылка на инструкцию выше);
    • теперь в ~/.ssh/id_rsa лежит ваш частный ключ, чтобы зашифровать его выполним следующее
      travis encrypt-file ~/.ssh/id_rsa --add

      опция --add сразу добавит зашифрованный файл/переменную в .travis.yml

    • лично у меня почему-то выходной файл после шифрования выглядел, как ~/.ssh/id_rsa, что приводило к ошибке — просто убрал обратный слэш
    • также я не хотел, чтобы при сборке все видели мой e-mail. Его я тоже зашифровал:
      travis encrypt MY_MAIL="a.a.pakhomoff@gmail.com" --add

      теперь нужно только в требуемом месте файла .travis.yml добавить $MY_MAIL вместо «a.a.pakhomoff@gmail.com»

    • остаётся самое логичное, но не самое простое: подключиться по ssh к репозиторию с правами пуша с тревиса под своим именем, выполнить необходимую логику (не настаиваю, что моя идеально, но работает) и запушить в нужную ветку (причём тревис клонирует не весь репозиторий, а только ветку, с которой сработал хук пуша)

Итоговый файл .travis.yml с пояснениями

language: node_js
node_js:
- '0.12'
notifications:
email: false
before_install:
- openssl aes-256-cbc -K $encrypted_ca96f6bc6cbe_key -iv $encrypted_ca96f6bc6cbe_iv
-in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d # то, что добавилось после шифрования 
# файла, я только указал явно, откуда брать зашифрованный и куда его расшифровать

# удаляем прежнюю документацию, чтобы заменить на свежую сгенеренную
- git rm -rf doc/* 

before_script:
# тоже зашифрованная переменная с моим e-mail адресом
- git config --global user.email $MY_MAIL 
- git config --global user.name "Travis-CI"

after_success:
- chmod 600 ~/.ssh/id_rsa # именно такие права должны быть у файла с частным ключом
# кстати, при создании  ssh-key необходимо оставить пустым passphrase, 
# иначе по shh-add будет просить ввод этой фразы

# активируем агента и добавляем ssh-key
- eval "$(ssh-agent)" 
- ssh-add

# ну дальше, в общем, всё понятно: добавляем то, 
# что есть, прячем изменения, переключаемся на ветку, 
# в которую надо сохранить доки и мёржимся со спрятанными 
# изменениями по стратегии взять то, что там
- git remote add deploy git@github.com:Faverick/trendets.git
- git add doc/*
- git stash
- git checkout develop
- git merge --squash --strategy-option=theirs stash
- git stash clear
- git commit -m "Documentation updated"
- git push deploy develop
env:
global: # а это мой e-mail
secure: h4uLA8Fu/ncekMDeYYS7kI8Nh0FIv+XaQ2DAW5AuRsA3dqcgxvlnOA0vnkYmnvGmZ8amcRYqNq7MX/apzPwtv7GkXf7WcGgDnCfoxLcZiva/e4P51ZU62B4iYbIQ1OMCKkQvenS+Ajtk7yxKYqiEEhRyjoCpLJMzzNd0uQR5uH0=

P.S. очень много информации взял из документации Travis CI

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js