I am using a “build pipeline” in Jenkins to subject a Yii application I’m working on to a battery of unit tests and regression/integration/UAT tests.
The last job in the build pipeline releases the application to the production environment.
Unfortunately (for me), sometimes the release to production does not work (very annoying as it’s intermittent).
The release job uses rsync to release the application:
export SSHKEY=/var/lib/jenkins/.ssh/id_rsa
export DESTDIR=/var/www/myapp.com/public_html
export DEPLOY_SERVER=myserver.com
rsync -arvz --exclude '/yii' --delete -W --ignore-errors --force $BUILD_LOC/. root@$DEPLOY_SERVER:$DESTDIR
ssh -i $SSHKEY root@$DEPLOY_SERVER '
chown -R www-data:sysuser' ${DESTDIR} '
cd ' ${DESTDIR} '
if test ! -d ./assets; then mkdir '$DESTDIR'/assets; fi
if test ! -d ./protected/runtime; then mkdir '$DESTDIR'/protected/runtime; fi
chown -R www-data:sysuser ./*
chown -R www-data:sysuser ./.ht*
chmod -R 770 ./*
chmod 770 ./.ht*
'
I’m not copying over the contents of the protected/runtime directory, and the assets directory is empty.
My .htaccess file is as follows:
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
The (intermittent) error I get is:
Cannot redeclare class Controller in /var/www/myapp.com/public_html/protected/components/Controller.php on line 7
If I first remove everything (except the Yii directory), then everything seems to work, but this defeats the purpose of rsync (I only want to deploy files that have changed to keep deployment as quick as possible). So, performing the following:
rm -rf assets/ css/ favicon.ico .htaccess images/ index* protected/ themes/
as the first step in my deployment job will ensure everything works.
Does Yii use some kind of persistent state data from somewhere else? What is causing this?
Thanks in advance.