Deploy continuo com jenkins, codeception e zend server

124
DEPLOY CONTINUO COM JENKINS, CODECEPTION E ZEND SERVER Created by William Felipe Welter

Transcript of Deploy continuo com jenkins, codeception e zend server

Page 1: Deploy continuo com jenkins, codeception e zend server

DEPLOY CONTINUO COM JENKINS,CODECEPTION E ZEND SERVER

Created by William Felipe Welter

Page 2: Deploy continuo com jenkins, codeception e zend server

#WHOAMIWILLIAM FELIPE WELTER

Líder da equipe de inovação PHP da 4LinuxBacharel em Ciência da ComputaçãoExperiência com desenvolvimento e infraestrutura

Page 3: Deploy continuo com jenkins, codeception e zend server
Page 4: Deploy continuo com jenkins, codeception e zend server

O QUE É DEPLOY CONTINUO ?

Page 5: Deploy continuo com jenkins, codeception e zend server

CONTINOUS DEPLOY != CONTINOUSDELIVERY

Page 6: Deploy continuo com jenkins, codeception e zend server

CONTINOUS DEPLOYCommit/PushBuild PipelineDeploy

Page 7: Deploy continuo com jenkins, codeception e zend server

CONTINOUS DELIVERYCodigo "pronto" para produçãoNão necessariamente precisa realizar deploy

Page 8: Deploy continuo com jenkins, codeception e zend server

CONTINOUS DEPLOY DEPENDE DE C.DELIVERY

Commitou vai para produção !Codigo precisa estar testadoProcedimentos precisam ser automatizados

Page 9: Deploy continuo com jenkins, codeception e zend server

MAS O QUE É CONTINOUS DELIVERY?

Aplicação ser testavelCodigo sempre utilizavelPipelineAutomatizaçãoEntregas constantes!

Page 10: Deploy continuo com jenkins, codeception e zend server

MAS QUAL A VANTAGEM?Agilidade no desenvolvimentoDeploys menos "doloridos"Não podemos ter medo do Deploy!Grandes deploys = grande instabilidadeDeploys curtos = menor probabilidade de bugsAgilidade em correção de bugsNovidades constantes = Estar na frenteRapido feedback sobre novas features

Page 11: Deploy continuo com jenkins, codeception e zend server

E QUEM TRABALHA ASSIM ?AmazonFacebookYahooGoogleNetflix

Page 12: Deploy continuo com jenkins, codeception e zend server

DEVOPS

Page 13: Deploy continuo com jenkins, codeception e zend server

AGILE

Page 14: Deploy continuo com jenkins, codeception e zend server

FERRAMENTAS

Page 15: Deploy continuo com jenkins, codeception e zend server

VERSIONAMENTO/REPOSITORIO DECÓDIGO

GIT

Page 16: Deploy continuo com jenkins, codeception e zend server

FRAMEWORK DE TESTESCodeception

Page 17: Deploy continuo com jenkins, codeception e zend server

INTEGRAÇÃO CONTINUAJenkins

Page 18: Deploy continuo com jenkins, codeception e zend server

DEPLOY AUTOMATIZADOZend Server

Page 19: Deploy continuo com jenkins, codeception e zend server

MIGRAÇÕES DE BANCO DE DADOSPhinx

Page 20: Deploy continuo com jenkins, codeception e zend server

GIT

Page 21: Deploy continuo com jenkins, codeception e zend server

CRIANDO SEU REPOSITORIOLocalGitLabGitHubBitbucket

Page 22: Deploy continuo com jenkins, codeception e zend server

GITHUBRegistre-seCrie seu repositorioClone o repositorio

Page 23: Deploy continuo com jenkins, codeception e zend server
Page 24: Deploy continuo com jenkins, codeception e zend server

$ git clone https://github.com/wfelipew/phpconf2015.gitCloning into 'phpconf2015'...remote: Counting objects: 3, done.remote: Total 3 (delta 0), reused 0 (delta 0), pack­reused 0Unpacking objects: 100% (3/3), done.Checking connectivity... done.

Page 25: Deploy continuo com jenkins, codeception e zend server

DEFINIR BRANCHESDesenvolvimento -developHomologação - homologProdução - master

Page 26: Deploy continuo com jenkins, codeception e zend server

CRIANDO NOVAS BRANCHS $ git branch develop$ git checkout develop Switched to branch 'develop'$ git push origin develop Username for 'https://github.com': [email protected] for 'https://[email protected]@github.com': Total 0 (delta 0), reused 0 (delta 0)To https://github.com/wfelipew/phpconf2015.git * [new branch] develop ­> develop

Page 27: Deploy continuo com jenkins, codeception e zend server

FLUXO DE DESENVOLVIMENTONovas historias(features) -> developCorreção de bugs -> homolog -> developCada historia pode ficar em uma branch até ficar estavelNa master só pode ter codigo pronto para produção

Page 28: Deploy continuo com jenkins, codeception e zend server

CODECEPTION

Page 29: Deploy continuo com jenkins, codeception e zend server

FRAMEWORK DE TESTESUnitario - Regras de negocioAceitação - Principais fluxos de usoFuncional - Estressar fluxos de usoAPI - Aceitação/Funcional

Page 30: Deploy continuo com jenkins, codeception e zend server

COMPATIVEL COM:ZF1ZF2Symfony 2Laravel 4Laravel 5Phalcon 1Phalcon 2Doctrine 2SilexYii 1Yii 2...

Page 31: Deploy continuo com jenkins, codeception e zend server

INSTALAR:

$ wget http://codeception.com/codecept.phar

Page 32: Deploy continuo com jenkins, codeception e zend server

INICIALIZAR DIRETORIO:

$ codecept.phar bootstrap Initializing Codeception in cartCheckout/phpconf2015/src

File codeception.yml created <­ global configurationtests/unit created <­ unit teststests/unit.suite.yml written <­ unit tests suite configurationtests/functional created <­ functional teststests/functional.suite.yml written <­ functional tests suite configurationtests/acceptance created <­ acceptance teststests/acceptance.suite.yml written <­ acceptance tests suite configurationtests/_output was added to .gitignore ­­­ tests/_bootstrap.php written <­ global bootstrap fileBuilding initial Tester classesBuilding Actor classes for suites: unit, acceptance, functional ­> UnitTesterActions.php generated successfully. 0 methods added\UnitTester includes modules: Asserts, \Helper\UnitUnitTester.php created. ­> AcceptanceTesterActions.php generated successfully. 0 methods added\AcceptanceTester includes modules: PhpBrowser, \Helper\AcceptanceAcceptanceTester.php created. ­> FunctionalTesterActions.php generated successfully. 0 methods added\FunctionalTester includes modules: \Helper\FunctionalFunctionalTester.php created.

Page 33: Deploy continuo com jenkins, codeception e zend server

FunctionalTester.php created.

Bootstrap is done. Check out cartCheckout/phpconf2015/src/tests directory

Page 34: Deploy continuo com jenkins, codeception e zend server

APLICAÇÃO DE EXEMPLOAPIZF2Carrinho de compras

Page 35: Deploy continuo com jenkins, codeception e zend server

REGRAS DE NEGOCIOAdicionar itemAtualizar itemRemover itemObter um itemObter todo o carrinhoLimpar o carrinhoValor totalPersistir em sessão

Page 36: Deploy continuo com jenkins, codeception e zend server

VAMOS CODIFICAR ?

Page 37: Deploy continuo com jenkins, codeception e zend server

TDD

Page 38: Deploy continuo com jenkins, codeception e zend server

CRIAR O TESTE UNITARIO:

$ codecept generate:test unit CartTest was created in cartCheckout/phpconf2015/src/tests/unit/CartTest.php

Page 39: Deploy continuo com jenkins, codeception e zend server

CONFIGURAR ACESSO AO ZF2

# Codeception Test Suite Configuration## Suite for unit (internal) tests.

class_name: UnitTestermodules: enabled: ­ Asserts ­ \Helper\Unit ­ ZF2 ­ Asserts

unit.suite.yml

Page 40: Deploy continuo com jenkins, codeception e zend server

CONFIGURAR ACESSO AO ZF2

return array( 'modules' => array( 'Application', ), 'module_listener_options' => array( 'module_paths' => array( __DIR__ . '/../module', __DIR__ . '/../vendor', ), 'config_glob_paths' => array( __DIR__ . '/../config/autoload/,*.global,local.php', ), 'config_cache_enabled'=>false, 'module_map_cache_enabled'=>false, 'check_dependencies'=>true, ),);

application.config.php

Page 41: Deploy continuo com jenkins, codeception e zend server

CRIANDO O TESTE:

use Application\Model\CartModel;use Zend\Session\Container;

class CartTest extends \Codeception\TestCase\Test

/** * * @var \UnitTester */ protected $model;

protected function _before() $container = new Container(); $this­>model = new CartModel($container);

protected function _after() // tests

Page 42: Deploy continuo com jenkins, codeception e zend server

// tests

public function testAddItem() $item = array( 'id' => '212', 'price' => '42.42', 'qty' => 1 ); $this­>model­>addItem($item); $this­>assertInternalType("array", $this­>model­>getCart()); $this­>assertCount(1, $this­>model­>getCart());

public function testUpdateItem() $item = array( 'id' => '212', 'price' => '42.42', 'qty' => 3 ); $this­>model­>updateItem(212, $item); $this­>assertCount(1, $this­>model­>getCart()); $updatedItem = $this­>model­>getItem(212); $this­>assertEquals(3, $updatedItem['qty']);

public function testDeleteItem() $this­>model­>deleteItem(212); $this­>assertCount(0, $this­>model­>getCart()); $this­>assertArrayNotHasKey(212,$this­>model­>getCart());

Page 43: Deploy continuo com jenkins, codeception e zend server

$this­>assertArrayNotHasKey(212,$this­>model­>getCart());

public function testTotalCart() $item1 = array( 'id' => '212', 'price' => 1, 'qty' => 3 ); $item2 = array( 'id' => '32', 'price' => 5.50, 'qty' => 1 ); $this­>model­>addItem($item1); $this­>model­>addItem($item2); $this­>assertCount(2, $this­>model­>getCart()); $this­>assertEquals(8.50, $this­>model­>getTotalAmount()); public function testCleanCart() $this­>model­>cleanCart(); $this­>assertCount(0, $this­>model­>getCart());

Page 44: Deploy continuo com jenkins, codeception e zend server
Page 45: Deploy continuo com jenkins, codeception e zend server

CRIANDO A CLASSE NO ZF2

namespace Application\Model;

use Zend\Session\Container;

class CartModel

private $cart;

public function __construct(Container $cart)

public function addItem($item)

public function updateItem($id, $item)

public function deleteItem($id)

public function getItem($id)

Page 46: Deploy continuo com jenkins, codeception e zend server

public function getCart()

public function getTotalAmount()

public function cleanCart()

Page 47: Deploy continuo com jenkins, codeception e zend server

EXECUTANDO TESTES:

$ codecept.phar runCodeception PHP Testing Framework v2.1.4Powered by PHPUnit 4.8.18 by Sebastian Bergmann and contributors.Unit Tests (5) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­Test add item (CartTest::testAddItem) ErrorTest update item (CartTest::testUpdateItem) ErrorTest delete item (CartTest::testDeleteItem) ErrorTest total cart (CartTest::testTotalCart) ErrorTest clean cart (CartTest::testCleanCart) Error­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Acceptance Tests (0) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Functional Tests (0) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Time: 1,96 seconds, Memory: 21,00Mb

There were 5 errors:

Page 48: Deploy continuo com jenkins, codeception e zend server

IMPLEMENTANDO A MODEL

namespace Application\Model;

use Zend\Session\Container;

class CartModel

private $cart;

public function __construct(Container $cart) $this­>cart = $cart; if (! isset($this­>cart­>item)) $this­>cart­>item = array();

public function addItem($item) $id = $item['id']; unset($item['id']); $this­>cart­>item[$id] = $item;

public function updateItem($id, $item)

Page 49: Deploy continuo com jenkins, codeception e zend server

public function updateItem($id, $item)

unset($item['id']); $this­>cart­>item[$id] = $item;

public function deleteItem($id) unset($this­>cart­>item[$id]);

public function getItem($id) if (isset($this­>cart­>item[$id])) return $this­>cart­>item[$id]; else return false;

public function getCart() if (! $this­>cart­>item) $this­>cart­>item = array(); return $this­>cart­>item;

public function getTotalAmount() $total = 0;

Page 50: Deploy continuo com jenkins, codeception e zend server

$total = 0;

foreach ($this­>cart­>item as $item) $total += $item['price'] * $item['qty']; return $total;

public function cleanCart() $this­>cart­>item = null;

Page 51: Deploy continuo com jenkins, codeception e zend server

RODAR NOVAMENTE OS TESTES

codecept.phar runCodeception PHP Testing Framework v2.1.4Powered by PHPUnit 4.8.18 by Sebastian Bergmann and contributors.

Unit Tests (5) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­Test add item (CartTest::testAddItem) OkTest update item (CartTest::testUpdateItem) OkTest delete item (CartTest::testDeleteItem) OkTest total cart (CartTest::testTotalCart) OkTest clean cart (CartTest::testCleanCart) Ok­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Acceptance Tests (0) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Functional Tests (0) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Time: 2,96 seconds, Memory: 20,25Mb

OK (5 tests, 9 assertions)

Page 52: Deploy continuo com jenkins, codeception e zend server
Page 53: Deploy continuo com jenkins, codeception e zend server

CRIAR TESTE DE API

$ codecept.php generate:cest api Cart

Page 54: Deploy continuo com jenkins, codeception e zend server

CONFIGURANDO ACESSO AAPI/WEBSERVER/BROWSER

class_name: ApiTestermodules: enabled: ­ REST: url: http://phpconf2015.local/ depends: PhpBrowserenv: local: modules: config: PhpBrowser: url: http://phpconf2015.local/ curl: CURLOPT_TIMEOUT: 600 connect_timeout: 600 timeout: 600 REST: url: http://phpconf2015.local/ dev: modules: config:

Page 55: Deploy continuo com jenkins, codeception e zend server

config:

PhpBrowser: url: http://phpconf2015­dev.local/ curl: CURLOPT_TIMEOUT: 600 connect_timeout: 600 timeout: 600 REST: url: http://phpconf2015­dev.local/ homolog: modules: config: PhpBrowser: url: http://phpconf2015­homolog.local/ curl: CURLOPT_TIMEOUT: 600 connect_timeout: 600 timeout: 600 REST: url: http://phpconf2015­homolog.local/

api.suite.yml

Page 56: Deploy continuo com jenkins, codeception e zend server

CODIFICANDO O TESTE

use \ApiTester;

class CartCest

private $cookie;

private function getCookie() $cookie = $this­>cookie; $cookie = implode(' ', $this­>cookie); $cookie = preg_replace('/path=\//', '', $cookie); return $cookie;

public function _before(ApiTester $I) // Clean cart // $I­>sendDELETE('api/cart');

public function _after(ApiTester $I)

Page 57: Deploy continuo com jenkins, codeception e zend server

// tests public function tryToTest(ApiTester $I)

public function testAddItemCart(ApiTester $I) $I­>wantTo('Insert add item to cart'); $I­>haveHttpHeader('Content­Type', 'application/json'); $I­>sendPOST('api/cart', array( 'id' => 212, 'qty' => 3, 'price' => 3.5 )); $I­>seeResponseCodeIs(200); $I­>seeResponseIsJson(); $this­>cookie = $I­>grabHttpHeader('Set­Cookie', false);

public function testGetCart(ApiTester $I) $I­>wantTo('Get all item of a cart'); $I­>haveHttpHeader('Content­Type', 'application/json'); $I­>haveHttpHeader('Cookie', $this­>getCookie()); $I­>sendGET('api/cart'); $I­>seeResponseCodeIs(200); $I­>seeResponseIsJson(); $I­>seeResponseContainsJson(array( '212' => array(

Page 58: Deploy continuo com jenkins, codeception e zend server

'212' => array(

'qty' => 3, 'price' => 3.5 ) ));

public function testUpdateItem(ApiTester $I) $I­>wantTo('Update item on cart'); $I­>haveHttpHeader('Content­Type', 'application/json'); $I­>haveHttpHeader('Cookie', $this­>getCookie()); $I­>sendPUT('api/cart/212', array( 'id' => 212, 'qty' => 9, 'price' => 3.5 )); $I­>seeResponseCodeIs(200); $I­>seeResponseIsJson(); $I­>seeResponseContainsJson(array( '212' => array( 'qty' => 9, 'price' => 3.5 ) ));

public function testGetItem(ApiTester $I) $I­>wantTo('Get item from cart');

Page 59: Deploy continuo com jenkins, codeception e zend server

$I­>wantTo('Get item from cart');

$I­>haveHttpHeader('Content­Type', 'application/json'); $I­>haveHttpHeader('Cookie', $this­>getCookie()); $I­>sendGET('api/cart/212'); $I­>seeResponseCodeIs(200); $I­>seeResponseIsJson(); $I­>seeResponseContainsJson(array( 'qty' => 9, 'price' => 3.5 ));

public function testDeleteItem(ApiTester $I) $I­>wantTo('Remove item from cart'); $I­>haveHttpHeader('Content­Type', 'application/json'); $I­>haveHttpHeader('Cookie', $this­>getCookie()); $I­>sendDELETE('api/cart/212'); $I­>seeResponseCodeIs(200); $I­>seeResponseIsJson(); $I­>seeResponseContainsJson(array()); public function testClearCart(ApiTester $I) $I­>wantTo('Clear cart'); $I­>haveHttpHeader('Content­Type', 'application/json'); $I­>haveHttpHeader('Cookie', $this­>getCookie()); $I­>sendPOST('api/cart', array(

Page 60: Deploy continuo com jenkins, codeception e zend server

$I­>sendPOST('api/cart', array(

'id' => 212, 'qty' => 3, 'price' => 3.5 )); $I­>sendPOST('api/cart', array( 'id' => 214, 'qty' => 1, 'price' => 7.5 )); $I­>sendDELETE('api/cart'); $I­>seeResponseCodeIs(200); $I­>seeResponseIsJson(); $I­>seeResponseContainsJson(array()); public function testGetInvalidItem(ApiTester $I) $I­>wantTo('Get invalid item from cart'); $I­>haveHttpHeader('Content­Type', 'application/json'); $I­>haveHttpHeader('Cookie', $this­>getCookie()); $I­>sendGET('api/cart/500'); $I­>seeResponseCodeIs(400); $I­>seeResponseIsJson(); $I­>seeResponseContainsJson(array());

Page 61: Deploy continuo com jenkins, codeception e zend server
Page 62: Deploy continuo com jenkins, codeception e zend server

CRIANDO A CONTROLLER

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractRestfulController;use Zend\View\Model\JsonModel;

class CartController extends AbstractRestfulController

public function create($data) $cartModel = $this­>serviceLocator­>get('CartModel'); $cartModel­>addItem($data); return new JsonModel($cartModel­>getCart());

public function update($id, $data) $cartModel = $this­>serviceLocator­>get('CartModel'); $cartModel­>updateItem($id, $data); return new JsonModel($cartModel­>getCart());

public function delete($id)

Page 63: Deploy continuo com jenkins, codeception e zend server

public function delete($id)

$cartModel = $this­>serviceLocator­>get('CartModel'); $cartModel­>deleteItem($id); return new JsonModel($cartModel­>getCart());

public function get($id) $cartModel = $this­>serviceLocator­>get('CartModel'); $item = $cartModel­>getItem($id); if (!$item) $this­>response­>setStatusCode(400); $item = array(); return new JsonModel($item);

public function getList() $cartModel = $this­>serviceLocator­>get('CartModel'); $cart = $cartModel­>getCart(); return new JsonModel($cart);

public function deleteList() $cartModel = $this­>serviceLocator­>get('CartModel'); $cartModel­>cleanCart(); $cart = $cartModel­>getCart();

Page 64: Deploy continuo com jenkins, codeception e zend server

$cart = $cartModel­>getCart();

return new JsonModel($cart);

Page 65: Deploy continuo com jenkins, codeception e zend server

RODANDO O TESTE

codecept.phar runCodeception PHP Testing Framework v2.1.4Powered by PHPUnit 4.8.18 by Sebastian Bergmann and contributors.

Api Tests (9) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­Try to test (CartCest::tryToTest) OkInsert add item to cart (CartCest::testAddItemCart) OkGet all item of a cart (CartCest::testGetCart) OkUpdate item on cart (CartCest::testUpdateItem) OkGet item from cart (CartCest::testGetItem) OkRemove item from cart (CartCest::testDeleteItem) OkClear cart (CartCest::testClearCart) OkGet invalid item from cart (CartCest::testGetInvalidItem) OkPerform actions and see result (CartCept) Ok­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Unit Tests (5) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­Test add item (CartTest::testAddItem) OkTest update item (CartTest::testUpdateItem) OkTest delete item (CartTest::testDeleteItem) OkTest total cart (CartTest::testTotalCart) OkTest clean cart (CartTest::testCleanCart) Ok­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Page 66: Deploy continuo com jenkins, codeception e zend server

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Acceptance Tests (0) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Functional Tests (0) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Time: 2,96 seconds, Memory: 20,25Mb

OK (14 tests, 29 assertions)

Page 67: Deploy continuo com jenkins, codeception e zend server

DEPLOY

Page 68: Deploy continuo com jenkins, codeception e zend server

PACOTE ZPKPadronizar deployVersãoParametrizaçãoArquivos a serem deployadosRotinas a serem executadas em cada fase do deployDependenciasConfigurações de ambienteRegras de monitoramentoRegras de cacheVia webconsole ou API

Page 69: Deploy continuo com jenkins, codeception e zend server

DEPLOYMENT.XML

Page 70: Deploy continuo com jenkins, codeception e zend server

DEPLOYMENT.XML - DEPENDENCIAS

Page 71: Deploy continuo com jenkins, codeception e zend server

DEPLOYMENT.XML - ROTINAS EPARAMETRIZAÇÃO

Page 72: Deploy continuo com jenkins, codeception e zend server

REGRAS DE MONITORAMENTO

Page 73: Deploy continuo com jenkins, codeception e zend server

DEPLOY - CONSOLE WEB

Page 74: Deploy continuo com jenkins, codeception e zend server

ZSCLIENT.PHARFerrament CLI para trabalhar com APIEmpacotarDeploy.zsapi

Page 75: Deploy continuo com jenkins, codeception e zend server

OBTENDO CHAVE PARA API:

Page 76: Deploy continuo com jenkins, codeception e zend server

.ZSAPI [zend­local]zsurl = "http://localhost:10081"zskey = "admin"zssecret = "asdadaskdamdlkasmdek3mk4343k4tmrkrmfkgk556565m6k56m56k5mgrsr44kg"zsversion = "8.0"http.timeout = "300"

Page 77: Deploy continuo com jenkins, codeception e zend server

EXEMPLO zs­client.phar installApp ­­zpk=application.zpk ­­target=aws­prod ­­baseUri=

Page 78: Deploy continuo com jenkins, codeception e zend server

JENKINS

Page 79: Deploy continuo com jenkins, codeception e zend server

CI Open SourceFlexivelPluginsBuild Pipeline

Page 80: Deploy continuo com jenkins, codeception e zend server

PHP-TEMPLATETemplate para aplicações PHPANTDepende de varios pluginsDepende de algumas ferramentas PHP

Page 81: Deploy continuo com jenkins, codeception e zend server

PHP-TEMPLATEphplocphpmdphpcsphpunitphpdoxphpcbphpcpdpdepend

Page 82: Deploy continuo com jenkins, codeception e zend server

INSTALANDO

$ wget http://localhost:8080/jnlpJars/jenkins­cli.jar$ java ­jar jenkins­cli.jar ­s http://localhost:8080 install­plugin checkstyle cloverphp crap4j dry htmlpublisher jdepend plot pmd violations warnings xunit$ curl ­L https://raw.githubusercontent.com/sebastianbergmann/php­jenkins­template/master/config.xml | \ java ­jar jenkins­cli.jar ­s http://localhost:8080 create­job php­template $ java ­jar jenkins­cli.jar ­s http://localhost:8080 reload­configuration

Page 83: Deploy continuo com jenkins, codeception e zend server

BUILD.XML

<project name="phpconf2015" default="build­local"> <target name="build­local" depends="prepare,lint,package,phploc,pdepend,phpmd­ci,phpcs­ci,phpcpd,phpdox,phpcb,composer,codeception" <target name="build­develop" depends="prepare,lint,package,deploy­dev,phploc,pdepend,phpmd­ci,phpcs­ci,phpcpd,phpdox,phpcb,composer,codeception" <target name="build­homolog" depends="prepare,lint,package,deploy­homolog,phploc,pdepend,phpmd­ci,phpcs­ci,phpcpd,phpdox,phpcb,composer,codeception­homolog" <target name="build­master" depends="prepare,lint,package,deploy­prod"

<target name="build­parallel" depends="prepare,lint,tools­parallel,phpunit,phpcb"

<target name="tools­parallel" description="Run tools in parallel" <parallel threadCount="2"> <sequential> <antcall target="pdepend" /> <antcall target="phpmd­ci" /> </sequential> <antcall target="phpcpd" /> <antcall target="phpcs­ci" /> <antcall target="phploc" /> <antcall target="phpdox" /> </parallel> </target>

<target name="clean" description="Cleanup build artifacts">

Page 84: Deploy continuo com jenkins, codeception e zend server

<target name="clean" description="Cleanup build artifacts">

<delete dir="$basedir/build/api" /> <delete dir="$basedir/build/code­browser" /> <delete dir="$basedir/build/coverage" /> <delete dir="$basedir/build/logs" /> <delete dir="$basedir/build/pdepend" /> </target>

<target name="prepare" depends="clean" description="Prepare for build" <mkdir dir="$basedir/build/api" /> <mkdir dir="$basedir/build/code­browser" /> <mkdir dir="$basedir/build/coverage" /> <mkdir dir="$basedir/build/logs" /> <mkdir dir="$basedir/build/pdepend" /> <mkdir dir="$basedir/build/phpdox" />

<mkdir dir="$basedir/build/log" /> <mkdir dir="$basedir/build/cache" /> <mkdir dir="$basedir/build/tmp_certificados" /> <mkdir dir="$basedir/build/tmp_spool_swift" /> <chmod dir="$basedir/build/log" perm="777" /> <chmod dir="$basedir/build/cache" perm="777" /> <chmod dir="$basedir/build/tmp_certificados" perm="777" <chmod dir="$basedir/build/tmp_spool_swift" perm="777" </target>

<target name="lint" description="Perform syntax check of sourcecode files" <apply executable="php" failonerror="true"> <arg value="­l" />

<fileset dir="$basedir">

Page 85: Deploy continuo com jenkins, codeception e zend server

<fileset dir="$basedir">

<include name="**/*.php" /> <exclude name="src/vendor/" /> <exclude name="vendor/" /> <exclude name="vendor/*" /> <exclude name="data/generator/" /> <modified /> </fileset>

</apply> </target>

<target name="phploc" description="Measure project size using PHPLOC" <exec executable="phploc"> <arg value="­­exclude=" /> <arg value="vendor" /> <arg value="­­exclude=" /> <arg value="tests" /> <arg value="­­log­csv" /> <arg value="$basedir/build/logs/phploc.csv" <arg path="$basedir" /> </exec> </target>

<target name="pdepend" description="Calculate software metrics using PHP_Depend" <exec executable="pdepend"> <arg value="­­jdepend­xml=$basedir/build/logs/jdepend.xml" <arg value="­­jdepend­chart=$basedir/build/pdepend/dependencies.svg" <arg value="­­overview­pyramid=$basedir/build/pdepend/overview­pyramid.svg" <arg value="­­ignore=$basedir/scripts/,$basedir/src/vendor/,$basedir/src/data/"

Page 86: Deploy continuo com jenkins, codeception e zend server

<arg value="­­ignore=$basedir/scripts/,$basedir/src/vendor/,$basedir/src/data/"

<arg path="$basedir" /> </exec> </target>

<target name="phpmd" description="Perform project mess detection using PHPMD and print human readable output. Intended for usage on the command line before committing." <exec executable="phpmd"> <arg path="$basedir" /> <arg value="text" /> <arg value="$basedir/build/phpmd.xml" /> <arg value="­­exclude=$basedir/lib/vendor/,$basedir/data/,$basedir/scripts/" </exec> </target>

<target name="phpmd­ci" description="Perform project mess detection using PHPMD creating a log file for the continuous integration server" <exec executable="phpmd"> <arg path="$basedir" /> <arg value="xml" /> <arg value="$basedir/build/phpmd.xml" /> <arg value="­­reportfile" /> <arg value="$basedir/build/logs/pmd.xml" /> <arg value="­­exclude" /> <arg value="*scripts*,*vendor*,*tests*,*data*" </exec> </target>

<target name="package" description="Package with ZPK"> <exec executable="zs­client.phar" failonerror="true"> <arg value="packZpk" /> <arg value="­­folder=$basedir" /> <arg value="­­destination=$basedir" />

Page 87: Deploy continuo com jenkins, codeception e zend server

<arg value="­­destination=$basedir" />

<arg value="­­name=application.zpk" /> </exec> </target>

<target name="phpcs" description="Find coding standard violations using PHP_CodeSniffer and print human readable output. Intended for usage on the command line before committing." <exec executable="phpcs"> <arg value="­­standard=$basedir/build/phpcs.xml" <arg path="$basedir" /> <arg value="­­ignore=$basedir/tests" /> </exec> </target>

<target name="phpcs­ci" description="Find coding standard violations using PHP_CodeSniffer creating a log file for the continuous integration server" <exec executable="phpcs" output="/dev/null"> <arg value="­­extensions=php" /> <arg value="­v" /> <arg value="­­report=checkstyle" /> <arg value="­­report­file=$basedir/build/logs/checkstyle.xml" <arg value="­­standard=$basedir/build/phpcs.xml" <arg value="­­ignore=$basedir/src/vendor/,$basedir/scripts/,$basedir/src/tests/,$basedir/src/data/" <arg path="$basedir" /> </exec> </target>

<target name="phpcpd" description="Find duplicate code using PHPCPD" <exec executable="phpcpd"> <arg value="­­exclude" /> <arg value="scripts" /> <arg value="­­exclude" />

Page 88: Deploy continuo com jenkins, codeception e zend server

<arg value="­­exclude" />

<arg value="vendor" /> <arg value="­­exclude" /> <arg value="tests" /> <arg value="­­log­pmd" /> <arg value="$basedir/build/logs/pmd­cpd.xml" <arg path="$basedir" /> </exec> </target>

<target name="phpdox" description="Generate API documentation using phpDox" <exec executable="phpdox"> <arg line="­­file $basedir/build/phpdox.xml" </exec> </target>

<target name="phpunit" description="Run unit tests with PHPUnit" <exec executable="phpunit" failonerror="true" /> </target>

<target name="deploy­dev" description="Deploy on ZendServer"> <exec executable="zs­client.phar" failonerror="true"> <arg value="installApp" /> <arg value="­­zpk=$basedir/application.zpk" <arg value="­­target=zend­local" /> <arg value="­­baseUri='http://phpconf2015­dev.local/'" <arg value="­­userAppName=phpconf2015­dev" /> </exec> </target>

Page 89: Deploy continuo com jenkins, codeception e zend server

<target name="deploy­prod" description="Package with ZPK"> <exec executable="zs­client.phar" failonerror="true"> <arg value="installApp" /> <arg value="­­zpk=$basedir/application.zpk" <arg value="­­target=zend­local" /> <arg value="­­baseUri='http://phpconf2015­prod.local/'" <arg value="­­userAppName=phpconf2015­prod" /> </exec> </target> <target name="deploy­homolog" description="Package with ZPK"> <exec executable="zs­client.phar" failonerror <arg value="installApp" /> <arg value="­­zpk=$basedir/application.zpk" <arg value="­­target=zend­local" /> <arg value="­­baseUri='http://phpconf2015­homolog.local/'" <arg value="­­userAppName=phpconf2015­homolog" </exec> </target>

<target name="phpcb" description="Aggregate tool output with PHP_CodeBrowser" <exec executable="phpcb"> <arg value="­­log" /> <arg path="$basedir/build/logs" /> <arg value="­­source" /> <arg path="$basedir" /> <arg value="­­output" /> <arg path="$basedir/build/code­browser" />

Page 90: Deploy continuo com jenkins, codeception e zend server

<arg path="$basedir/build/code­browser" />

<arg value="­­exclude=" /> <arg value="*/vendor/*" /> <arg value="­­exclude=" /> <arg value="*/tests/*" /> <arg value="­­exclude=" /> <arg value="*/build/*" /> </exec> </target>

<target name="composer"> <exec executable="php" failonerror="true"> <arg line="composer.phar install ­­working­dir=$basedir/src" </exec> </target>

<target name="codeception"> <exec executable="codecept.phar" failonerror="true"> <arg line=" run ­­config=src/codeception.yml ­­env dev ­­steps ­­xml ­­html" </exec> </target> <target name="codeception­homolog"> <exec executable="codecept.phar" failonerror= <arg line=" run ­­config=src/codeception.yml ­­env homolog ­­steps ­­xml ­­html" </exec> </target>

</project>

Page 91: Deploy continuo com jenkins, codeception e zend server
Page 92: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - LINT

<target name="lint" description="Perform syntax check of sourcecode files" <apply executable="php" failonerror="true"> <arg value="­l" />

<fileset dir="$basedir"> <include name="**/*.php" /> <exclude name="src/vendor/" /> <exclude name="vendor/*" /> <exclude name="data/generator/" /> <modified /> </fileset>

</apply></target>

Page 93: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PHPLOC

<target name="phploc" description="Measure project size using PHPLOC" <exec executable="phploc"> <arg value="­­exclude=" /> <arg value="vendor" /> <arg value="­­exclude=" /> <arg value="tests" /> <arg value="­­log­csv" /> <arg value="$basedir/build/logs/phploc.csv" /> <arg path="$basedir" /> </exec></target>

Page 94: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PDEPEND

<target name="pdepend" description="Calculate software metrics using PHP_Depend" <exec executable="pdepend"> <arg value="­­jdepend­xml=$basedir/build/logs/jdepend.xml" <arg value="­­jdepend­chart=$basedir/build/pdepend/dependencies.svg" <arg value="­­overview­pyramid=$basedir/build/pdepend/overview­pyramid.svg" <arg value="­­ignore=$basedir/scripts/,$basedir/src/vendor/,$basedir/src/data/" <arg path="$basedir" /> </exec></target>

Page 95: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PHPMD-CI

<target name="phpmd­ci" description="Perform project mess detection using PHPMD creating a log file for the continuous integration server" <exec executable="phpmd"> <arg path="$basedir" /> <arg value="xml" /> <arg value="$basedir/build/phpmd.xml" /> <arg value="­­reportfile" /> <arg value="$basedir/build/logs/pmd.xml" /> <arg value="­­exclude" /> <arg value="*scripts*,*vendor*,*tests*,*data*" /> </exec></target>

Page 96: Deploy continuo com jenkins, codeception e zend server

BUILD/PHPMD.XML

<?xml version="1.0" encoding="UTF­8"?><ruleset name="Regras phpconf2015" xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema­instance" xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd" <description>Padroes a serem utilizados no phpconf2015</description

<rule ref="rulesets/codesize.xml/CyclomaticComplexity" /> <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" /> <rule ref="rulesets/codesize.xml/ExcessiveClassLength" /> <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" /> <rule ref="rulesets/codesize.xml/ExcessiveParameterList" /> <rule ref="rulesets/design.xml/GotoStatement" /> <rule ref="rulesets/design.xml/ExitExpression" /> <rule ref="rulesets/design.xml/EvalExpression" /> <rule ref="rulesets/design.xml/CouplingBetweenObjects" /> <rule ref="rulesets/design.xml/DepthOfInheritance" /> <rule ref="rulesets/design.xml/NumberOfChildren" /> <rule ref="rulesets/naming.xml/ShortMethodName" /> <rule ref="rulesets/naming.xml/BooleanGetMethodName" /> <rule ref="rulesets/controversial.xml/Superglobals" />

Page 97: Deploy continuo com jenkins, codeception e zend server

</ruleset>

Page 98: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PHPCS-CI

<target name="phpcs­ci" description="Find coding standard violations using PHP_CodeSniffer creating a log file for the continuous integration server" <exec executable="phpcs" output="/dev/null"> <arg value="­­extensions=php" /> <arg value="­v" /> <arg value="­­report=checkstyle" /> <arg value="­­report­file=$basedir/build/logs/checkstyle.xml" <arg value="­­standard=$basedir/build/phpcs.xml" /> <arg value="­­ignore=$basedir/src/vendor/,$basedir/scripts/,$basedir/src/tests/,$basedir/src/data/" <arg path="$basedir" /> </exec></target>

Page 99: Deploy continuo com jenkins, codeception e zend server

BUILD/PHPCS.XML

<?xml version="1.0" encoding="UTF­8"?><ruleset name="phpconf2015"> <description>Regras de codigo do phpconf2015</description>

<rule ref="PSR2"/> <rule ref="Generic.PHP.DisallowShortOpenTag"/> <rule ref="Generic.PHP.LowerCaseConstant"/> <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>

</ruleset>

Page 100: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PHPCPD

<target name="phpcpd" description="Find duplicate code using PHPCPD"> <exec executable="phpcpd"> <arg value="­­exclude" /> <arg value="scripts" /> <arg value="­­exclude" /> <arg value="vendor" /> <arg value="­­exclude" /> <arg value="tests" /> <arg value="­­log­pmd" /> <arg value="$basedir/build/logs/pmd­cpd.xml" /> <arg path="$basedir" /> </exec></target>

Page 101: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PHPDOX

<target name="phpdox" description="Generate API documentation using phpDox" <exec executable="phpdox"> <arg line="­­file $basedir/build/phpdox.xml" /> </exec></target>

Page 102: Deploy continuo com jenkins, codeception e zend server

BUILD/PHPDOX.XML

<?xml version="1.0" encoding="UTF­8"?><phpdox xmlns="http://xml.phpdox.net/config"> <project name="phpconf2015" source="." workdir="build/phpdox"> <collector publiconly="false"> <include mask="*.php" /> <exclude mask="*Autoload.php" /> <exclude mask="**vendor**" /> <exclude mask="**scripts**" /> <exclude mask="**build**" /> <exclude mask="**tests**" /> </collector>

<generator output="build"> <build engine="html" enabled="true" output="api"/> </generator> </project></phpdox>

Page 103: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PHPCB

<target name="phpcb" description="Aggregate tool output with PHP_CodeBrowser" <exec executable="phpcb"> <arg value="­­log" /> <arg path="$basedir/build/logs" /> <arg value="­­source" /> <arg path="$basedir" /> <arg value="­­output" /> <arg path="$basedir/build/code­browser" /> <arg value="­­exclude=" /> <arg value="*/vendor/*" /> <arg value="­­exclude=" /> <arg value="*/tests/*" /> <arg value="­­exclude=" /> <arg value="*/build/*" /> </exec></target>

Page 104: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - COMPOSER

<target name="composer"> <exec executable="php" failonerror="true"> <arg line="composer.phar install ­­working­dir=$basedir/src" </exec></target>

Page 105: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - CODECEPTION

<target name="codeception"> <exec executable="codecept.phar" failonerror="true"> <arg line=" run ­­config=src/codeception.yml ­­env dev ­­steps ­­xml ­­html" </exec></target>

Page 106: Deploy continuo com jenkins, codeception e zend server

SAIDA DO CODECEPTION

actor: Testerpaths: tests: tests log: tests/_output data: tests/_data support: tests/_support envs: tests/_envssettings: bootstrap: _bootstrap.php colors: true memory_limit: 1024M strict_xml: trueextensions: enabled: ­ Codeception\Extension\RunFailedmodules: config: Db: dsn: '' user: '' password: '' dump: tests/_data/dump.sql

Page 107: Deploy continuo com jenkins, codeception e zend server
Page 108: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - PACKAGE

<target name="package" description="Package with ZPK"> <exec executable="zs­client.phar" failonerror="true"> <arg value="packZpk" /> <arg value="­­folder=$basedir" /> <arg value="­­destination=$basedir" /> <arg value="­­name=application.zpk" /> </exec></target>

Page 109: Deploy continuo com jenkins, codeception e zend server

BUILD.XML - DEPLOY

<target name="deploy­dev" description="Deploy on ZendServer"> <exec executable="zs­client.phar" failonerror="true"> <arg value="installApp" /> <arg value="­­zpk=$basedir/application.zpk" /> <arg value="­­target=zend­local" /> <arg value="­­baseUri='http://phpconf2015­dev.local/'" <arg value="­­userAppName=phpconf2015­dev" /> </exec></target>

Page 110: Deploy continuo com jenkins, codeception e zend server
Page 111: Deploy continuo com jenkins, codeception e zend server

PHINX

Page 112: Deploy continuo com jenkins, codeception e zend server

Migrações de banco de dadosSimplesMulti-SGBD

Page 113: Deploy continuo com jenkins, codeception e zend server

INSTALAR

$ php composer.phar require robmorgan/phinx$ php composer.phar install ­­no­dev$ php vendor/bin/phinx init .

Page 114: Deploy continuo com jenkins, codeception e zend server

CONFIGURAÇÃO

paths: migrations: %%PHINX_CONFIG_DIR%%/migrations

environments: default_migration_table: phinxlog default_database: production production: adapter: pgsql host: localhost name: phpconf2015_prod user: phpconf2015_prod pass: '123456' port: 5432 charset: utf8

homolog: adapter: pgsql host: localhost name: phpconf2015_homolog user: phpconf2015_homolog pass: '123456' port: 5432 charset: utf8

Page 115: Deploy continuo com jenkins, codeception e zend server

development: adapter: pgsql host: localhost name: phpconf2015_local user: phpconf2015_local pass: '123456' port: 5432 charset: utf8

phinx.yml

Page 116: Deploy continuo com jenkins, codeception e zend server

CRIANDO UMA MIGRAÇÃO

$ php vendor/bin/phinx create AddTableOrdersPhinx by Rob Morgan ­ https://phinx.org. version 0.5.0

using config file ./phinx.ymlusing config parser yamlusing migration path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/migrationsusing seed path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/seedsusing migration base class Phinx\Migration\AbstractMigrationusing default templatecreated ./db/migrations/20151202195430_add_table_orders.php

Page 117: Deploy continuo com jenkins, codeception e zend server

EDITANDO A MIGRAÇÃO - CHANGE

use Phinx\Migration\AbstractMigration;

class AddTableOrders extends AbstractMigration public function change() $table=$this­>table('tb_orders_item'); $table­>addColumn('product_id','integer') ­>addColumn('qty','integer') ­>addColumn('price','float'); $table­>create();

db/migrations/20151202195430_add_table_orders.php

Page 118: Deploy continuo com jenkins, codeception e zend server

EDITANDO A MIGRAÇÃO - UP/DOWN

class AddTableUsers extends AbstractMigration public function up() $table = $this­>table('tb_users'); $table­>addColumn('email', 'string') ­>addColumn('password', 'string') ­>addColumn('active', 'boolean'); $table­>create(); $this­>execute("INSERT INTO tb_users(email,password,active) VALUES ('[email protected]',md5('123456'),'t')"

public function down() $table = $this­>dropTable('tb_users');

db/migrations/20151202195430_add_table_orders.php

Page 119: Deploy continuo com jenkins, codeception e zend server

APLICANDO MIGRAÇÃO

$ php vendor/bin/phinx migratePhinx by Rob Morgan ­ https://phinx.org. version 0.5.0

using config file ./phinx.ymlusing config parser yamlusing migration path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/migrationsusing seed path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/seedswarning no environment specified, defaulting to: developmentusing adapter pgsqlusing database phpconf2015

== 20151202195430 AddTableOrders: migrating == 20151202195430 AddTableOrders: migrated 0,0979s

== 20151202201703 AddTableUsers: migrating == 20151202201703 AddTableUsers: migrated 0,1120s

All Done. Took 0,2231s

Page 120: Deploy continuo com jenkins, codeception e zend server
Page 121: Deploy continuo com jenkins, codeception e zend server

CONSULTANDO ESTADO DASMIGRACÕES

$ php vendor/bin/phinx statusPhinx by Rob Morgan ­ https://phinx.org. version 0.5.0

using config file ./phinx.ymlusing config parser yamlusing migration path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/migrationsusing seed path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/seedswarning no environment specified, defaulting to: development

Status Migration ID Migration Name ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ up 20151202195430 AddTableOrders down 20151202201703 AddTableUsers

Page 122: Deploy continuo com jenkins, codeception e zend server

REVERTENDO UMA MIGRAÇÃO

$ php vendor/bin/phinx rollbackPhinx by Rob Morgan ­ https://phinx.org. version 0.5.0

using config file ./phinx.ymlusing config parser yamlusing migration path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/migrationsusing seed path /home/william­welter/Documents/area_php/apresentacoes/php_conf_2015/cartCheckout/phpconf2015/src/db/seedswarning no environment specified, defaulting to: developmentusing adapter pgsqlusing database phpconf2015

== 20151202201703 AddTableUsers: reverting == 20151202201703 AddTableUsers: reverted 0,0488s

All Done. Took 0,0622s

Page 123: Deploy continuo com jenkins, codeception e zend server

COMO AUTOMATIZAR ?Deploy Zend ServerScript preActivate

Page 124: Deploy continuo com jenkins, codeception e zend server

OBRIGADOWILLIAM FELIPE WELTER

[email protected]/IN/WILLIAMFELIPEWELTE

RGITHUB.COM/WFELIPEW