Travis: Maven билд Java приложения и деплой на Azure

Автор: | 05/30/2016
 

travis_logoTravis — Continuous Integration сервис от разработчиков Github. Является hosted-решением, т.е. располагается на серверах самого Travis.

На данный момент — умеет работать только с гит-репоизториями Github, поддержка других сервисов на 2016 год не планируется.

Начало работы

Для начала работы — переходим на страницу Travis и логинимся с данными доступа Github:

travis_java_1

travis_java_2

Переходим в профиль, и активируем репозитории, за которыми будет «наблюдать» Travis.

В этом примере — это репозиторий gh_java_hellow:

travis_java_3

travis_java_4

Сам репозиторий:

travis_java_5

Сборка Java проекта в Travis

Для того, что бы Travis начал сборку проекта — в корень репозитория необходимо доабвить файл .travis.yml.

Клонируем репозиторий:

$  git clone https://github.com/setevoy2/gh_java_hellow.git

Добавляем файл:

$ touch gh_java_hellow/.travis.yml

Для того, что бы собрать простой Java «Hellow, World» — в .travis.yml достаточно указать:

language: java

Выполняем:

$ echo "language: java" >  gh_java_hellow/.travis.yml

И пушим изменения в репозиторий:

$ cd gh_java_hellow/ && git add .travis.yml && git commit -m "Travis init" && git push origin
[master 8059eab] Travis init
...
To https://github.com/setevoy2/gh_java_hellow.git
   5a7a002..8059eab  master -> master

travis_java_6

После первого пуша- Travis автоматически запустит билд проекта:

travis_java_7

Так как никаких` других опций в файле .travis.yml указано не было — то Travis вызвал Maven 3 только с одной поцией — mvn test -B.

Цикл сборки Travis

Любой билд в Travis включает в себя два шага:

  • install: установка зависимостей;
  • script: запуск скрипта для билда.

Можно вызывать любые другие команды перед шагом install (с помощью опции before_install), перед (before_script) или после (after_script) сборки.

Например, с помощью before_install — можно выполнить установку дополнительных зависимостей до начала сборки проекта. А с помощью опции after_success — выполнить действия после сборки (например — деплой или генерация документации). Опцию after_failure можно использовать для, напрмиер, отправки логов или уведомления в Slack в случае неудачного билда (хотя для уведомлений имеется notifications).

Полный цикл Travis, включая опциональные шаги, выглядит так:

  1. Install apt addons
  2. before_install
  3. install
  4. before_script
  5. script
  6. after_success или after_failure
  7. (опционально) before_deploy
  8. (опционально) deploy
  9. (опционально) after_deploy
  10. after_script

Возвращаясь к билду gh_java_hellow.

Для того, что бы получить результат сборки — добавим шаг mvn clean package.

Редактируем .travis.yml:

language: java
script:
  - mvn clean package

Пушим в репозиторий:

$ git add .travis.yml && git commit -m "mvn clean package" && git push origin

Проверяем билд:

travis_java_8

[INFO] Building war: /home/travis/build/setevoy2/gh_java_hellow/target/javahw.war

И добавим вызов с опциями before_script и т.п.:

language: java
before_script:
 - echo "Starting build"
script:
 - mvn clean package
after_script:
 - echo "Script finished"
after_success:
 - echo "Build was successful. $TRAVIS_TEST_RESULT"
after_failure:
 - echo "Build was failed"

Результат:

travis_java_9

travis_java_10

Список переменных можно найти тут>>>.

Через script можно вызывать и любые другие команды, например — ls -l:

...
after_success:
  - echo "Build was successful. $TRAVIS_TEST_RESULT"
  - ls -l $TRAVIS_BUILD_DIR/target
...

Результат:

travis_java_11

Деплой проекта из Travis

Travis использует dpl для управления деплоями. К сожалению — dpl для Azure весьма ограничен, тем не менее — пример деплоя с его помощью.

В каталоге target имеется артефакт — javahw.war, который необходимо задеплоить в Azure WebApp.

Пример WepApp:

travis_java_12

И подключенный Local Git в роли Deployments source:

travis_java_13

Содержимое:

> dir
D:\home\site\wwwroot
Volume in drive D is Windows
 Volume Serial Number is 92C5-0843

 Directory of D:\home\site\wwwroot

05/30/2016  11:32 AM    <DIR>          .
05/30/2016  11:32 AM    <DIR>          ..
05/30/2016  11:32 AM           202,392 hostingstart.html

Редактируем .tarvis.yml и добавляем блок:

language: java
before_script:
 - echo "Starting build"
script:
 - mvn clean package
after_script:
 - echo "Script finished"
after_success:
 - echo "Build was successful. $TRAVIS_TEST_RESULT"
 - ls -l $TRAVIS_BUILD_DIR/target
after_failure:
 - echo "Build was failed"
deploy:
 provider: azure_web_apps
 username: javahw
 password: p@ssw0rd
 site: javahw
 skip_cleanup: true
 verbose: true

Пушим:

$ git add .travis.yml && git commit -m "Azure site deploy" && git push origin
[master 83d5ef2] Azure site deploy
 1 file changed, 5 insertions(+)
...

Запускаем билд:

travis_java_14

Содержимое WebApp:

> dir
D:\home\site\wwwroot
Volume in drive D is Windows
 Volume Serial Number is 92C5-0843

 Directory of D:\home\site\wwwroot

05/30/2016  12:41 PM    <DIR>          .
05/30/2016  12:41 PM    <DIR>          ..
05/30/2016  12:41 PM    <DIR>          .ssh
05/30/2016  12:46 PM               468 .travis.yml
05/30/2016  12:41 PM    <DIR>          ci
05/30/2016  12:41 PM               732 pom.xml
05/30/2016  12:41 PM    <DIR>          src
05/30/2016  12:41 PM    <DIR>          target
               2 File(s)          1,200 bytes
               6 Dir(s)  53,686,603,776 bytes free

Примечание: во время первого запуска с деплоем в свежесозданный WebApp — Travis может сообщить что-то вроде «unable to push to unqualified destination: master». Причина — в пустом репозитории, который выгружается из Azure. Пришлось выгружать его руками, добавлять пустой файл, пушить обратно — после этого деплой через Travis заработал.

Другой вариант — использовать скрипт. Кроме скрипта — вынесем логин и пароль в скрытые переменные Travis.

Для этого — переходим в Travis > репозиторий > Settings:

travis_java_15

Добавляем две переменных. Для Password — установим No display:

travis_java_16

Редактирууем файл .travis.yml и доабвляем вызшов скрипта deploy.sh после успешного билда:

language: java
before_script:
  - echo "Starting build"
script:
  - mvn clean package
after_script:
  - echo "Script finished"
after_success:
  - echo "Build was successful. $TRAVIS_TEST_RESULT"
  - ls -l $TRAVIS_BUILD_DIR/target
  - ./ci/deploy.sh javahw
after_failure:
  - echo "Build was failed"

Тут в after_success добавлен вызов скрипта deploy.sh из каталога ci, которому первым аргументом передаётся имя WebApp в Azure.

Сам скрипт — версия аналогичного скрипта из поста Ruby: скрипт git-деплоя в Azure, только на bash:

#!/usr/bin/env bash

me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

if [ -z $AZURE_WA_USERNAME -o -z $AZURE_WA_PASSWORD ]; then
    echo -e "ERROR: AZURE_WA_USERNAME or AZURE_WA_PASSWORD varaibles can not be found. Exit."
    exit 1
fi

AZURE_ENV="$1"
if [ -z "$AZURE_ENV" ]; then
    echo -e "\n[$me] You must specify environment you want to deploy\n"
    exit 1
fi

AZURE_REPO="$2"
if [ -z "$AZURE_REPO" ]; then
  AZURE_REPO=$AZURE_ENV
fi

if [ -d "$AZURE_ENV" ]; then
    echo -e "\n[$me] Directory $AZURE_ENV exists. Removing it now\n"
    rm -rf $AZURE_ENV
fi

echo -e "\n[$me] Going to clone $AZURE_ENV repository using https://${AZURE_WA_USERNAME}:${AZURE_WA_PASSWORD}@"$AZURE_ENV".scm.azurewebsites.net:443/"$AZURE_REPO".git\n"

if ! git clone https://${AZURE_WA_USERNAME}:${AZURE_WA_PASSWORD}@"$AZURE_ENV".scm.azurewebsites.net:443/"$AZURE_REPO".git; then
    echo -e "\nERROR: can not clone source. Exit.\n"
    exit 1
fi

echo -e "\n[$me] Executing Rsync\n"

# exclude your AZURE_REPO here!
rsync -av --delete --exclude '.git' --exclude 'ci' --exclude "$AZURE_REPO" . "$AZURE_REPO"/

cd "$AZURE_REPO"/

echo -e "\n[$me] Deploying to $AZURE_REPO:\n"
echo -e "[$me] Working in: $(pwd)\n"

echo -e "\n[$me] AZURE_REPO $AZURE_REPO content to be deployed:\n"
ls -l 
echo

git add .
git status
git commit -m "Release build $TRAVIS_BUILD_NUMBER" || echo "[$me] Nothing to commit!"
git push origin master

echo -e "[$me] Done.\n"

Перменные AZURE_WA_USERNAME и AZURE_WA_PASSWORD так же могут исопльзоваться dpl для деплоев.

Добавим файл для проверки:

$ echo "Hello, Azure" > index.html
$ git add index.html && git commit -m "index add"

Сохраняем, пушим:

$ git add deploy.sh .travis.yml && git commit -m "deploy script" && git push origin

Запускаем:

travis_java_17

Проверяем:

> dir
D:\home\site\wwwroot
Volume in drive D is Windows
 Volume Serial Number is 92C5-0843

 Directory of D:\home\site\wwwroot

05/30/2016  02:00 PM    <DIR>          .
05/30/2016  02:00 PM    <DIR>          ..
05/30/2016  12:41 PM    <DIR>          .ssh
05/30/2016  01:32 PM               312 .travis.yml
05/30/2016  12:41 PM    <DIR>          ci
05/30/2016  01:32 PM             1,504 deploy.sh
05/30/2016  02:00 PM                14 index.html
05/30/2016  12:41 PM               732 pom.xml
05/30/2016  12:41 PM    <DIR>          src
05/30/2016  12:41 PM    <DIR>          target
               4 File(s)          2,562 bytes
               6 Dir(s)  53,686,226,944 bytes free
$ curl http://javahw.azurewebsites.net/index.html
Hello, Azure

У Travis есть ещё одна интересная возможность — деплой из разных бранчей и/или тегов, но об этом — уже в следующий раз.

Ссылки по теме

Azure Web App Deployment

Build Java Maven github project on travis-ci

Environment Variables

Exploring The Travis-CI Configuration File

Using Travis CI to Deploy to Azure

Using Travis to Deploy Apps to Azure