Непрерывная интеграция с использованием композитора

У меня есть проект PHP, в котором я загружаю пакеты через Composer. Я также запускаю непрерывную интеграцию с использованием Jenkins на выделенном сервере CI. Раз в час Дженкинс запрашивает мой репозиторий на наличие изменений и, если они есть, выполняет тестовый прогон.

Первым шагом тестового запуска является новая проверка репозитория и выполнение сборки приложения с использованием Phing. Одним из этапов сборки является выполнение

composer install

Поскольку Jenkins всегда работает со свежей проверкой, composer всегда будет получать все пакеты при каждом тестовом запуске, даже если ни один из пакетов не был изменен с момента предыдущего запуска. У этого есть пара недостатков:

  • Выполнение тестового прогона занимает относительно много времени (композитору необходимо загрузить, например, Zend Framework, который довольно большой).
  • Это создает ненужную нагрузку на сервер упаковщиков, если новые пакеты загружаются каждый час.
  • Если по какой-то причине установка композитора не удалась, запустится и мой тест.

Я думал о возможном хранении пакетов, которые композитор извлекает, в центральном месте на сервере CI, чтобы Дженкинс мог получить доступ к пакетам в этом месте для каждого запуска теста. Конечно, теперь мне нужно переписать часть своего приложения, чтобы учесть тот факт, что папка поставщика находится в другом месте на сервере CI. Во-вторых, я должен сказать Дженкинсу отслеживать изменения в файле composer.lock, чтобы увидеть, нужно ли ему запускать composer. Боюсь, ни одна из этих двух вещей на самом деле не тривиальна.

Есть ли у кого-нибудь какие-либо предложения по другому/лучшему способу сделать это, или это лучший вариант, чтобы просто получать все пакеты через композитор при каждом тестовом прогоне. Конечно, это лучший способ убедиться, что вы всегда используете правильные пакеты, но это похоже на пустую трату полосы пропускания, особенно на более поздних стадиях разработки, когда список пакетов уже почти не изменится.


person rj_bijl    schedule 23.10.2012    source источник


Ответы (4)


Одна вещь, которую вы можете сделать, это хранить поставщиков в месте за пределами рабочей области проекта в jenkins, чтобы они оставались между сборками. Вам не обязательно менять приложение. Просто обновите скрипт сборки, чтобы он создавал символическую ссылку на расположение поставщиков.

Я использую capifony для развертывания и он использует этот подход для сохранения поставщиков между релизами.

person Jakub Zalas    schedule 23.10.2012
comment
правильно, таким образом мне нужно только убедиться, что в процессе сборки файл composer.lock скопирован в это место, и выполнить установку композитора для проверки наличия новых пакетов. И я действительно мог бы вытащить его только с переключателями среды в файле сборки. - person rj_bijl; 24.10.2012

Один из способов ускорить это — использовать composer install --prefer-dist, который загружает только zip-файлы даже для пакетов разработки. Это предпочтительнее для уникальных сборок, поскольку при этом пропускается вся история проекта.

Что касается щадящего упаковщика, не беспокойтесь об этом слишком сильно, одна сборка каждый час не будет иметь большого значения по сравнению со всеми библиотеками с открытым исходным кодом, которые строятся на travis при каждом коммите.

person Seldaek    schedule 24.10.2012

Следует отметить, что Composer кэширует загружаемые пакеты. Поэтому, как только они будут загружены в первый раз, они должны работать, даже если Packagist не работает (не на 100% уверен) и сэкономлена пропускная способность сети (100% уверен).

Во-вторых, почему вы запускаете тесты, выполняя новую проверку репозитория? Вполне возможно сохранить копию вашего кода в рабочей области в Jenkins и просто убедиться, что вы стираете кэши, журналы и другие артефакты при каждом запуске теста. Это ускорит не только установку composer, но и git pull, особенно для больших репозиториев!

Примечание: для нашей собственной платформы Jenkins, где рабочие области не очищаются между тестами, основным недостатком, который мы обнаружили с композитором, является огромный объем дискового пространства, занимаемый наличием полного каталога поставщика в каждой рабочей области. Я пытался обойти это, используя символические ссылки и разделяя поставщиков (названных на основе хэшей composer.lock), но затем у автозагрузчика композитора возникли проблемы с поиском, откуда загружать классы...

person gggeek    schedule 01.09.2015

Шаги по установке проекта zf2 на Jenkins mkdir /path/to/your/project 1. Установите композитор

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

Примечание. Если вышеуказанное не удается из-за разрешений, снова запустите строку mv с помощью sudo. Быстрая версия для копирования и вставки, включая sudo:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
  1. создайте файл composer.json в корневом каталоге проекта, добавьте все необходимые пакеты

    { "name": "amarjitsingh", "description": "amarjitsingh", "license": "BSD-3-Clause", "keywords": [ "framework", "zf2" ], "homepage": "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": "/module" }

    }

  2. запустите «composer install», чтобы установить эти пакеты.

  3. настройте git на своем компьютере, если вы используете Ubuntu, вы можете настроить GIT, используя следующие команды

    sudo apt-get обновить sudo apt-get установить git

Настроить Git

git config --global user.name "Your Name"
git config --global user.email "[email protected]"

проверьте список конфигураций

git config --list

как только вы настроите GIT, тогда c

cd /path/to/your/project

. после того, как вы установили пакеты, создайте файл «.gitignore» в документе root и добавьте в него 'vendor'.

git init
git remote add origin https://[email protected]/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. выберите ОС мой случай Ubuntu 14.04 5. На вкладке приложений выберите LAMP 6 когда вы закончите с этим, вы получите IP-адрес , имя пользователя root и пароль. 7. войдите в систему с помощью замазки 8. пользователь root 9. пароль pass 10. как только вы войдете в него, вам будет предложено изменить пароль 11. перейти к веб-корню, например, /var/www/html 12. установить GIT 13. apt-get install git 14. клонировать репо 15. git clone https://[email protected]/username/zf2ci.git 16. установить композитор на эту машину

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

Примечание. Если вышеуказанное не удается из-за разрешений, снова запустите строку mv с помощью sudo. Быстрая версия для копирования и вставки, включая 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', мы устанавливаем его без опции dev, потому что мы устанавливаем только проверенный код на сервер приложений

Шаг 3

Создайте сервер Jenkins 1. настройте еще один дроплет для Jenkins 2. image ubuntu 3. установите лампу установите Jenkns

Установка Jenkins Прежде чем мы сможем установить Jenkins, мы должны добавить ключ и список источников в apt. Это делается в 2 шага, сначала мы добавим ключ.

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 Теперь нам нужно только обновить кеш apt, прежде чем мы сможем установить Jenkins.

apt-get update

1.4 Поскольку кеш обновлен, мы можем приступить к установке Jenkins. Обратите внимание, что Jenkins имеет большое количество зависимостей, поэтому установка их всех может занять некоторое время.

apt-get install jenkins

1.5 открыть ip с портом 8080 например http://127.0.0.1:8080

1.6 установить git на сервер jenkins

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 включить аутентификацию пользователя

1.9 enable bitbucket plugin для Jenkins 1.9.1 Manage Jenkins->Manage Plugins->Bitbucket Plugin->download и установить 1.9.2 создать задание создать задание-> имя проекта (например, zf2ci)-> управление исходным кодом (git) предоставить URL-адрес ssh ([email protected]:username/zf2ci.git)-> ветки для сборки (*/master) это ветка, в которой каждый раз, когда любой пользователь фиксирует и объединяет код с основной веткой, вызывается Jenkins

1.9.3 Триггеры сборки выберите опцию (сборка при нажатии изменения), это сработает, когда мы создадим хук POST на битовом ведре.

1.9.4 Сборка->Выполнить оболочку

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

наши тесты сидит intests dir

1.9.5 установить ssh key pair

войти в 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 перейти к битбакету, переключиться на репозиторий zf2ci, перейти к настройкам, нажать ключи развертывания-> добавить ключ добавить метку (jenkins) ключ * (вставьте сюда содержимое файла id_rsa.pub) сохранить ключ

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

1.9.7 зарегистрировать хук POST для репо

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://[email protected]:username/zf2ci.git HEAD

1.9.9 Проект save на Jenkins 1.9.10 добавьте следующую команду в 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
person amarjit singh    schedule 01.10.2015