Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Build Automation with Phive and Phing
Search
Thomas Weinert
June 01, 2018
Programming
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Build Automation with Phive and Phing
PHPUG Cologne 2018-06-01
Thomas Weinert
June 01, 2018
More Decks by Thomas Weinert
See All by Thomas Weinert
Introduction: PHP Extensions
thomasweinert
2
890
PCRE - Matching Patterns
thomasweinert
0
170
Controlling Arduino With PHP
thomasweinert
2
610
PCRE With PHP
thomasweinert
0
830
Modern PHP
thomasweinert
3
260
Controlling Arduino With PHP
thomasweinert
1
190
XPATH WITH PHP AND JS
thomasweinert
0
170
PHPUG CGN: Arduino With PHP
thomasweinert
0
170
IPC 2013: Controlling Arduino With PHP
thomasweinert
0
270
Other Decks in Programming
See All in Programming
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
420
Verilogで学ぶCPU自作入門.pdf
uyuki234
7
3.9k
SREの越境 / SRE Collaboration
y0hgi
2
290
Simple Storage Service(S3) is not simple
iwatsukayura
0
120
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
410
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
260
Webの地図
yosuke_furukawa
PRO
6
5k
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
110
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
150
The Rails Doctrine Decade
koic
2
440
Workers Cache を知る
syumai
0
320
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
330
Featured
See All Featured
Tell your own story through comics
letsgokoyo
1
1.1k
We Are The Robots
honzajavorek
0
380
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
RailsConf 2023
tenderlove
30
1.6k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
A Tale of Four Properties
chriscoyier
163
24k
Facilitating Awesome Meetings
lara
57
7.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Balancing Empowerment & Direction
lara
6
1.3k
Transcript
BUILD AUTOMATION BUILD AUTOMATION WITH PHIVE AND PHING WITH PHIVE
AND PHING @ThomasWeinert
TOOLS FOR PHP TOOLS FOR PHP PHPUnit Phing phpDocumentor phpcs
...
TOOLS FOR A PROJECT TOOLS FOR A PROJECT Which tool?
Which version? How to call? What to do next?
None
COMPOSER COMPOSER Project dependency management Dependency conflicts!
PHIVE PHIVE Tool dependency management Phar packages GPG signatures
INSTALL PHIVE INSTALL PHIVE > wget https://phar.io/releases/phive.phar > wget https://phar.io/releases/phive.phar.asc
> gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9 > gpg --verify phive.phar.asc phive.phar > chmod +x phive.phar > sudo mv phive.phar /usr/bin/phive Shell
THE FIRST CONTACT THE FIRST CONTACT > git checkout
[email protected]
:awesome-project.git
> cd awesome-project > phive install Shell
GPG SIGNATURES GPG SIGNATURES
TOOLS AVAILABLE TOOLS AVAILABLE
PHIVE BASIC USAGE PHIVE BASIC USAGE phive install phive install
tool-name phive update
BUILD TARGETS/GOALS BUILD TARGETS/GOALS Setup Update Deployment ...
PHING PHING based on Apache Ant Phar, installable using Phive
IDE integration (PHPStorm, Netbeans, Eclipse) XML build file Extendable via PHP
IDE INTEGRATION (PHPSTORM) IDE INTEGRATION (PHPSTORM)
CODE COMPLETION CODE COMPLETION
THE FIRST CONTACT II THE FIRST CONTACT II > git
checkout
[email protected]
:awesome-project.git > cd awesome-project > phive install > tools/phing Shell
COMPOSER PROJECT EXAMPLE COMPOSER PROJECT EXAMPLE > composer create-project someone/awesome-project
new-project > cd new-project > phive install > tools/phing > git init && git add * && git commit -m"new project" > tools/phing run Shell
None
PHING TARGETS PHING TARGETS
HELLO WORLD HELLO WORLD <project name="A Project" default="build"> <target name="build">
<echo message="Hello World!"/> </target> </project> XML
A Project > build: [echo] Hello World! BUILD FINISHED Shell
A PROPERTY A PROPERTY <project name="A Project" default="build"> <property name="database.user"
value="username"/> <target name="build"> <echo message="Database User: ${database.user}"/> </target> </project> XML
A Project > build: [echo] Database User: username BUILD FINISHED
Shell
PROPERTIES FILE PROPERTIES FILE <project name="A Project" default="build"> <property file="build.properties"
prefix="configuration"/> <property name="database.user" value="${configuration.database.user}"/> <target name="build"> <echo message="Database User: ${database.user}"/> </target> </project> XML
# Database Configuration database.user=a-user database.password=secret build.properties
[property] Loading /path/build.properties A Project > build: [echo] Database User:
a-user BUILD FINISHED Shell
DISTRIBUTED PROPERTIES FILE DISTRIBUTED PROPERTIES FILE <project name="A Project" default="build">
<property file="dist.build.properties" prefix="configuration"/> <property file="build.properties" prefix="configuration" override="true"/> <property name="database.user" value="${configuration.database.user}"/> <!--...--> </project> XML
# Database Configuration database.user=default-user database.password=secret dist.build.properties
[property] Loading /path/dist.build.properties [property] Loading /path/build.properties [property] Unable to find
property file: /path/build.properties... skipped A Project > build: [echo] Database User: default-user BUILD FINISHED Shell
FILES & DIRECTORIES FILES & DIRECTORIES
FILESET FILESET <fileset id="dependencies" dir="${directory.src}"> <include name="composer.json"/> <include name="composer.lock"/> </fileset>
XML <fileset id="public" dir="${directory.document-root}"> <include name="**"/> <exclude name="**/.git/**"/> </fileset> XML
COPY COPY <target name="build"> <copy todir="${directory.export}/source/htdocs"> <fileset refid="public"/> </copy> <copy
todir="${directory.export}/source"> <fileset refid="dependencies"/> </copy> </target> XML
CREATE DIRECTORY CREATE DIRECTORY <property name="mode.writeable" value="0777"/> <target name="prepare"> <mkdir
dir="${directory.src}/data/cache" mode="${mode.writeable}"/> <mkdir dir="${directory.src}/data/media/files" mode="${mode.writeable}"/> <mkdir dir="${directory.src}/data/media/thumbs" mode="${mode.writeable}"/> </target> XML
REMOVE REMOVE <target name="clean-build"> <delete dir="${directory.export}/source"/> </target> XML <target name="clean-archives">
<delete> <fileset refid="archives"/> </delete> </target> XML
TARGETS TARGETS
DEPENDENCIES DEPENDENCIES <target name="build" depends="prepare"/> <target name="prepare"> <echo message="Hello World!"/>
</target> XML
A Project > prepare: [echo] Hello World! A Project >
build: BUILD FINISHED Shell
DESCRIPTIONS DESCRIPTIONS <target name="build" depends="prepare" description="Build project"/> <target name="prepare"> <echo
message="Hello World!"/> </target> XML
None
HIDDEN HIDDEN <target name="build" depends="prepare" description="Build project"/> <target name="prepare" hidden="yes">
<echo message="Hello World!"/> </target> XML
None
TEMPLATE FILE TEMPLATE FILE
template.configuration.php template.configuration.php <?php define('DATABASE_URI', '${database.uri}'); PHP
EXPAND PROPERTIES EXPAND PROPERTIES <property name="config.template" value="${project.basedir}/template.configuration.php" /> <property name="config.file"
value="${project.basedir}/configuration.php"/> <property name="database.uri" value="sqlite3://project.sqlite" /> <copy file="${config.template}" tofile="${config.file}"> <filterchain> <expandproperties/> </filterchain> </copy> XML
FILTERS FILTERS replacetokens replaceregexp xsltfilter ...
CONDITION CONDITION <condition property="directorySeparator" value="\" else="/"> <os family="windows"/> </condition> <echo
message="Directory Separator: ${directorySeparator}"/> XML
FILE EXISTS FILE EXISTS <property name="hasConfiguration" value="false"/> <available file="${config.file}" property="hasConfiguration"
value="true"/> XML
CONDITION CONDITION <if> <isfalse value="${hasConfiguration}"/> <then> <copy file="${config.template}" tofile="${config.file}"> <filterchain>
<expandproperties/> </filterchain> </copy> </then> <else> <warn message="configuration.php already exists. Skipped."/> </else> </if> XML
RUN 1 RUN 1 A Project > build: [copy] Copying
1 file to /project/path/ BUILD FINISHED Shell
RUN 2 RUN 2 A Project > build: [warn] configuration.php
already exists. Skipped. BUILD FINISHED Shell
EXECUTE TOOLS EXECUTE TOOLS
COMPOSER INSTALL COMPOSER INSTALL <exec executable="composer" passthru="true"> <arg value="-n"/> <arg
value="install"/> </exec> XML
GIT TAG GIT TAG <property name="revision" value="dev"/> <exec executable="git" dir="${project.basedir}"
returnProperty="git.return" outputProperty="git.output"> <arg line="describe --tags"/> </exec> <if> <equals arg1="${git.return}" arg2="0"/> <then> <property name="revision" value="${git.output}" override="true"/> </then> </if> XML
GIT DESCRIBE GIT DESCRIBE A Project > project-revision: [echo] Project
revision: 4.0.1-14-g7597c11 BUILD FINISHED Shell
PHP BUILTIN WEBSERVER PHP BUILTIN WEBSERVER <exec executable="php" passthru="true"> <arg
line="-S localhost:8080 -t ./htdocs server.php"/> </exec> XML
COMPOSER PACKAGE VERSION COMPOSER PACKAGE VERSION
DEFINE ADHOC TASK DEFINE ADHOC TASK <adhoc-task name="composer-version"> <![CDATA[ class
AVersionTask extends Task { function main() { $json = json_decode(file_get_contents("composer.lock")); foreach ($json->packages as $package) { if ($package->name === 'carica/io') { $this->project->setProperty( 'revision', $package->version.' '.substr($package->source->reference, 0, 8) ); } } } } XML
USE ADHOC TASK USE ADHOC TASK <property name="revision" value=""/> <trycatch
property="error"> <try> <adhoc-task name="composer-version">...</adhoc-task> <composer-version/> <echo message="Revision: ${revision}"/> </try> <catch> <echo level="warning">There was an error...</echo> <echo level="debug">${error}</echo> <property name="revision" value="unknown" override="true"/> </catch> </trycatch> XML
A Project > package-revision: [echo] Revision: 1.0.0 8f996060 BUILD FINISHED
Shell
A Project > package-revision: [PHP Error] file_get_contents(composer.lock): failed to open
s [PHP Error] Invalid argument supplied for foreach() [line 6 of [echo] Revision: BUILD FINISHED Shell