14

我有一个 PHP 项目,我在其中通过 Composer 加载包。我还在专用的 CI 服务器上使用 Jenkins 运行持续集成。每小时一次,Jenkins 会查询我的存储库是否有更改,如果存在,则执行测试运行。

测试运行的第一步是重新检查存储库,并使用 Phing 执行应用程序的构建。构建的步骤之一是执行

composer install

由于 Jenkins 总是使用新的结帐,因此 composer 总是会在每次测试运行时获取所有包,即使自上次运行以来没有任何包被更改。这有几个缺点:

  • 完成一次测试运行需要相对较长的时间(composer 需要获取例如 Zend Framework,它相当大
  • 如果每小时获取新包,它会给包服务器带来不必要的压力
  • 如果由于某种原因,作曲家安装失败,我的测试也会运行。

我正在考虑可能将 Composer 获取的包存储在 CI 服务器的中心位置,以便 Jenkins 能够在每次测试运行时访问该位置的包。当然,现在我必须重写部分应用程序来处理供应商文件夹在 CI 服务器上位于不同位置的事实。其次,我必须告诉 Jenkins 跟踪 composer.lock 文件的变化,看看他是否需要运行 composer。恐怕这两件事都不是微不足道的。

是否有人对其他/更好的方法有任何建议,或者在每次测试运行时通过 composer 获取所有包的最佳选择。诚然,这是确保您始终使用正确包的最佳方式,但感觉有点浪费带宽,当然在开发的后期阶段,包列表几乎不会再改变了。

4

4 回答 4

5

一种加快速度的方法是使用composer install --prefer-dist即使是开发包也只下载 zip。这对于独特的构建是首选,因为它跳过了项目的整个历史。

至于备用 packagegist,不要太担心,与每次提交时构建在 travis 上的所有开源库相比,每小时构建一次并不会产生巨大差异。

于 2012-10-24T10:41:06.637 回答
4

您可以做的一件事是将供应商存储在詹金斯项目工作区之外的位置,以便它保留在构建之间。您不一定需要更改您的应用程序。只需更新构建脚本,以便它创建到供应商位置的符号链接。

我使用 capifony 进行部署,它使用这种方法来保持供应商之间的发布。

于 2012-10-23T22:19:27.397 回答
0

需要注意的一件事是 Composer 会缓存它下载的包。因此,一旦第一次下载它们,即使 Packagist 已关闭(不是 100% 肯定),它们也应该可以工作,并且可以节省网络带宽(100% 肯定)。

第二件事是:你为什么要通过重新检出存储库来运行测试?完全可以在 Jenkins 的工作区中保留代码副本,并确保在每次测试运行时擦除缓存、日志和其他工件。这不仅会加快 composer install 的速度,还会加快 git pull 的速度,尤其是对于大型 repos!

旁注:对于我们自己的 Jenkins 平台,在测试之间没有清理工作空间,我们发现 composer 的主要缺点是在每个工作空间中拥有完整的供应商目录会占用大量磁盘空间。我试图通过使用符号链接和共享供应商(基于composer.lock的哈希命名)来解决这个问题,但是composer autoloader在寻找从哪里加载类时遇到了一些问题......

于 2015-09-01T15:30:41.120 回答
0

在 Jenkins mkdir /path/to/your/project 上安装 zf2 项目的步骤 1. 安装 composer

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

注意:如果上述由于权限而失败,请使用 sudo 再次运行 mv 行。一个快速复制粘贴版本,包括 sudo:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
  1. 在项目的根目录下创建一个 composer.json 文件添加你需要的所有 pacakages

    {“名称”:“amarjitsingh”,“描述”:“amarjitsingh”,“许可证”:“BSD-3-Clause”,“关键字”:[“框架”,“zf2”],“主页”:“ http: //domain.com/ ", "require": { "php": ">=5.5", "zendframework/zendframework": "~2.5", "phpoffice/phpword": "dev-master", "doctrine/doctrine -orm-module”:“0.7.0”,“imagine/Imagine”:“0.5.*”,“zf-commons/zfc-user”:“dev-master”},“autoload”:{“psr.0 “ : “/模块” }

    }

  2. 运行 ' composer install' 来安装这些软件包。

  3. 如果您使用的是 ubuntu,请在您的机器上设置 git,您可以使用以下命令设置 GIT

    sudo apt-get 更新 sudo apt-get install git

设置 Git

git config --global user.name "Your Name"
git config --global user.email "youremail@domain.com"

检查配置列表

git config --list

一旦你设置了 GIT 然后 c

cd /path/to/your/project

. 一旦你安装了包,在文件中创建一个“ .gitignore”文件并在其中 root添加'vendor'

git init
git remote add origin https://username@bitbucket.org/username/zf2ci.git

将以下命令应用于添加、提交和推送文件

git add .
git commit -m 'Initial commit with contributors'
git push -u origin master
git pull

使用云,您可以使用 AWS 。我正在使用数字海洋

1 创建一个droplet 2.根据需要命名它,在我的情况下它是 zf2ci 3.选择一个包 4.选择操作系统 my cas eis Ubuntu 14.04 5.在应用程序选项卡中选择 LAMP 6 完成后,您将获得 IP 地址,用户名root和密码。7. 使用 putty 登录 ip 8. 用户root 9. 密码pass 10. 一旦你进入它,它会提示你更改密码 11. goto web root eg /var/www/html 12. install GIT 13. apt-get install git 14. clone the repo 15. git clone https://username@bitbucket.org/username/zf2ci.git 16.在本机上安装composer

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

注意:如果上述由于权限而失败,请使用 sudo 再次运行 mv 行。一个快速复制粘贴版本,包括 sudo:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
  1. 转到应用程序路径/var/ww/html/zf2ci
  2. 运行' composer install --no-dev'我们正在安装它而没有开发选项,因为我们只在应用服务器上安装经过良好测试的代码

第三步

创建 Jenkins 服务器 1. 为 Jenkins 设置另一个 Droplet 2. image ubuntu 3.install Lamp install Jenkns

安装 Jenkins 在安装 Jenkins 之前,我们必须将密钥和源列表添加到 apt。这分两步完成,首先我们将添加密钥。

1.1

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add -

其次,我们将为 Jenkins 创建一个源列表。

1.2

echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list

1.3 现在,我们只需要在安装 Jenkins 之前更新 apt 的缓存。

apt-get update

1.4 由于缓存已经更新,我们可以继续安装 Jenkins。请注意,Jenkins 有很多依赖项,因此可能需要一些时间来安装它们。

apt-get install jenkins

1.5 打开8080端口的ip 例如http://127.0.0.1:8080

1.6 在jenkins服务器上安装git

sudo apt-get update
sudo apt-get install git

1.7 安装作曲家

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

1.8 启用用户认证

enable bitbucket pluginJenkins 1.9.1 的 1.9 Manage Jenkins->Manage Plugins->Bitbucket Plugin->download并安装 1.9.2 创建作业创建作业-> 项目名称(例如 zf2ci)-> 源代码管理(git)提供 ssh url( git@bitbucket.org:username/zf2ci.git)-> 构建的分支(*/master)这是每次任何用户提交并将代码与主分支合并时的分支 - Jenkins 被调用

1.9.3 Build Triggers 选择选项(在推送 chnage 时构建),当我们在 bit bucket 上创建一个 POST 钩子时,这将 wok

1.9.4 构建->执行shell

 composer install
 ./vendor/bin/phpunit ./tests

我们的测试位于 intests 目录

1.9.5 设置一个ssh key pair

通过putty登录jenkins Serevr

su jenkins
    cd
    ls -la( check what is in the jenkins home directory)
    ssh-kegen -t rsa (dsa by default but choose rsa key ,it is faster)
    press enter(on path)
    press enter(leave the pass phrase empty , the whole point here is to avoid passwords in the automated jobs)
    pres enter



 cd .ssh

ls -la(你会发现 id_rsa.pub)文件在那里

cat id_rsa.pub

(全选并复制文件内容)

1.9.6 goto bitbucket 切换到repo zf2ci goto settings 点击deployment keys->add key add label (jenkins) key*(粘贴id_rsa.pub的内容)file here save key

summary
`zf2ci->settings->deployment keys->add key->type` label and paste id_rsa.pub key->save

1.9.7 为 repo 注册 POST hook

Settings->
Integrations->
Hooks->
POST(search for POST Hook)->
Add the url /IP of the Jenkins Server) (`172.62.235.100:8080/bitbucket-hook/`)
(the body of the post contanis information about the repository, branch, list of recent commits, user)

1.9.8 登录Jenkins服务器

su jenkinks
    cd
    cd .ssh
    git ls-remote -h ssh://git@bitbucket.org:username/zf2ci.git HEAD

Jenkins 1.9.10 上的1.9.9 save项目在 Execute Shell->command [ rsync -y -vrzhe "ssh -o StrictMostKeyChecking=no" --exclude vendor/ . root@ipaddress:/var/www/html/zf2ci(应用服务器的)]中添加以下命令

ssh root@ipaddress<<EOF
    cd /var/www/html/zf2ci
    composer install --no-dev
    EOF
于 2015-10-01T07:58:26.450 回答