Zend Server – Parte 3 – Distribuição (Deployment)

Bom dia pessoal!

Update: Existe um post atualizado com a versão 8. Pode ser encontrada neste link.

Update: Este post é para mostrar a função de deployment, um procedimento para distribuir uma versão nova da sua aplicação e não para o dia-a-dia de desenvolvimento. Para isso vou fazer um post 3.5 mostrando como usar o Zend Server no desenvolvimento sem usar o deployment.

Neste terceiro post da série sobre Zend Server, vamos ver como fazer a distribuição (ou deployment) para um servidor.

No post anterior fizemos a instalação do Zend Server Free Edition e estamos prontos para rodar nossas aplicações. Uma mudança muito bem vinda na versão 6 é a possibilidade de fazer o deployment também na versão gratuita, apesar de não poder fazer o rollback, ou seja, retornar para uma versão anterior.

Se você usa o Zend Studio, o processo de deployment é bem mais simples pois é feito pelo próprio Zend Studio, mas para quem não tem, o Zend Server vem com uma ferramenta console chamada zdpack destinada a criar pacotes prontos para o deployment.

Mas qual a diferença entre usar o deployment e copiar os arquivos para o diretório manualmente?

O deployment é um processo repetitivo e vamos ser francos, quem nunca esqueceu de copiar um arquivo, ou modificar um arquivo após a cópia do projeto? Existem várias ferramentas ótimas para este processo como o phing e Caspriano. Eu particularmente uso o phing e vou escrever um post sobre ele em breve. O zdpack só funciona para o Zend Server, e você não vê muitos provedores de hospedagem oferecendo serviços incluindo o Zend Server, então o uso fica um pouco limitado. Mas se você tem um servidor na empresa ou pessoal com o Zend Server, pode usar deste recurso.

Mas como estamos numa série sobre Zend Server, vamos falar sobre ele 🙂

Preparando o pacote

Para preparar o pacote de deployment, vamos executar o zdpack:

leandro@iMac-de-Leandro-Silva:~/Dev/PHP$ ls -l ZFTutorial/
total 1432
-rw-r--r--  1 leandro  staff    1548  6 Ago 07:00 LICENSE.txt
-rw-r--r--  1 leandro  staff    1759  6 Ago 07:00 README.md
-rw-r--r--  1 leandro  staff     342  6 Ago 07:00 composer.json
-rw-r--r--  1 leandro  staff     300  6 Ago 07:00 composer.lock
-rw-r--r--  1 leandro  staff  709565  6 Ago 07:00 composer.phar
drwxr-xr-x  4 leandro  staff     136  6 Ago 07:00 config
drwxr-xr-x  3 leandro  staff     102  6 Ago 07:00 data
-rw-r--r--  1 leandro  staff    1993  6 Ago 07:00 init_autoloader.php
drwxr-xr-x  3 leandro  staff     102  6 Ago 07:00 module
drwxr-xr-x  8 leandro  staff     272  6 Ago 07:00 public
drwxr-xr-x  6 leandro  staff     204  6 Ago 07:00 vendor
leandro@iMac-de-Leandro-Silva:~/Dev/PHP$ zdpack create ZFTutorial
Skeleton files were generated into ZFTutorial
leandro@iMac-de-Leandro-Silva:~/Dev/PHP$ ls -l ZFTutorial/
total 1440
-rw-r--r--   1 leandro  staff    1548  6 Ago 07:00 LICENSE.txt
-rw-r--r--   1 leandro  staff    1759  6 Ago 07:00 README.md
-rw-r--r--   1 leandro  staff     342  6 Ago 07:00 composer.json
-rw-r--r--   1 leandro  staff     300  6 Ago 07:00 composer.lock
-rw-r--r--   1 leandro  staff  709565  6 Ago 07:00 composer.phar
drwxr-xr-x   4 leandro  staff     136  6 Ago 07:00 config
drwxr-xr-x   5 leandro  staff     170  6 Ago 07:06 data
-rw-r--r--   1 leandro  staff    2327  6 Ago 07:06 deployment.xml
-rw-r--r--   1 leandro  staff    1993  6 Ago 07:00 init_autoloader.php
drwxr-xr-x   3 leandro  staff     102  6 Ago 07:00 module
drwxr-xr-x   8 leandro  staff     272  6 Ago 07:00 public
drwxr-xr-x  12 leandro  staff     408  6 Ago 07:06 scripts
drwxr-xr-x   6 leandro  staff     204  6 Ago 07:00 vendor
leandro@iMac-de-Leandro-Silva:~/Dev/PHP$ ls -l ZFTutorial/data
total 16
-rw-r--r--  1 leandro  staff   83  6 Ago 07:06 LICENSE.txt
drwxr-xr-x  2 leandro  staff   68  6 Ago 07:00 cache
-rw-r--r--  1 leandro  staff  206  6 Ago 07:06 index.php
leandro@iMac-de-Leandro-Silva:~/Dev/PHP$ ls -l ZFTutorial/scripts/
total 80
-rw-r--r--  1 leandro  staff  1644  6 Ago 07:06 post_activate.php
-rw-r--r--  1 leandro  staff  1539  6 Ago 07:06 post_deactivate.php
-rw-r--r--  1 leandro  staff  1533  6 Ago 07:06 post_rollback.php
-rw-r--r--  1 leandro  staff  1786  6 Ago 07:06 post_stage.php
-rw-r--r--  1 leandro  staff  1534  6 Ago 07:06 post_unstage.php
-rw-r--r--  1 leandro  staff  1845  6 Ago 07:06 pre_activate.php
-rw-r--r--  1 leandro  staff  1541  6 Ago 07:06 pre_deactivate.php
-rw-r--r--  1 leandro  staff  1535  6 Ago 07:06 pre_rollback.php
-rw-r--r--  1 leandro  staff  1725  6 Ago 07:06 pre_stage.php
-rw-r--r--  1 leandro  staff  1536  6 Ago 07:06 pre_unstage.php
leandro@iMac-de-Leandro-Silva:~/Dev/PHP$

A parte destacada representa os arquivo e diretórios criados.

Na raiz do projeto ele cria um arquivo deployment.xml que contem toda a configuração para o deployment (arquivos, nome, campos de configuração, validações, etc) e um diretório scripts que contem vários scripts que serão executados em cada etapa. Dentro do diretório data ele inclui um arquivo LICENSE.txt com a licença a ser usada e um index.php.

Uma coisa importante é que o diretório “data” do zdpack tem a finalidade de conter todos os arquivos da sua aplicação o que entra em “conflito” com o “data” do Zend Framework. O que faço é editar o deployment.xml e mudo o diretório onde ele busca os arquivos de “data” para “build”. Vamos ver como é a estrutura deste arquivo:

<?xml version="1.0" encoding="utf-8"?>
<package version="2.0" xmlns="http://www.zend.com/server/deployment-descriptor/1.0">
  <type>application</type>
  <name>ZFTutorial</name>
  <summary>ZFTutorial short description</summary>
  <description>ZFTutorial long description</description>
  <version>
    <release>0.1</release>
  </version>
  <eula>build/LICENSE.txt</eula>
  <appdir>build</appdir>
  <docroot>build/public</docroot>
  <scriptsdir>scripts</scriptsdir>
  <dependencies>
    <required>
		<php>
			<min>5.3.15</min>
		</php>
		<extension>
			<name>pdo_mysql</name>
		</extension>
		<directive>
			<name>memory_limit</name>
			<min>16M</min>
		</directive>
    </required>
  </dependencies>
  <parameters>
    <parameter id="locale"
    display="Locale Settings.Locale"
    required="true" type="choice">
    <validation>
    <enums>
    	<enum>GMT</enum>
    	<enum>other</enum>
    </enums>
    </validation>
      <description></description>
    </parameter>
    <parameter id="db_host"
    display="Database Connection.Host"
    required="true" type="string">
      <description>
        You can specify server port, ex.: localhost:3307 If
        you are not using default UNIX socket, you can specify it
        here instead of host, ex.:
        /var/run/mysqld/mysqld.sock
      </description>
    </parameter>
    <parameter id="db_name"
    display="Database Connection.Database Name"
    required="true" type="string">
      <defaultvalue>ZFTutorial</defaultvalue>
      <description>

      </description>
    </parameter>
    <parameter id="db_username"
    display="Database Connection.User Name"
    required="true" type="string">
      <defaultvalue>root</defaultvalue>
      <description>

      </description>
    </parameter>
    <parameter id="db_password"
    display="Database Connection.User Password"
    required="false" type="password">
      <defaultvalue></defaultvalue>
      <description>

      </description>
    </parameter>
    <parameter id="skip_base"
    display="Web access options.Skip Base URL Validation Before the Next Step"
    required="false" type="checkbox">
      <defaultvalue>false</defaultvalue>
      <description>
        Check this box only if it is not possible to
        automatically validate the Base URL.
      </description>
    </parameter>
  </parameters>
</package>

Para o processo não atrapalhar o ZF2, alteramos as linhas 10-12, criamos o diretório build dentro do diretório ZFTutorial e copiamos todos os arquivos do projeto para ele (excluindo os arquivos que o zdpack criou e quaisquer outros que não queremos distribuir, como por exemplo config/autoload/*local*).

Vamos à estrutura geral do arquivo (alguns campos não são criados pelo zdpack, basta acrescentá-los):

  • type: especificamos se é uma aplicação ou biblioteca (library, que poderá ser usada por outras aplicação, como um include_pach).
  • name: Nome da aplicação
  • summary: Um resumo da aplicação
  • description: A descrição completa da aplicação
  • version: Versão da nossa aplicação. É importante usarmos este valor corretamente pois é usado nas atualizações.
  • releasedate: Data de lançamento da versão
  • eula: O arquivo EULA
  • appdir: Diretório onde estão os arquivos da aplicação
  • docroot: Diretório para onde o alias do apache irá apontar. No caso de ZF2 é o public
  • scriptsdir: Diretório onde estão os scripts do zdpack
  • healthcheck: Caminho para o Zend Server testar se a aplicação está ok. Normalmente podemos definir como index.php.
  • updateurl: Url para atualização
  • dependencies: Os requisitos que o servidor deve ter para a aplicação funcionar corretamente. Todos serão checados durante o processo de deployment.
  • parameters: Parâmetros para o processo de deployment
  • variables: Define variáveis de ambiente para os scripts do zdpack

Os scripts do zdpack são executados numa ordem específica e você pode usar para atualizar o banco de dados, criar arquivos de configuração, enviar um email após uma atualização, etc. Dentro de cada script existe um comentário dando maiores explicações e quais variáveis estão disponíveis para ele.

  • Deploy
    • pre_stage.php: Executado logo após ser feito o upload e descompactado no servidor e antes de qualquer outra coisa
    • post_stage.php: Executado após a etapa de stage, todos os arquivos já estão no lugar, mas a aplicação ainda não é acessível via página
    • pre_activate.php: Antes de ativar a aplicação
    • post_activate.php: Final do processo de deployment. Aqui a aplicação já está toda configurada e acessível via página.
  • Rollback (lembro que a versão gratuita não oferece suporte para rollback)
    • pre_rollback.php: Executado antes de iniciar um rollback
    • post_rollback.php: Alguém arrisca? 🙂
  • Remover
    • pre_deactivate.php: Executado no início do processo de desativação da aplicação
    • post_deactivate.php: Executado após o processo, aqui a página já não é mais acessada, mas os arquivos ainda estão no servidor
    • pre_unstage.php: Início do processo de remoção da aplicação
    • post_unstage.php: Término do processo

Criando o pacote

Com tudo em ordem e configurado, podemos validar e criar nosso pacote. Saia do diretório da aplicação e execute:

leandro@iMac-de-Leandro-Silva:~/Dev/PHP$ zdpack validate ZFTutorial/deployment.xml 
Using schema:  /usr/local/zend/share/deployment.xsd 
               ZFTutorial/deployment.xml is a valid descriptor file 
leandro@iMac-de-Leandro-Silva:~/Dev/PHP$ zdpack pack ZFTutorial
src-dir is set to            : ZFTutorial/build 
scripts-dir is set to        : ZFTutorial/scripts 
package-descriptor is set to : ZFTutorial/deployment.xml 
Created ./ZFTutorial.zpk
leandro@iMac-de-Leandro-Silva:~/Dev/PHP$

Com o pacote criado, podemos entrar no Zend Server e fazer o upload do pacote.

Realizando o deployment

Vá na aba “Applications” -> Apps

1

Clique em “Deploy Application” e faça o upload do ZFTutorial.zpk

2

Selecione o nome, servidor e caminho da aplicação

3

Aceite a licença

4

Aqui ele vai fazer a validação dos pré-requisitos da aplicação

5

E pedir os campos definidos no deployment.xml

6

Em seguida, irá mostrar a tela de resumo

7

E irá começar o processo de instalação

8

Se tudo correr bem, ela esta pronta

9

E acessível pelo endereço http://<servidor>/zftutorial sem precisar mexer no apache, criar  Alias, nada, o Zend Server já faz automaticamente para você.

10

Atualizando uma aplicação

Depois de trabalharmos na nossa aplicação mais um pouco, chegou a hora de atualizarmos. O processo de criação do pacote é exatamente o mesmo, mas aumente o número da versão, senão o Zend Server vai achar que se trata da mesma versão e não vai fazer nada.

Aqui ao invés de clicarmos em “Deploy”, vamos na linha da nossa aplicação e clicamos no primeiro botão que é “Update”

1 2 3

Repare que a tela dos parâmetros já vem preenchida com os valores inseridos na instalação:

4

E o número da versão atualizado:

5 6 7 8

9

Pronto! Atualização feita.

Se formos olhar o diretório onde ele salva os arquivos, vamos encontrar nosso diretório e as versões:

root@treinamento:~# ls -l /usr/local/zend/var/apps/http/__default__/0/
total 4
drwxr-xr-x 4 zend zend 4096 Aug  6 08:17 zftutorial
root@treinamento:~# ls -l /usr/local/zend/var/apps/http/__default__/0/zftutorial/
total 8
drwxr-sr-x 8 zend zend 4096 Aug  6 08:01 0.1
drwxr-sr-x 8 zend zend 4096 Aug  6 08:17 0.2
root@treinamento:~# ls -l /usr/local/zend/var/apps/http/__default__/0/zftutorial/0.2
total 740
drwxr-sr-x 3 zend zend   4096 Aug  6 08:17 build
-rw-r--r-- 1 zend zend    342 Aug  6 08:17 composer.json
-rw-r--r-- 1 zend zend    300 Aug  6 08:17 composer.lock
-rw-r--r-- 1 zend zend 709565 Aug  6 08:17 composer.phar
drwxr-sr-x 3 zend zend   4096 Aug  6 08:17 config
drwxr-sr-x 3 zend zend   4096 Aug  6 08:17 data
-rw-r--r-- 1 zend zend   1993 Aug  6 08:17 init_autoloader.php
-rw-r--r-- 1 zend zend   1548 Aug  6 08:17 LICENSE.txt
drwxr-sr-x 3 zend zend   4096 Aug  6 08:17 module
drwxr-sr-x 6 zend zend   4096 Aug  6 08:17 public
-rw-r--r-- 1 zend zend   1759 Aug  6 08:17 README.md
drwxr-sr-x 4 zend zend   4096 Aug  6 08:17 vendor
root@treinamento:~#

 

Referências:

Parte 1 – Visão Geral

Parte 2 – Instalação e Configuração

Parte 3 – Distribuição (Deployment)

Parte 3.5 – Definir uma aplicação

Parte 4 – Métrica

Parte 5 – Eventos e Code Tracing

 

 

Até a próxima!

Leandro Silva

5 comentários sobre “Zend Server – Parte 3 – Distribuição (Deployment)

Deixe uma resposta

This site uses Akismet to reduce spam. Learn how your comment data is processed.