This repository has been archived by the owner on Jul 21, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
build.xml
347 lines (296 loc) · 18.6 KB
/
build.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
<?xml version="1.0" encoding="UTF-8"?>
<project name="vufind2" basedir="." default="main">
<property name="tmp" value="/tmp" />
<property name="package" value="${phing.project.name}" override="true" />
<property name="builddir" value="${tmp}/build/${phing.project.name}" override="true" />
<property name="srcdir" value="${project.basedir}" override="true" />
<property name="apacheconfdir" value="/etc/apache2/conf.d" />
<property name="apachectl" value="false" /><!-- set to apachectl path to spin up Apache instance -->
<property name="seleniumjar" value="false" /><!-- set to Selenium jar path to spin up Selenium instance -->
<property name="nodepath" value="" /><!-- set to node.js modules path to use Zombie.js testing -->
<!-- command for extra cleanup during shutdown; e.g. to change cache ownership after testing w/ Apache so deletion won't fail: -->
<property name="extra_shutdown_cleanup" value="false" />
<property name="vufindurl" value="http://localhost/vufind" />
<property name="vufinddb" value="vufind_test" />
<property name="vufinddbuser" value="vufindtest" />
<property name="vufinddbpass" value="vufindtestpass" />
<property name="dbtype" value="mysql" /><!-- use pgsql for PostgreSQL -->
<property name="mysqlhost" value="localhost" />
<property name="mysqlrootuser" value="root" />
<property name="mysqlrootpass" value="password" />
<property name="pgsqlhost" value="localhost" />
<property name="pgsqlrootuser" value="postgres" />
<property name="phpunit_extra_params" value="" />
<property name="mink_driver" value="zombiejs" /><!-- may also be set to selenium -->
<property name="snooze_multiplier" value="1" /><!-- can be used to slow down tests (selenium only) -->
<property name="php-cs-fixers" value="no_blank_lines_before_namespaces,function_call_space,trailing_spaces,unused_use,lowercase_keywords,encoding,parenthesis,php_closing_tag,visibility,duplicate_semicolon,extra_empty_lines,no_blank_lines_after_class_opening,no_empty_lines_after_phpdocs,operators_spaces,spaces_before_semicolon,ternary_spaces,concat_with_spaces,short_array_syntax,phpdoc_no_access,remove_leading_slash_use" />
<property name="version" value="2.5.1" />
<!-- We only need the -p switch if the password is non-blank -->
<if><not><equals arg1="${mysqlrootpass}" arg2="" /></not><then>
<property name="mysqlpwswitch" value="-p" />
</then></if>
<!-- Main Target -->
<target name="main" description="main target">
<phingcall target="startup" />
<trycatch property="exceptionmsg">
<try>
<phingcall target="ci-tasks" />
</try>
<catch>
<phingcall target="shutdown" />
<fail>Unexpected error during continuous integration tasks -- ${exceptionmsg}</fail>
</catch>
</trycatch>
<phingcall target="shutdown" />
</target>
<!-- Continuous Integration Tasks -->
<target name="ci-tasks" description="continuous integration tasks">
<!-- Create dirs -->
<mkdir dir="${builddir}/reports"/>
<mkdir dir="${builddir}/reports/coverage"/>
<!-- Call standard tasks -->
<phingcall target="phpcs"/>
<phingcall target="php-cs-fixer-dryrun"/>
<phingcall target="phpunit"/>
<phingcall target="phpdoc"/>
<phingcall target="phpcpd"/>
<phingcall target="phpmd"/>
<phingcall target="pdepend"/>
<phingcall target="phploc"/>
</target>
<!-- Report rule violations with PHPMD (mess detector) -->
<target name="phpmd">
<exec command="phpmd ${srcdir}/module xml ${srcdir}/tests/phpmd.xml --exclude ${srcdir}/module/VuFind/tests,${srcdir}/module/VuDL/tests,${srcdir}/module/VuFindSearch/tests --reportfile ${builddir}/reports/phpmd.xml" />
</target>
<!-- Measure project with phploc -->
<target name="phploc">
<exec command="phploc --log-csv ${builddir}/reports/phploc.csv ${srcdir}/module" />
</target>
<!-- PHP_Depend code analysis -->
<target name="pdepend">
<exec command="pdepend --jdepend-xml=${builddir}/reports/jdepend.xml --jdepend-chart=${builddir}/reports/dependencies.svg --overview-pyramid=${builddir}/reports/pdepend-pyramid.svg ${srcdir}/module" />
</target>
<!-- PHP copy-and-paste detection -->
<target name="phpcpd">
<exec command="phpcpd --log-pmd ${builddir}/reports/pmd-cpd.xml --exclude tests ${srcdir}/module" />
</target>
<!-- PHP CodeSniffer -->
<target name="phpcs">
<exec command="phpcs --standard=PEAR --ignore=*/config/*,*/tests/* --extensions=php --report=checkstyle ${srcdir}/module > ${builddir}/reports/checkstyle.xml" escape="false" />
</target>
<!-- php-cs-fixer (first task applies fixes, second task simply checks if they are needed) -->
<target name="php-cs-fixer">
<exec command="php-cs-fixer fix ${srcdir}/module --fixers=${php-cs-fixers} --verbose" passthru="true" escape="false" />
</target>
<target name="php-cs-fixer-dryrun">
<exec command="php-cs-fixer fix ${srcdir}/module --fixers=${php-cs-fixers} --dry-run --verbose --diff" passthru="true" escape="false" checkreturn="true" />
</target>
<!-- PHP API Documentation -->
<target name="phpdoc">
<mkdir dir="${builddir}/apidocs"/>
<phpdoc2 title="VuFind API Documentation"
destdir="${builddir}/apidocs">
<fileset dir=".">
<include name="module/*/src/**/*.php" />
</fileset>
</phpdoc2>
</target>
<!-- PHPUnit -->
<target name="phpunit" description="Run tests">
<exec dir="${srcdir}/module/VuFind/tests" command="NODE_PATH=${nodepath} VUFIND_MINK_DRIVER=${mink_driver} VUFIND_SNOOZE_MULTIPLIER=${snooze_multiplier} VUFIND_LOCAL_DIR=${srcdir}/local VUFIND_URL=${vufindurl} phpunit -dzend.enable_gc=0 --log-junit ${builddir}/reports/phpunit.xml --coverage-clover ${builddir}/reports/coverage/clover.xml --coverage-html ${builddir}/reports/coverage/ ${phpunit_extra_params}" passthru="true" checkreturn="true" />
</target>
<!-- PHPUnit without logging output -->
<target name="phpunitfast" description="Run tests">
<exec dir="${srcdir}/module/VuFind/tests" command="NODE_PATH=${nodepath} VUFIND_MINK_DRIVER=${mink_driver} VUFIND_SNOOZE_MULTIPLIER=${snooze_multiplier} VUFIND_LOCAL_DIR=${srcdir}/local VUFIND_URL=${vufindurl} phpunit -dzend.enable_gc=0 ${phpunit_extra_params}" passthru="true" checkreturn="true" />
</target>
<target name="composer" description="Install dependencies with Composer">
<httpget url="https://getcomposer.org/composer.phar" sslVerifyPeer="false" dir="${srcdir}" />
<echo message="Installing dependencies..." />
<exec command="php ${srcdir}/composer.phar install" />
</target>
<!-- Install and Activate VuFind -->
<target name="startup" description="install and activate demo">
<!-- get dependencies -->
<phingcall target="composer" />
<!-- set up appropriate read/write permissions for Apache -->
<exec command="chmod -R a+w ${srcdir}/local/cache" />
<!-- Generate basic configuration -->
<php expression="end(explode('/', '${vufindurl}'))" returnProperty="basepath" />
<exec command="php ${srcdir}/install.php --basepath=/${basepath} --non-interactive" />
<!-- Activate Selenium (if a path has been provided) -->
<if>
<istrue value="${seleniumjar}" />
<then>
<exec command="xvfb-run --server-args="-screen 0 1024x768x24" java -jar ${seleniumjar} > /dev/null &" />
</then>
</if>
<!-- Activate Apache (if an apachectl path has been provided) -->
<if>
<istrue value="${apachectl}" />
<then>
<copy file="${srcdir}/local/httpd-vufind.conf" tofile="${apacheconfdir}/vufindtest.conf" />
<exec command="${apachectl} restart" outputProperty="LASTOUTPUT" />
<echo message="${LASTOUTPUT}" />
</then>
</if>
<!-- build and configure the requested database type -->
<if>
<equals arg1="${dbtype}" arg2="pgsql" />
<then>
<!-- build database -->
<exec command="sudo su -c "psql -c \"DROP DATABASE ${vufinddb};\"" ${pgsqlrootuser}" />
<exec command="sudo su -c "psql -c \"DROP USER ${vufinddbuser};\"" ${pgsqlrootuser}" />
<exec command="sudo su -c "psql -c \"CREATE DATABASE ${vufinddb};\"" ${pgsqlrootuser}" checkreturn="true" />
<exec command="sudo su -c "psql -c \"CREATE USER ${vufinddbuser} PASSWORD '${vufinddbpass}';\"" ${pgsqlrootuser}" checkreturn="true" />
<exec command="sudo su -c "psql -c \"GRANT ALL ON DATABASE ${vufinddb} TO ${vufinddbuser};\"" ${pgsqlrootuser}" checkreturn="true" />
<!--<exec command="sudo su -c "psql -c \"select 'grant SELECT,INSERT,UPDATE,DELETE on '||schemaname||'.'||tablename||' to ${vufinddbuser};' from pg_tables where schemaname in ('${vufinddb}') order by schemaname, tablename;\"" ${pgsqlrootuser}" checkreturn="true" />-->
<exec command="PGPASSWORD=${vufinddbpass} psql -U ${vufinddbuser} -f ${srcdir}/module/VuFind/sql/pgsql.sql ${vufinddb}" checkreturn="true" />
<!-- configure VuFind -->
<exec command="sed -e "s!mysql://root@localhost/vufind!pgsql://${vufinddbuser}:${vufinddbpass}@${pgsqlhost}/${vufinddb}!" ${srcdir}/config/vufind/config.ini > ${srcdir}/local/config/vufind/config.ini" />
</then>
<else>
<!-- build database -->
<exec command="mysqladmin -f -h ${mysqlhost} -u ${mysqlrootuser} ${mysqlpwswitch}${mysqlrootpass} drop ${vufinddb}" />
<exec command="mysqladmin -h ${mysqlhost} -u ${mysqlrootuser} ${mysqlpwswitch}${mysqlrootpass} create ${vufinddb}" checkreturn="true" />
<exec command="mysql -h ${mysqlhost} -u ${mysqlrootuser} ${mysqlpwswitch}${mysqlrootpass} -e "GRANT SELECT,INSERT,UPDATE,DELETE ON ${vufinddb}.* TO '${vufinddbuser}'@'${mysqlhost}' IDENTIFIED BY '${vufinddbpass}' WITH GRANT OPTION"" checkreturn="true" />
<exec command="mysql -h ${mysqlhost} -u ${mysqlrootuser} ${mysqlpwswitch}${mysqlrootpass} -e "FLUSH PRIVILEGES"" checkreturn="true" />
<exec command="mysql -h ${mysqlhost} -u ${mysqlrootuser} ${mysqlpwswitch}${mysqlrootpass} -D ${vufinddb} < ${srcdir}/module/VuFind/sql/mysql.sql" checkreturn="true" />
<!-- configure VuFind -->
<exec command="sed -e "s!mysql://root@localhost/vufind!mysql://${vufinddbuser}:${vufinddbpass}@${mysqlhost}/${vufinddb}!" ${srcdir}/config/vufind/config.ini > ${srcdir}/local/config/vufind/config.ini" />
</else>
</if>
<!-- start Solr (use restart in case of old PID files) -->
<exec command="VUFIND_HOME=${srcdir} VUFIND_LOCAL_DIR=${srcdir}/local JETTY_PID=${srcdir}/local/vufindtest.pid JETTY_CONSOLE=/dev/null ${srcdir}/vufind.sh restart" outputProperty="LASTOUTPUT" />
<echo message="${LASTOUTPUT}" />
<!-- wait for Solr to finish spinning up -->
<echo message="Waiting for Solr to start up..." />
<exec command="sleep 30" />
<!-- import marc test records into vufind index (note: the marc test records have prefix "testsample#") -->
<exec escape="false" command="find ${srcdir}/tests/data -name '*.mrc' -printf '%p,'" outputProperty="buglist" />
<foreach list="${buglist}" param="filename" delimiter="," target="importrec" />
<exec escape="false" command="find ${srcdir}/tests/data/authority -name '*.mrc' -printf '%p,'" outputProperty="authlist" />
<foreach list="${authlist}" param="filename" delimiter="," target="importauthrec" />
<!-- build alphabrowse index -->
<exec command="VUFIND_HOME=${srcdir} VUFIND_LOCAL_DIR=${srcdir}/local ${srcdir}/index-alphabetic-browse.sh" outputProperty="LASTOUTPUT" />
<echo message="${LASTOUTPUT}" />
</target>
<!-- Uninstall and Deactivate VuFind -->
<target name="shutdown" description="deactivate and uninstall demo">
<!-- Remove Apache settings (if Apache was enabled) -->
<if>
<istrue value="${apachectl}" />
<then>
<delete file="${apacheconfdir}/vufindtest.conf" />
<exec command="${apachectl} restart" />
</then>
</if>
<!-- drop database -->
<if>
<equals arg1="${dbtype}" arg2="pgsql" />
<then>
<exec command="sudo su -c "psql -c \"DROP DATABASE ${vufinddb};\"" ${pgsqlrootuser}" checkreturn="true" />
<exec command="sudo su -c "psql -c \"DROP USER ${vufinddbuser};\"" ${pgsqlrootuser}" checkreturn="true" />
</then>
<else>
<exec command="mysqladmin -f -h ${mysqlhost} -u ${mysqlrootuser} ${mysqlpwswitch}${mysqlrootpass} drop ${vufinddb}" />
</else>
</if>
<!-- stop Solr -->
<exec command="VUFIND_HOME=${srcdir} VUFIND_LOCAL_DIR=${srcdir}/local JETTY_PID=${srcdir}/local/vufindtest.pid ${srcdir}/vufind.sh stop" outputProperty="LASTOUTPUT" />
<echo message="${LASTOUTPUT}" />
<!-- run extra cleanup action, if any -->
<if>
<istrue value="${extra_shutdown_cleanup}" />
<then>
<exec command="VUFIND_HOME=${srcdir} VUFIND_LOCAL_DIR=${srcdir}/local ${extra_shutdown_cleanup}" />
</then>
</if>
<!-- shut down selenium if necessary -->
<if>
<istrue value="${seleniumjar}" />
<then>
<exec command="pkill -f xvfb" />
<exec command="pkill -f "java -jar `basename ${seleniumjar}`"" />
</then>
</if>
<!-- delete the configuration, sample index, logs and cache data -->
<delete dir="${srcdir}/solr/logs" includeemptydirs="true" failonerror="false" />
<delete dir="${srcdir}/solr/alphabetical_browse" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/authority/conf" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/authority/index" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/authority/tlog" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/biblio/index" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/biblio/conf" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/biblio/tlog" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/biblio/spellchecker" includeemptydirs="true" failonerror="true" />
<delete dir="${srcdir}/solr/biblio/spellShingle" includeemptydirs="true" failonerror="true" />
<delete file="${srcdir}/import/solrmarc.log" failonerror="true" />
<delete file="${srcdir}/composer.lock" failonerror="false" />
<delete file="${srcdir}/composer.phar" failonerror="false" />
<delete dir="${srcdir}/vendor" includeemptydirs="true" failonerror="false" />
<delete dir="${srcdir}/local" includeemptydirs="true" failonerror="true" />
<exec command="git reset --hard" />
</target>
<!-- Prepare VuFind for distribution -->
<target name="package" description="build VuFind packages for distribution">
<!-- make sure the work area is empty, then rebuild it -->
<delete dir="${builddir}/packages" includeemptydirs="true" failonerror="false" />
<mkdir dir="${builddir}/packages" />
<delete dir="${builddir}/export" includeemptydirs="true" failonerror="false" />
<mkdir dir="${builddir}/export/vufind/usr/local/vufind2" />
<!-- load the relevant files into the work area -->
<phingcall target="composer" />
<exec command="git archive HEAD --format=tar | tar -x -C ${builddir}/export/vufind/usr/local/vufind2" />
<copy todir = "${builddir}/export/vufind/usr/local/vufind2/vendor">
<fileset dir="${srcdir}/vendor" defaultexcludes="false" />
</copy>
<!-- create a version-specific symlink so that tar/zip packages will have
appropriate directory structures. -->
<exec command="ln -s ${builddir}/export/vufind/usr/local/vufind2 ${builddir}/export/vufind-${version}" />
<!-- build the standard tar.gz archive -->
<echo message="Building .tar.gz...." />
<exec command="cd ${builddir}/export ; tar czfh ${builddir}/packages/vufind-${version}.tar.gz vufind-${version}" checkreturn="true" />
<!-- build the a zip archive -->
<echo message="Building .zip...." />
<exec command="cd ${builddir}/export ; zip -r ${builddir}/packages/vufind-${version}.zip vufind-${version}" checkreturn="true" />
<!-- build the DEB package -->
<echo message="Building .deb...." />
<move file="${builddir}/export/vufind/usr/local/vufind2/packages/DEBIAN" todir="${builddir}/export/vufind" includeemptydirs="true"/>
<exec command="chmod 0775 ${builddir}/export/vufind/DEBIAN/postinst" />
<exec command="dpkg-deb -b ${builddir}/export/vufind ${builddir}/packages/vufind_${version}.deb" checkreturn="true" />
<!-- clean up -->
<delete dir="${builddir}/export" includeemptydirs="true" failonerror="true" />
<!-- report success -->
<echo message="Packages successfully generated in ${builddir}/packages" />
</target>
<target name="importauthrec" description="import each of the MARC authority test records">
<if>
<istrue value="${filename}"/> <!-- To ignore the last token, as find command output list has ',' after last filename -->
<then>
<exec command="basename ${filename}" outputProperty="BASENAME" />
<!-- perform the import -->
<exec command="VUFIND_HOME=${srcdir} VUFIND_LOCAL_DIR=${srcdir}/local ${srcdir}/import-marc-auth.sh ${filename} marc_auth_ils.properties" outputProperty="LASTOUTPUT" />
<echo message="${LASTOUTPUT}" />
</then>
</if>
</target>
<target name="importrec" description="import each of the MARC bibliographic test records">
<if>
<istrue value="${filename}"/> <!-- To ignore the last token, as find command output list has ',' after last filename -->
<then>
<exec command="basename ${filename}" outputProperty="BASENAME" />
<!-- create custom import configurations to load the MARC filename into the building facet to help
test cases to limit searches to within specific collections of test records. -->
<copy file="${srcdir}/import/marc_local.properties" tofile="${srcdir}/local/import/marc-${BASENAME}.properties" />
<exec command="echo building=\"${BASENAME}\" >> ${srcdir}/local/import/marc-${BASENAME}.properties" />
<exec command="sed -e "s!marc_local.properties!marc-${BASENAME}.properties!" ${srcdir}/local/import/import.properties > ${srcdir}/local/import/import-${BASENAME}.properties" />
<!-- perform the import -->
<exec command="VUFIND_HOME=${srcdir} VUFIND_LOCAL_DIR=${srcdir}/local ${srcdir}/import-marc.sh -p ${srcdir}/local/import/import-${BASENAME}.properties ${filename}" outputProperty="LASTOUTPUT" />
<echo message="${LASTOUTPUT}" />
<!-- clean up temp files -->
<delete file="${srcdir}/local/import/marc-${BASENAME}.properties" />
<delete file="${srcdir}/local/import/import-${BASENAME}.properties" />
</then>
</if>
</target>
</project>