Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Build Automation with Phive and Phing
Search
Thomas Weinert
June 01, 2018
Programming
290
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
880
PCRE - Matching Patterns
thomasweinert
0
170
Controlling Arduino With PHP
thomasweinert
2
610
PCRE With PHP
thomasweinert
0
820
Modern PHP
thomasweinert
3
260
Controlling Arduino With PHP
thomasweinert
1
190
XPATH WITH PHP AND JS
thomasweinert
0
160
PHPUG CGN: Arduino With PHP
thomasweinert
0
160
IPC 2013: Controlling Arduino With PHP
thomasweinert
0
270
Other Decks in Programming
See All in Programming
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
100
「人を評価する AI」の設計と実装
ryoyanara
0
240
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
270
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
180
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
490
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
120
Hono + Inertia + React で LP を構築した話
oukayuka
2
170
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
440
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.7k
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
260
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
180
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Designing for humans not robots
tammielis
254
26k
BBQ
matthewcrist
89
10k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
560
What's in a price? How to price your products and services
michaelherold
247
13k
Writing Fast Ruby
sferik
630
63k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
440
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
WENDY [Excerpt]
tessaabrams
11
39k
How to make the Groovebox
asonas
2
2.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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