Heroku – jak wystrzelić javową apkę w chmurę

Znowu chmura i java 😀

Standardowo trzeba założyć konto, tym razem na heroku.com. Można mieć do 5 darmowych apek a potem trzeba dać się zweryfikować przez podanie detali karty kredytowej – co się wtedy dzieje – nie wiem – ale na pewno jest w regulaminie zakaz tworzenia zsynchronizowanego tworu łączącego darmowe instancje w jedną zmutowaną apke 😀

Potem trzeba zainstalować konsolowego toola na kompie https://toolbelt.heroku.com/

Dla leniwych jest mega prosty projekt z prymitywnym gui którego bebechy można wrzucić do folderu z apką heroku https://github.com/AdupTeam/cloudcalc i spokojnie można przejść do części o push’owaniu 🙂

Tworzę apkę na heroku

$ heroku  apps:create hello-world
 !    Name is already taken

UPS! nazwa musi być unikalna – apka będzie widoczna pod domeną: mojanazwa.herokuapp.com

$ heroku  apps:create chmura
Creating chmura... done, stack is cedar
http://chmura.herokuapp.com/ | git@heroku.com:chmura.git

W odpowiedzi jest adres pod jakim znajdzie się apka i link do repo
Klonowanie pustego repo apki

$ git clone git@heroku.com:chmura.git
Cloning into 'chmura'...
warning: You appear to have cloned an empty repository.

UserX@X-PC ~/HerokuTest
$ cd chmura/

UserX@X-PC ~/HerokuTest/chmura (master)
$ ls -a
.  ..  .git

Domyślnie projekt powinien być w java 1.6 bo

       [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project jbehave: Compilation failure
       [ERROR] Failure executing javac, but could not parse the error:
       [ERROR] javac: invalid target release: 1.7

Do pliku maven’owego pom.xml należy dodać plugin web runner

<build>
    ...
    <plugins>
        ...    
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals><goal>copy</goal></goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.github.jsimone</groupId>
                                <artifactId>webapp-runner</artifactId>
                                <version>7.0.40.0</version>
                                <destFileName>webapp-runner.jar</destFileName>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Tworzę plik Procfile (bez rozszerzenia, w najwyższej lokacji repo) z zawartością:

web:    java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/*.war

Czas kodzenia apki… Gdy mamy kod wystarczy zacommitować i ….

Czas pusznąć naszą ape na repo heroku oł je 😛

git push origin master

Powinno wyjść coś takiego

       [INFO] BUILD SUCCESS
       [INFO] ------------------------------------------------------------------------
       [INFO] Total time: 8.940s
       [INFO] Finished at: Sun Nov 03 15:41:57 UTC 2013
       [INFO] Final Memory: 20M/490M
       [INFO] ------------------------------------------------------------------------
-----> Discovering process types
       Procfile declares types -> web

-----> Compiled slug size: 61.4MB
-----> Launching... done, v8
       http://chmura.herokuapp.com deployed to Heroku

To git@heroku.com:chmura.git
   ae24ff2..f2e61e3  master -> master

A potem uruchomić dziada

UserX@X-PC ~/HerokuTest/chmura (master)
$ heroku ps:scale web=1
Scaling web dynos... done, now running 1

Gdyby działo się coś takiego

$ heroku ps:scale web=0
Scaling web dynos... failed
 ! Resource not found

prawdopodobnie jest coś nie tak z konfiguracją web-runner’a albo Procfile’a

Gdy już sie wszystko uda można klepnąć w konsolce

heroku run bash

No i sie porozglądać po DYNO czyli maszynce na jakiej siedzi apka

Podgląd tego co się dzieje z naszym heroku

heroku logs -t

A zapomniałbym –  można zobaczyć aplikację śmigającą w necie 🙂

heroku open

A potem usuwanko aby zrobić miejsce 🙂

UserX@X-PC ~/HerokuTest/cloudcalc (master)
$ heroku apps:create cloudcalc
 !    You've reached the limit of 5 apps for unverified accounts.
 !    Add a credit card to verify your account.

UserX@X-PC ~/HerokuTest/cloudcalc (master)
$ heroku apps:destroy chmura

 !    WARNING: Potentially Destructive Action
 !    This command will destroy chmura (including all add-ons).
 !    To proceed, type "chmura" or re-run this command with --confirm chmura

> chmura
Destroying chmura (including all add-ons)... done

Jeszcze można pobawić się tak:

Wersja pro – tworzymy heroku apke w isniejącym repo naszej apki na kompie

UserX@X-PC ~/HerokuTest/cloudcalc (master)
$ heroku apps:create cloudcalc
Creating cloudcalc... done, stack is cedar
http://cloudcalc.herokuapp.com/ | git@heroku.com:cloudcalc.git
Git remote heroku added

Czyli teraz można puszować do dwóch repo – nice 🙂

UserX@X-PC ~/HerokuTest/cloudcalc (master)
$ git remote -v
heroku  git@heroku.com:cloudcalc.git (fetch)
heroku  git@heroku.com:cloudcalc.git (push)
origin  https://github.com/AdupTeam/cloudcalc.git (fetch)
origin  https://github.com/AdupTeam/cloudcalc.git (push)

No to na co czekać 😀

UserX@X-PC ~/HerokuTest/cloudcalc (master)
$ git push heroku master
Counting objects: 26, done.
Delta compression using up to 3 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (26/26), 3.05 KiB, done.

git push każdy zna, heroku to nazwa repo, master to nasz branch który push’ujemy, opcjonalnie :master to zewnętrzny branch.

Warto pamiętać, że proces budowania jest odpalany tylko po push na branch master na repo heroku – inne gałęzie są ignorowane.

$ git push heroku mojbranch

Da

local mojbranch -> remote mojbranch

Przy polityce git, domyślnie tworzącego branch o nazwie tego z którego robimy push na repo zewnętrznym, powoduje brak budowania się apki. Wniosek – warto przyzwyczaić się do dodawania push heroku mojbranch:master gdy robimy push lokalnej gałęzi bo potem jest wielkie zdziwko czemu się nie buduje 😀

Idąc dalej można stworzyć dwie apki na heroku i podpiąc je pod repo oznaczając jako staging i production. Potem robić push do danego repo zewnętrznego – więcej o tym poczytasz na https://devcenter.heroku.com/articles/multiple-environments#advanced-linking-local-branches-to-remote-apps

Czasami się zdarza tak, że ostatni commit repo naszej apki, które chcemy push’nąć na świeżutkie repo heroku ma datę wcześniejszą niż commit inicjalizujący repo na heroku.
W logach pojawia się

pre-recive hook declined

, no i apka sie nie buduje. Rozwiązaniem jest zrobienie push z opcją

git push --force heroku mojbranch:master

co spowoduje nadpisanie naszym repo tego z heroku 🙂

Warto jeszcze dodać, że można podpiąć własną domenę pod apkę w chmurze.
W następnej części opisze proces dodania bazy do apki na heroku link TODO.

Leave a Reply

Your email address will not be published. Required fields are marked *