Непрерывная интеграция с использованием композитора
У меня есть проект PHP, в котором я загружаю пакеты через Composer. Я также запускаю Continuous Integration с использованием Jenkins на специализированном сервере CI. Каждый час Jenkins запрашивает мой репозиторий для изменений и, если он присутствует, выполняет тестовый прогон.
Первый шаг testrun делает новую проверку репозитория и выполняет сборку приложения с использованием Phing. Один из шагов сборки выполняет
composer install
Поскольку Jenkins всегда работает со свежей проверкой, композитор всегда будет получать все пакеты на каждом тестовом прогоне, даже если ни один из пакетов не был изменен со времени предыдущего запуска. Это имеет несколько недостатков:
- Для завершения тестового прогона требуется релятивно долгое время (композитор должен получить, например, Zend Framework, который довольно большой
- Он накладывает ненужную нагрузку на сервер packagist, если новые пакеты выбираются каждый час
- Если по какой-то причине установка композитора завершается с ошибкой, значит, мой тестовый прогон.
Я думал о возможности хранения пакетов, которые композитор извлекает на центральном месте на сервере CI, поэтому Дженкинс сможет получить доступ к пакетам в этом месте для каждого тестового прогона. Конечно, теперь мне нужно переписать часть моего приложения, чтобы обработать тот факт, что папка поставщика находится в другом месте на сервере CI. Во-вторых, я должен сказать Дженкинсу отслеживать изменения в файле composer.lock, чтобы посмотреть, нужно ли ему вообще запускать композитор. Я боюсь, что ни одна из этих двух вещей не является тривиальной.
Есть ли у кого-нибудь какие-либо предложения по другому/более эффективному способу сделать это, или это лучший вариант просто получить все пакеты через композитор при каждом прогоне. Кроме того, это лучший способ убедиться, что вы всегда используете правильные пакеты, но это сортировка кажется пустой тратой банды, безусловно, на более поздних стадиях разработки, когда список пакетов вряд ли изменится.
Ответы
Ответ 1
Одна вещь, которую вы можете сделать, - это хранить поставщиков в месте вне рабочей области проекта в jenkins, чтобы она оставалась между сборками. Вам не обязательно менять приложение. Просто обновите конструкцию script, чтобы создать символическую ссылку на расположение поставщиков.
Я использую capifony для развертывания и он использует этот подход, чтобы поддерживать поставщиков между выпусками.
Ответ 2
Один из способов ускорить это - использовать composer install --prefer-dist
, который загружает только ZIP файлы даже для пакетов dev. Это предпочтительнее для уникальных сборок, так как пропускает всю историю проекта.
Что касается избавления от пакета, не беспокойтесь об этом слишком много, каждый сборник каждый час не будет иметь большого значения по сравнению со всеми библиотеками с открытым исходным кодом, которые строятся на travis при каждой фиксации.
Ответ 3
Следует отметить, что Composer кэширует пакеты, которые он загружает. Поэтому, как только они будут загружены в первый раз, они должны работать, даже если Packagist не работает (не на 100% уверен), а пропускная способность сети (100%).
Во-вторых, почему вы запускаете тесты, выполняя новую проверку репозитория? Полностью можно сохранить копию своего кода в рабочей области в Jenkins, и просто убедитесь, что вы протираете при каждом тестировании кеши, журналы и другие артефакты. Это ускорит не только установку композитора, но и тяги git, особенно для больших репозиториев!
Примечание: для нашей собственной платформы Jenkins, где рабочие пространства не очищаются между тестами, основным недостатком, который мы нашли с композитором, является простое количество дискового пространства, взятое из полного каталога поставщика в каждой рабочей области. Я попытался обойти это с помощью символических ссылок и совместного использования вендоров (названных на основе хэшей из composer.lock), но затем у автозагрузчика композитора возникли проблемы с поиском, где загружать классы из...
Ответ 4
Шаги по установке проекта zf2 на Jenkins mkdir/путь/в/ваш/проект
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
-
создать файл composer.json в корневом каталоге проекта
добавьте все необходимые вам pacakages
{ "name": "amarjitsingh", "описание": "amarjitsingh", "лицензия": "BSD-3-пункт", "ключевые слова": [ "фреймворк", "ZF2" ], "homepage": " http://domain.com/", "require": { "php": " >= 5.5", "zendframework/zendframework": "~ 2.5", "phpoffice/phpword": "dev-master", "doctrine/doctrine-orm-module": "0.7.0", "представьте/представьте": "0.5. *", "zf-commons/zfc-user": "dev-master" }, "autoload": { "psr.0": "/module" }
}
-
запустите 'composer install
', чтобы установить эти пакеты.
-
настройте git на вашем компьютере
если вы используете ubuntu, вы можете настроить git с помощью следующих команд
Обновление sudo apt-get
sudo apt-get install 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
в файле dcument
root
и добавьте 'vendor'
внутри него.
git init
git remote add origin https://[email protected]/username/zf2ci.git
примените команду ниже для ADD, COMMIT и PUSH файлов
git add .
git commit -m 'Initial commit with contributors'
git push -u origin master
git pull
с помощью облака вы можете использовать AWS. Я использую цифровой океан
1 создайте droplet
2.name это, как вы пожелаете, в моем случае это zf2ci
3. выберите пакет
4. выберите ОС my cas eis Ubuntu 14.04
5. На вкладке Applications выберите LAMP
6 как только вы закончите с этим, вы получите IP-адрес, имя пользователя root и пароль.
7. Войдите в систему ip с помощью шпатлевки
8. пользователь root
9. пароль pass
10. Как только вы войдете в него, вам будет предложено изменить пароль
11. goto web root, например /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
- перейти к приложению
/var/ww/html/zf2ci
- run '
composer install --no-dev
' мы устанавливаем его без опции dev becuasae, мы устанавливаем только проверенный код на сервере приложений.
Шаг 3
Создайте сервер Jenkins
1. создать еще одну каплю для Дженкинса
2. изображение ubuntu
3. Установка лампы
установить Jenkns
Установка Дженкинса
Прежде чем мы сможем установить 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
для Дженкинса
1.9.1 Manage Jenkins->Manage Plugins->Bitbucket Plugin->download
и установите
1.9.2
создать вакансию создание / название проекта (например, zf2ci) → управление исходным кодом (git) обеспечивает ssh url ([email protected]:username/zf2ci.git
) → ветки на построенные (*/master), это ветка, где каждый раз, когда любой пользователь совершает и объединяет код с ветвью мастера - Jenkins вызывается
1.9.3
Построить триггеры выберите вариант (создайте, когда chnage будет нажат), это произойдет, когда мы сделаем POST-крючок на бит-ведре
1.9.4
Build- > Execute shell
composer install
./vendor/bin/phpunit ./tests
наши тесты сидят intests dir
1.9.5
установите a 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 goto bitbucket перейти на repo zf2ci перейдите в настройки нажмите клавиши развертывания → добавить ключ добавить ярлык (jenkins) key * (вставьте содержимое файла 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
проект на Дженкинсе
1.9.10 добавьте следующую команду в Выполнить команду Shell- > [rsync -y -vrzhe "ssh -o StrictMostKeyChecking=no" --exclude vendor/ . [email protected]:/var/www/html/zf2ci
(сервера приложений)]
ssh [email protected]<<EOF
cd /var/www/html/zf2ci
composer install --no-dev
EOF