вторник, 13 августа 2013 г.

Используем travis-ci для сборки, разворачивания и проверки static html сайта.

Как я уже недавно писал, я отчаялся найти static site generator, такой что б мне понравился. (http://apm-linux.blogspot.com/2013/05/static-site-generator-wget.html)
И отказался от этих поисков в пользу такого механизма:

а) Пишем сайт на каком нить фреймворке. используя его вкусные плюшки типа templating (я использую mojolicious)
б) Превращаем его в static html с помощью wget
в) Заливаем это на хостинг.

Все это чудно работает, но утомительно однообразно.

В прошлом посте (http://apm-linux.blogspot.com/2013/08/travis-ciorg-debian-github.html) мы поручили travis-ci.org  собирать deb пакеты, теперь научим его собирать и заливать на хостинг наш сайт.

Несколько замечаний.
а)Для хостинга я буду использовать github pages, подробности тут (http://pages.github.com/).
б)Travis будет не только собирать нам сайт, но и проводить тесты, и заливать его на хостинг.

Возьмем для тренировок сайт korjavin.github.io на котором я когда-нибудь собираюсь сделать визитку.

Так как я, несмотря на всю используемую криптографию, не хочу отдавать travis-ci свой ssh ключ для github, сгенерируем и зальем новый deploy key для этого проекта.

Далее, как обычно, зальем этот ключ в приватный gist, и зашифруем url этого gist публичным ключам travis.

Теперь travis может получить доступ на push к этому git репозитории.
Скучные подробности о шифровании и ключах в предыдушем посте.

Итак, пришло время для самого скрипта сборки, в нем есть несколько интересных трюков:

# Прогоняем тесты
    - ./script/korjavin_github test
# Запускаем mojo app демоном, что б wget мог его получить
    - ./script/korjavin_github daemon &-
#Трюк для отключения проверки хоста
    - mkdir -p ~/.ssh/ && echo "StrictHostKeyChecking no" >> ~/.ssh/config
    - git clone $GIST ../keys && chmod 400 ../keys/id_github_kgio
#Новый трюк с ssh-agent, git clone не умеет указывать в параметрах нужный ключ, поэтому мы испульзуем ssh-agent и ssh-add для закрузки ключа в память
    - ssh-agent sh -c ' ssh-add ../keys/id_github_kgio ; git clone git@github.com:korjavin/korjavin.github.io.git ../kgio'
# Собираем html страницы
    - cd ../kgio &&  wget -q  --html-extension --recursive --no-host-directories  http://127.0.0.1:3000
# Эти команды нужны для того что б при комите git не тормозился на вопросе о авторе
    - git config --global user.email "korjavin@gmail.com"
    - git config --global user.name "Travis-ci build"
# Добавляем новые файлы
    - git add --ignore-errors .
# Новый трюк с определениям а нужен ли коммит
    - if [ -n "$(git status --porcelain)" ]; then git commit -q -a -m 'wget build' ; fi
#Пуш обратно на github
    - ssh-agent sh -c ' ssh-add ../keys/id_github_kgio ; git push origin master '
Итак. Все это чудесно, и убирают всю рутину.
Мы только пушим комиты с кодом, а html сайт собирается сам.

Но, появилась новая мысль. Раз html сайт у нас тоже в github, в отдельной ветке master, почему мы его не проверям на ошибки тем же travis-ci ?

Известная мне утилита для проверки html - htmltidy , хороша всем, но не поддерживает новомодные html5 теги, например footer, которые я использую.

Соберем для проверки новую версию tidy из https://github.com/w3c/tidy-html5.git, так даже интереснее.

Итак, появился новый скрипт



before_install:
    - sudo apt-get -qq update
#зависимость для tidy
    - sudo apt-get install xsltproc
#клонируем и собираем tidy
    - git clone https://github.com/w3c/tidy-html5.git ../tidy
    - pushd ../tidy
    - make -C build/gmake/
    - sudo make install -C build/gmake/
    - popd
install: true
script:
#Ищем все html файлы, и прогоням для них тест на ошибки (-e)
    - find . -iname '*html' -type f -print -exec /usr/local/bin/tidy -q -e {} \;
 
Отлично, сразу нашлось несколько незакрытых html тегов.

Теперь наш единственный пуш в ветку с исходниками, вызывает целую цепочку.
1. travis клонирует его себе
2. Собирает  html код
3. Заливает его в ветку master
4. Так как в ветке был новый пуш, travis выполняет скрипт из этой ветки
5. Клонирует себе html код, устанавливает tidy и выполняет проверки

Все это отлично, и радует меня. Но есть единственная недоработка.
travis-ci при работе, ориентируется на exit code команд вызываемых в нашем скрипте.
А find .... всегда возвращает 0, независимо от проверок tidy.
Поэтому мы не видим этих ошибок в почте, а вынуждены идти через веб интерфейс смотреть лог.

Поработаем над этим в следущий раз.