// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Поддержка PHP на серверах непрерывной сборки
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Поддержка PHP на серверах непрерывной сборки - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Поддержка PHP на серверах непрерывной сборки

|===
|В этой экранной демонстрации показано, как настроить приложение PHP для серверов непрерывной сборки Hudson и Jenkins. В демонстрации кратко поясняется, что такое непрерывная сборка и почему ее удобно использовать для приложений PHP. Также в демонстрации показан запуск задания сборки для приложения PHP и способы просмотра результатов.

Автор: Джеф Рубинов (Jeff Rubinoff)
Время: 9:21 
link:http://bits.netbeans.org/media/php-continuous-builds.flv[+Загрузить+] [21,7 МБ]

link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Continuous%20Builds%20Screencast[+Отправить отзыв по этому учебному курсу+]
 |  
|===
