Behat with Jenkins-如何为PHP应用程序提供服务


Behat with Jenkins - how to serve PHP app?

我最近开始在一个使用Slim微框架的PHP项目中使用Behat和Mink。我的Behat测试运行良好,但我想将它们作为我的构建的一部分运行,该构建使用Sebastian Bergmann的Jenkins PHP模板。

要做到这一点,我预计我需要运行一个网络服务器来为Slim应用程序提供服务。显而易见的答案似乎是PHP 5.4内置的web服务器,但我仅限于PHP 5.3。

我目前唯一的想法是有一个部署阶段,如果Ant构建通过,Jenkins将在服务器上部署一个工作区,然后根据该工作区运行Behat测试。这感觉是一项艰巨的工作,可能会很麻烦,而且还需要启动另一个VM,我宁愿避免这种情况。我们希望在大量不同的项目中使用Behat,因此"一次性"的东西会更可取。

解决这个问题的最佳方法是什么?

我们最终采用的解决方案与Jakub建议的非常相似-我们的Jenkins实例为每个使用Behat的工作区生成conf.d中的Apache vhost文件,使用如下脚本:

# Set up a host file entry if none exists
hostFileEntry="127.0.0.1 ${JOB_NAME}.loc"
if fgrep -i "$hostFileEntry" /etc/hosts
then
        echo "${hostFileEntry}" already in hosts file
else
        echo $hostFileEntry >> /etc/hosts
fi
# Set up a virtual host for this job
echo "<VirtualHost *:80>" > /etc/httpd/conf.d/${JOB_NAME}.conf
echo "    ServerName ${JOB_NAME}.loc" >> /etc/httpd/conf.d/${JOB_NAME}.conf
echo "    DocumentRoot ${WORKSPACE}/public" >> /etc/httpd/conf.d/${JOB_NAME}.conf
echo "        <Directory ${WORKSPACE}/public>" >> /etc/httpd/conf.d/${JOB_NAME}.conf
echo "            AllowOverride all" >> /etc/httpd/conf.d/${JOB_NAME}.conf
echo "            Order allow,deny" >> /etc/httpd/conf.d/${JOB_NAME}.conf
echo "            Allow from all" >> /etc/httpd/conf.d/${JOB_NAME}.conf
echo "        </Directory>" >> /etc/httpd/conf.d/${JOB_NAME}.conf
echo "</VirtualHost>" >> /etc/httpd/conf.d/${JOB_NAME}.conf
# Reload Apache
sudo /sbin/service httpd reload

然后,我们针对这些工作区运行Behat,并以JUnit格式输出,以将结果与构建集成在一起。它需要对权限进行一些调整,但这对我们来说效果很好,非常感谢您的帮助:-)

您可以使用Ruby的Rack为PHP提供服务:https://github.com/jimeh/php-rack

另一个选择是为Mink实现Slim框架驱动程序(就像Symfony有一个一样)。只要没有javascript场景,就不需要Web服务器来运行您的场景。

对于javascript场景,我只是在jenkins实例上安装了web服务器和php。虚拟主机是作为构建的一部分创建的,并指向jenkins的工作空间。

您可以使用php5.3部署一个流浪服务器。这是"另一个虚拟机",但它是令人难以置信的一次性。