phing i fabric - budowanie i deployment aplikacji webowych

112
PHING I FABRIC Budowanie i deployment aplikacji webowych Leszek Krupiński PHPers #1, 20 maja 2013 r.

Upload: leafnode

Post on 16-Apr-2017

256 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Phing i Fabric - Budowanie i deployment aplikacji webowych

PHING I FABRICBudowanie i deployment aplikacji webowych

Leszek KrupińskiPHPers #1, 20 maja 2013 r.

Page 2: Phing i Fabric - Budowanie i deployment aplikacji webowych

Leszek Krupiński@leafnode http://leafnode.pl/

Page 3: Phing i Fabric - Budowanie i deployment aplikacji webowych

2001: FAQ pl.comp.lang.php

Page 4: Phing i Fabric - Budowanie i deployment aplikacji webowych

2001: Tłumaczenie podręcznika

We’re hir

ing!

Page 5: Phing i Fabric - Budowanie i deployment aplikacji webowych

Kilka konferencji, kilka wykładów, jedno szkolenie, kilka artykułów, jeden wywiad.

Page 6: Phing i Fabric - Budowanie i deployment aplikacji webowych

OBECNIEBezpieczeństwo, scalability, architektura

Page 7: Phing i Fabric - Budowanie i deployment aplikacji webowych

DO RZECZYDużo slajdów, nie zwracajcie na nie większej uwagi

Page 8: Phing i Fabric - Budowanie i deployment aplikacji webowych

CO BUDOWAĆ?Generowanie plików statycznych, dynamicznych, minimalizacja,

konfiguracja, parametryzacja, spełnianie wymogów (uprawnienia)...

Page 9: Phing i Fabric - Budowanie i deployment aplikacji webowych

PO CO AUTOMAT?

Page 10: Phing i Fabric - Budowanie i deployment aplikacji webowych

BRAK PORZĄDKU WPROWADZA ZMIANY

http://www.flickr.com/photos/jasonpoon/3926723912/© Jason Poon, CC-BY-NC-SA

Page 11: Phing i Fabric - Budowanie i deployment aplikacji webowych

POWTARZALNOŚĆZa każdym razem brak błędu lub te same błędy

http://www.flickr.com/photos/legofenris/4641828205/© leg0fenris, CC-BY-NC-SA

Page 12: Phing i Fabric - Budowanie i deployment aplikacji webowych

WIARYGODNE PRZYGOTOWYWANIE

PAKIETÓW WYJŚCIOWYCHhttp://www.flickr.com/photos/snowblink/2228929261/

© Jon Lim, CC-BY-NC-ND

Page 13: Phing i Fabric - Budowanie i deployment aplikacji webowych

REJESTRACJA BAZY WIEDZYhttp://www.flickr.com/photos/jezpage/4047231133/

© Jeremy Page, CC-BY-NC-ND

Page 14: Phing i Fabric - Budowanie i deployment aplikacji webowych

PHINGPHing Is Not GNU make

Page 15: Phing i Fabric - Budowanie i deployment aplikacji webowych

Wzorowany na Apache Ant

Page 16: Phing i Fabric - Budowanie i deployment aplikacji webowych

CECHY

• Łatwy do rozszerzania

• Składnia XML

• Gotowe taski integrujące z popularnymi pakietami

• Wywoływanie kodu PHP

Page 17: Phing i Fabric - Budowanie i deployment aplikacji webowych

INSTALACJAPoprzez PEAR:

pear channel-discover pear.phing.infopear install phing/phing

$ phing -v Phing 2.5.0

Page 18: Phing i Fabric - Budowanie i deployment aplikacji webowych

INSTALACJAPoprzez Composer:

{ "require": { "phing/phing": "2.5.0" }}

$ ./vendor/bin/phing -v Phing 2.5.0

Page 19: Phing i Fabric - Budowanie i deployment aplikacji webowych

PROSTY PLIK BUILDUZazwyczaj nazywany build.xml

Page 20: Phing i Fabric - Budowanie i deployment aplikacji webowych

<?xml version="1.0" encoding="UTF-8"?><project name="FooBar" default="dist"> <target name="prepare"> <echo msg="Making directory ./build" /> <mkdir dir="./build" /> </target> <target name="build" depends="prepare"> <echo msg="Copying files to build directory..." /> <echo msg="Copying ./about.php to ./build directory..." /> <copy file="./about.php" tofile="./build/about.php" /> <echo msg="Copying ./browsers.php to ./build directory..." /> <copy file="./browsers.php" tofile="./build/browsers.php" /> <echo msg="Copying ./contact.php to ./build directory..." /> <copy file="./contact.php" tofile="./build/contact.php" /> </target> <target name="dist" depends="build"> <echo msg="Creating archive..." /> <tar destfile="./build/build.tar.gz" compression="gzip"> <fileset dir="./build"> <include name="*" /> </fileset> </tar> <echo msg="Files copied and compressed in build directory OK!" /> </target> </project>

Page 21: Phing i Fabric - Budowanie i deployment aplikacji webowych

COŚ PROSTSZEGO

Page 22: Phing i Fabric - Budowanie i deployment aplikacji webowych

<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="hello"> <target name="hello" description="Wyświetla powitanie"> <echo msg="Hello, world!" /> </target> </project>

Page 23: Phing i Fabric - Budowanie i deployment aplikacji webowych

Buildfile: /home/leafnode/phing/1/build.xmlHelloWorld > hello: [echo] Hello, world!BUILD FINISHEDTotal time: 0.0630 seconds

Page 24: Phing i Fabric - Budowanie i deployment aplikacji webowych

SKŁADOWE PLIKU

• Project

• Target

• Task

• Property

Page 25: Phing i Fabric - Budowanie i deployment aplikacji webowych

PROJECTGłówny węzeł pliku, zawiera jeden lub więcej celów (targets)

Page 26: Phing i Fabric - Budowanie i deployment aplikacji webowych

TARGETGrupa zadań wykonywanych jako całość

Page 27: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZADANIEElement którego wykonanie ma wykonać pewną funkcję

Page 28: Phing i Fabric - Budowanie i deployment aplikacji webowych

PROPERTYZmienna

Page 29: Phing i Fabric - Budowanie i deployment aplikacji webowych

<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="hello"> <target name="hello" description="Wyświetla powitanie"> <property name="imie" value="Jasio" /> <echo msg="Cześć, ${imie}!" /> </target> </project>

Page 30: Phing i Fabric - Budowanie i deployment aplikacji webowych

WBUDOWANE PROPERTIESos.name, php.version, user.home itp.

http://www.phing.info/docs/guide/stable/chapters/appendixes/AppendixA-FactSheet.html#BuiltInProperties

Page 31: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZEWNĘTRZNE PROPERTIESŁatwa konfiguracja buildu

Page 32: Phing i Fabric - Budowanie i deployment aplikacji webowych

LINIA POLECEŃphing -Dimie=”Zbyszek”

Page 33: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZEWNĘTRZNY PLIK<property file="./build.properties" />

Page 34: Phing i Fabric - Budowanie i deployment aplikacji webowych

# Pary klucz/wartość#klucz=wartość# This dir must contain the local applicationbuild.dir=../# Credentials for the database migrationsdb.host=localhostdb.user=userdb.pass=passworddb.name=example# paths to programsprogs.mysql=/usr/bin/mysql

Page 35: Phing i Fabric - Budowanie i deployment aplikacji webowych

Buildfile: /home/leafnode/phing/3/build.xmlHelloWorld > hello: [property] Loading /home/leafnode/phing/3/./build.properties [echo] Cześć, Jasio!BUILD FINISHEDTotal time: 0.0657 seconds

Page 36: Phing i Fabric - Budowanie i deployment aplikacji webowych

WIELE TARGETÓW

Page 37: Phing i Fabric - Budowanie i deployment aplikacji webowych

<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="hello"> <target name="hello" description="Wyświetla powitanie"> <property file="./build.properties" /> <echo msg="Cześć, ${imie}!" /> </target> <target name="bye"> <echo msg="Papa!" /> </target> </project>

Page 38: Phing i Fabric - Budowanie i deployment aplikacji webowych

DOMYŚLNIE WEDŁUG ATRYBUTU

Wskazanie konkretnego targetu:$ phing nazwa_targetu

Page 39: Phing i Fabric - Budowanie i deployment aplikacji webowych

BLOKOWANIE URUCHAMIANIA RĘCZNEGO

“-” przed nazwą targetu

Page 40: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZALEŻNOŚCI

Page 41: Phing i Fabric - Budowanie i deployment aplikacji webowych

<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="bye"> <target name="hello" description="Wyświetla powitanie"> <property file="./build.properties" /> <echo msg="Cześć, ${imie}!" /> </target> <target name="bye" depends=”hello”> <echo msg="Papa!" /> </target> </project>

Page 42: Phing i Fabric - Budowanie i deployment aplikacji webowych

Buildfile: /home/leafnode/phing/5/build.xmlHelloWorld > hello: [property] Loading /home/leafnode/phing/5/./build.properties [echo] Cześć, Jasio!HelloWorld > bye: [echo] papaBUILD FINISHEDTotal time: 0.0797 seconds

Page 43: Phing i Fabric - Budowanie i deployment aplikacji webowych

WIELE ZALEŻNOŚCIdepends="pre-init, build, package"

Page 44: Phing i Fabric - Budowanie i deployment aplikacji webowych

RĘCZNE WYWOŁYWANIE TARGETÓW

Np. narzędziowych

Page 45: Phing i Fabric - Budowanie i deployment aplikacji webowych

<target name="process"> <echo msg="Processing ${data}" /></target> <target name="build"> <phingcall target="process"> <property name="data" value="some data" /> </phingcall> </target>

Page 46: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZEWNĘTRZNY PLIK

Page 47: Phing i Fabric - Budowanie i deployment aplikacji webowych

<phing phingfile="utils.xml" target="bazingify"> <property name="bazinga" value="meh" /></phing>

Page 48: Phing i Fabric - Budowanie i deployment aplikacji webowych

IMPORTOWANIE CAŁEGO PLIKU

<import file="build.utils.xml" />

Page 49: Phing i Fabric - Budowanie i deployment aplikacji webowych

PRACA NA ZBIORACH PLIKÓW

Page 50: Phing i Fabric - Budowanie i deployment aplikacji webowych

<target name="copyfiles"> <copy todir="/tmp/deploy"> <fileset dir="." includes="**/*.php" /> </copy> </target>

Page 51: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZŁOŻONE WARUNKI

Page 52: Phing i Fabric - Budowanie i deployment aplikacji webowych

<fileset dir="." includes="**/*.php"> <and> <size value="1024" when="more" /> <date datetime="20-05-2013 18:00" when="after" /> </and> </fileset>

Page 53: Phing i Fabric - Budowanie i deployment aplikacji webowych

FILTRY

Page 54: Phing i Fabric - Budowanie i deployment aplikacji webowych

<target name="copyfiles"> <property file="./build.properties" /> <copy todir="/tmp/deploy"> <filterchain> <replacetokens begintoken="@@" endtoken="@@"> <token key="DBNAME" value="${db.name}" /> <token key="DBUSER" value="${db.user}" /> <token key="DBPASS" value="${db.pass}" /> </replacetokens> </filterchain> <fileset dir="." includes="**/*.php" /> </copy> </target>

Page 55: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZMIANA NAZW PLIKÓW

Page 56: Phing i Fabric - Budowanie i deployment aplikacji webowych

<mapper type="glob" from="*.bat" to="*.txt"/>

Page 57: Phing i Fabric - Budowanie i deployment aplikacji webowych

<mapper type="regexp" from="^(.*)\.ent\.xml$" to="\1.php"/>

Page 58: Phing i Fabric - Budowanie i deployment aplikacji webowych

INSTRUKCJE WARUNKOWE

Page 59: Phing i Fabric - Budowanie i deployment aplikacji webowych

<if> <equals arg1="${foo}" arg2="bar" /> <then> <echo message="The value of property foo is bar" /> </then> <else> <echo message="The value of property foo is not bar" /> </else> </if>

Page 60: Phing i Fabric - Budowanie i deployment aplikacji webowych

<condition property="isMacOrWindows"> <or> <os family="mac"/> <os family="windows"/> </or> </condition>

Page 61: Phing i Fabric - Budowanie i deployment aplikacji webowych

PĘTLE

Page 62: Phing i Fabric - Budowanie i deployment aplikacji webowych

<foreach param="filename" absparam="filename" target="print"> <fileset dir="."> <include name="*.php" /> </fileset> </foreach>

Page 63: Phing i Fabric - Budowanie i deployment aplikacji webowych

INTERAKCJA<input propertyname="env" defaultValue="dev">Jakie środowisko?</input>

Page 64: Phing i Fabric - Budowanie i deployment aplikacji webowych

WYWOŁYWANIE FUNKCJI PHP

<php function="strtoupper" returnProperty="builddir"> <param value="${tag}" /></php>

Page 65: Phing i Fabric - Budowanie i deployment aplikacji webowych

PRZEGLĄD TASKÓW

Page 66: Phing i Fabric - Budowanie i deployment aplikacji webowych

<-- List the contents of "/home". --><exec command="ls -l" dir="/home" /> <-- Start the make process in "/usr/src/php-4.0". --><exec command="make" dir="/usr/src/php-4.0" /> <-- List the contents of "/tmp" out to a file. --><exec command="ls -l /tmp > foo.out" escape="false" />

Page 67: Phing i Fabric - Budowanie i deployment aplikacji webowych

<-- Exit with message --><fail message="Failed for some reason!" /><-- Exit if ${errorprop} is defined --><fail if="errorprop" message="Detected error!" /> <-- Exit unless ${dontfail} prop is defined. --><fail unless="dontfail" message="Detected error!" />

Page 68: Phing i Fabric - Budowanie i deployment aplikacji webowych

<mail tolist="[email protected]" subject="build complete">The build process is a success...</mail>

Page 69: Phing i Fabric - Budowanie i deployment aplikacji webowych

<chmod file="/home/test/mine.txt" mode="0500" verbose="true" />

Page 70: Phing i Fabric - Budowanie i deployment aplikacji webowych

<svncopy username="user" password="pass" repositoryurl="svn://localhost/phing/trunk/" todir="svn://localhost/phing/tags/1.0"/> <svnexport repositoryurl="svn://localhost/project/trunk/" todir="/home/michiel/dev"/> <svnlastrevision repositoryurl="svn://localhost/project/trunk/" propertyname="lastrev"/><echo>Last revision: ${lastrev}</echo>

Page 71: Phing i Fabric - Budowanie i deployment aplikacji webowych

<gitinit repository="${repo.dir.resolved}" /> <gitclone repository="git://github.com/path/to/repo/repo.git" targetPath="${repo.dir.resolved}" /> <gitpull repository="${repo.dir.resolved}" all="true" />

Page 72: Phing i Fabric - Budowanie i deployment aplikacji webowych

<docblox title="API Documentation" destdir="apidocs" template="new_black"> <fileset dir="./classes"> <include name="**/*.php" /> </fileset> </docblox>

Page 73: Phing i Fabric - Budowanie i deployment aplikacji webowych

<jsMin targetDir="docroot/script/minified" failOnError="false"> <fileset dir="docroot/script"> <include name="**/*.js"/> </fileset> </jsMin>

Page 74: Phing i Fabric - Budowanie i deployment aplikacji webowych

<phpunit codecoverage="true"> <formatter type="xml" todir="reports" /> <batchtest> <fileset dir="src"> <include name="**/*Test.php" /> </fileset> </batchtest> </phpunit>

Page 75: Phing i Fabric - Budowanie i deployment aplikacji webowych

<zip destfile="output.zip"> <fileset dir="build"> <include name="**/*.php" /> </fileset> </zip>

Page 76: Phing i Fabric - Budowanie i deployment aplikacji webowych

DEPLOYMENTFabric

Page 77: Phing i Fabric - Budowanie i deployment aplikacji webowych

CZEMU NIE DEPLOYMENT PRZEZ PHING?

Można, ale XML.

Page 78: Phing i Fabric - Budowanie i deployment aplikacji webowych

ZDALNE POLECENIE

Page 79: Phing i Fabric - Budowanie i deployment aplikacji webowych

<?xml version="1.0"?><project name="sshtest" default="main"> <target name="main"> <ssh username="username" password="password" host="192.168.1.200" command="pwd" /> </target> </project>

Page 80: Phing i Fabric - Budowanie i deployment aplikacji webowych

<ssh username="username" password="password" host="192.168.1.200" command="pwd" property="mypwd" display="false" /><echo>The present working directory is ${mypwd}</echo>

Page 81: Phing i Fabric - Budowanie i deployment aplikacji webowych

KOPIOWANIE PLIKÓW

Page 82: Phing i Fabric - Budowanie i deployment aplikacji webowych

<scp username="john" password="smith" host="webserver" todir="/www/htdocs/project/"> <fileset dir="test"> <include name="*.html" /> </fileset> </scp>

Page 83: Phing i Fabric - Budowanie i deployment aplikacji webowych

MIGRACJA BAZY DANYCH

Page 84: Phing i Fabric - Budowanie i deployment aplikacji webowych

<dbdeploy url="sqlite:${project.basedir}/data/db.sqlite" userid="dbdeploy" password="dbdeploy" dir="${project.basedir}/data/dbdeploy/deltas" />

http://dbdeploy.com/documentation/getting-started/rules-for-using-dbdeploy/

<pdosqlexec src="deploy.sql" url="sqlite:test.db"/>

http://www.liquibase.org/

<liquibase-update jar="/usr/local/lib/liquibase/liquibase.jar" classpathref="/usr/local/lib/liquibase/lib/mysql-connector-java-5.1.15-bin.jar" changelogFile="./changelogTest.xml" username="liquibase" password="liquibase" url="jdbc:mysql://localhost/mydatabase" />

Page 85: Phing i Fabric - Budowanie i deployment aplikacji webowych

CZEMU NIE CHEF LUB PUPPET?

Page 86: Phing i Fabric - Budowanie i deployment aplikacji webowych

DUŻO POTRAFIĄ

Kimberly VardemanCC-BY-SA

Page 87: Phing i Fabric - Budowanie i deployment aplikacji webowych

UŻYWANIE JEST SKOMPLIKOWANE

Frank Bruns-BallhausenCC-BY-SA 3.0/de

Page 88: Phing i Fabric - Budowanie i deployment aplikacji webowych

WYMAGANE DODATKOWE ZASOBY

http://www.flickr.com/photos/rolohauck/3432135840/© Roland Hauck, CC-BY-NC-SA 2.0

Page 89: Phing i Fabric - Budowanie i deployment aplikacji webowych

(i wolę Pythona od Ruby’ego ;) )

Page 90: Phing i Fabric - Budowanie i deployment aplikacji webowych

INSTALACJA

Page 91: Phing i Fabric - Budowanie i deployment aplikacji webowych

pip install fabric

Page 92: Phing i Fabric - Budowanie i deployment aplikacji webowych

INSTALACJA PIPeasy-install pip

Page 93: Phing i Fabric - Budowanie i deployment aplikacji webowych

INSTALACJA EASY-INSTALLapt-get install python-setuptools

Page 94: Phing i Fabric - Budowanie i deployment aplikacji webowych

WINDOWS

• Ze strony python.org:

• instalator python

• instalator setup-tools

• easy_install pip

• pip install fabric

Page 95: Phing i Fabric - Budowanie i deployment aplikacji webowych

PLIK WEJŚCIOWYZwykły kod Pythona

fabfile.py

Page 96: Phing i Fabric - Budowanie i deployment aplikacji webowych

from fabric.api import rundef host_type(): run('uname -s')

Page 97: Phing i Fabric - Budowanie i deployment aplikacji webowych

$ fab -H localhost,linuxbox host_type[localhost] run: uname -s[localhost] out: Darwin[linuxbox] run: uname -s[linuxbox] out: LinuxDone.Disconnecting from localhost... done.Disconnecting from linuxbox... done.

Page 98: Phing i Fabric - Budowanie i deployment aplikacji webowych

ARGUMENTY

Page 99: Phing i Fabric - Budowanie i deployment aplikacji webowych

def hello(name="world"): print("Hello %s!" % name)

$ fab hello:name=JeffHello Jeff!Done.

Page 100: Phing i Fabric - Budowanie i deployment aplikacji webowych

Polecenie lokalne: local

Page 101: Phing i Fabric - Budowanie i deployment aplikacji webowych

from fabric.api import localdef test(): local("phing unittest") def commit(): local("git add -p && git commit") def push(): local("git push") def prepare_deploy(): test() commit() push()

Page 102: Phing i Fabric - Budowanie i deployment aplikacji webowych

Polecenie zdalne: run

Page 103: Phing i Fabric - Budowanie i deployment aplikacji webowych

def deploy(): deploy_dir = '/var/www/app' with cd(code_dir): run("git pull") run("phing")

Page 104: Phing i Fabric - Budowanie i deployment aplikacji webowych

DZIAŁANIA INTERAKTYWNE

Page 105: Phing i Fabric - Budowanie i deployment aplikacji webowych

def deploy(): deploy_dir = '/var/www/app' with settings(warn_only=True): if run("test -d %s" % code_dir).failed: run("git clone user@host:repo.git %s" % code_dir) with cd(code_dir): run("git pull") run("phing")

Page 106: Phing i Fabric - Budowanie i deployment aplikacji webowych

TASKIfrom fabric.api import task, run@taskdef mytask(): run("a command")

Page 107: Phing i Fabric - Budowanie i deployment aplikacji webowych

REAKCJE[my_server] run: test -d /srv/django/myprojectWarning: run() encountered an error (return code 1) while executing 'test -d /var/www/app'[my_server] run: git clone user@pass:repo.git /var/www/app[my_server] out: Cloning into /srv/django/myproject...[my_server] out: Password: <enter password>[my_server] out: remote: Counting objects: 6698, done.[my_server] out: remote: Compressing objects: 100% (2237/2237), done.[my_server] out: remote: Total 6698 (delta 4633), reused 6414 (delta 4412)[my_server] out: Receiving objects: 100% (6698/6698), 1.28 MiB, done.[my_server] out: Resolving deltas: 100% (4633/4633), done.[my_server] out:[my_server] run: git pull[my_server] out: Already up-to-date.

Page 108: Phing i Fabric - Budowanie i deployment aplikacji webowych

PRZYKŁAD

Page 109: Phing i Fabric - Budowanie i deployment aplikacji webowych

from fabric.api import * from datetime import datetimeenv.hosts = ['appserver']

def get_ts(): d = datetime.now() return d.strftime("%Y-%m-%d_%H-%M") def deploy(): ts = get_ts() with cd("/var/www"): run("mkdir app-"+ts) put(".", "/var/www/app-"+ts) build("/var/www/app-"+ts) with cd("/var/www"): run("rm app") run("ln -s app-"+ts+" app")

Page 110: Phing i Fabric - Budowanie i deployment aplikacji webowych

PYTANIA?

Page 111: Phing i Fabric - Budowanie i deployment aplikacji webowych

LINKIhttp://www.phing.info/

http://fabfile.org/

Page 112: Phing i Fabric - Budowanie i deployment aplikacji webowych

DZIĘKUJĘ :)

http://speakerdeck.com/leafnode/