$30 off During Our Annual Pro Sale. View Details »

Técnicas de Deploy p/ WordPress @ Meetup PHP-PB

Técnicas de Deploy p/ WordPress @ Meetup PHP-PB

Joel Jucá

April 08, 2017
Tweet

More Decks by Joel Jucá

Other Decks in Technology

Transcript

  1. Deploy com WordPress
    Por Joel Wallis Jucá

    View Slide

  2. $ whoami
    Joel Wallis Jucá
    Mentor @ Thinkful
    @joelwallis1
    joelwallis.com

    View Slide

  3. Roadmap
    O que é deploy
    Código-fonte, Con guração e Estado
    Ferramentas
    Técnicas de deploy
    Q&A

    View Slide

  4. O que é deploy?
    Deploy é uma instância de um software em
    execução.
    The Twelve-Factor App


    View Slide

  5. Tipos de deploy
    Desenvolvimento
    Produção

    View Slide

  6. Tipos de deploy
    Desenvolvimento
    Produção
    Homologação / Review
    Testes automáticos (integração contínua)
    etc.

    View Slide

  7. Deploy de desenvolvimento
    localhost
    Sistemas de cache sempre desativados
    Linters
    Debuggers
    Pro lers
    etc.

    View Slide

  8. Deploy de produção
    Online nas Interwebs
    Sem ferramentas/utilitários de desenvolvimento
    Cache ativo por padrão
    Captura de logs
    Monitoramento de processos
    etc.
    PS: Estaremos focando nesse tipo aqui.

    View Slide

  9. Código, Con guração, Estado

    View Slide

  10. Código, Con guração, Estado
    Repositório apenas p/ código-fonte

    View Slide

  11. Código, Con guração, Estado
    Repositório apenas p/ código-fonte
    Con gurações no ambiente de execução
    (variável de ambiente, arquivo de con g., etc.)

    View Slide

  12. Código, Con guração, Estado
    Repositório apenas p/ código-fonte
    Con gurações no ambiente de execução
    (variável de ambiente, arquivo de con g., etc.)
    Estado (banco + arquivos) tratados à parte

    View Slide

  13. Repositório

    View Slide

  14. Repositório
    Apenas funcionalidades

    View Slide

  15. Repositório
    Apenas funcionalidades
    Personalizável via con gurações

    View Slide

  16. Repositório
    Apenas funcionalidades
    Personalizável via con gurações
    Sem con gurações de ambiente
    (credenciais do MySQL, chaves de encriptação,
    toggles, etc.)

    View Slide

  17. Repositório
    Apenas funcionalidades
    Personalizável via con gurações
    Sem con gurações de ambiente
    (credenciais do MySQL, chaves de encriptação,
    toggles, etc.)
    Con gurações padrões/fallbacks são OK

    View Slide

  18. Con gurações

    View Slide

  19. Con gurações
    Con gurações locais/especí cas do ambiente

    View Slide

  20. Con gurações
    Con gurações locais/especí cas do ambiente
    Apontamento de serviços fundamentais
    Ex.: MySQL, servidor de SMTP, etc.

    View Slide

  21. Con gurações
    Con gurações locais/especí cas do ambiente
    Apontamento de serviços fundamentais
    Ex.: MySQL, servidor de SMTP, etc.
    Ativa e desativa funcionalidades
    Ex.: define('PAGE_CONTACT', true);

    View Slide

  22. Con gurações
    // wp-config.php
    if (file_exists(__DIR__.'/wp-config.local.php')) {
    include __DIR__.'/wp-config.local.php';
    }

    View Slide

  23. Con gurações
    // wp-config.php
    if (file_exists(__DIR__.'/wp-config.local.php')) {
    include __DIR__.'/wp-config.local.php';
    }
    // global/default/fallback settings
    foreach ([
    'DB_HOST' => 'localhost',
    'DB_NAME' => 'nomedoBD',
    'WP_DEBUG' => false,
    ] as $key => $val)
    if (!defined($key)) @define($key, $val);

    View Slide

  24. Con gurações
    // wp-config.php
    if (file_exists(__DIR__.'/wp-config.local.php')) {
    include __DIR__.'/wp-config.local.php';
    }
    // global/default/fallback settings
    foreach ([
    'DB_HOST' => 'localhost',
    'DB_NAME' => 'nomedoBD',
    'WP_DEBUG' => false,
    ] as $key => $val)
    if (!defined($key)) @define($key, $val);
    $table_prefix = $table_prefix ? $table_prefix : 'wp_';

    View Slide

  25. Con gurações
    // wp-config-sample-local.php
    // define('DB_HOST', 'localhost');
    // define('DB_NAME', 'nomedoBD');
    // define('DB_USER', 'username_here');
    // define('DB_PASSWORD', 'password_here');
    // define('DB_CHARSET', 'utf8');
    // define('DB_COLLATE', '');
    // $table_prefix = 'wp_';

    View Slide

  26. Con gurações
    // wp-config-local-sample.php
    // define('DB_HOST', 'localhost');
    // define('DB_NAME', 'nomedoBD');
    // define('DB_USER', 'username_here');
    // define('DB_PASSWORD', 'password_here');
    // define('DB_CHARSET', 'utf8');
    // define('DB_COLLATE', '');
    // $table_prefix = 'wp_';
    echo 'wp-config.local.php' >> .gitignore
    git add .gitignore wp-config.php \
    wp-config-local-sample.php

    View Slide

  27. Estado
    Tratados de forma à parte e isolada
    Isolado das operações de deploy

    View Slide

  28. Fluxo de Código vs Fluxo de Estado

    View Slide

  29. Know your tools!
    Bash (Shell script)
    SSH (Secure Shell)
    Git <3
    rsync \m/,
    sed (Stream Editor)
    Links simbólicos

    View Slide

  30. Bash
    Linguagem de script padrão em ambientes UNIX
    (Linux e macOS).
    Ó tima p/ automação de tarefas! :-)
    #!/bin/bash
    project_name='lorem-ipsum'
    project_path="${HOME}/Projects/${project_name}"
    project_remote_path="/var/www/${project_name}"
    echo 'Iniciando deploy...'

    View Slide

  31. SSH (Secure Shell)
    Conexões remotas:
    ssh [email protected]
    Não-interativa:
    #!/bin/bash
    echo 'Iniciando o deploy...'
    ssh [email protected] \
    "cd /var/www/lorem-ipsum; git pull origin master"

    View Slide

  32. Git
    DVCS mais usado no mundo.
    git-scm.com
    try.github.io

    View Slide

  33. $ rsync
    Sincroniza dois diretórios de forma recursiva.
    Semelhante ao Dropbox.
    # sync source/ and target/ recursively
    rsync -r ./source/ /tmp/target/
    PS: o Dropbox usa a librsync under the hoods.

    View Slide

  34. $ sed
    Editor de streams do UNIX. Ferramenta avançada e
    mega poderosa.
    $ echo 'Joel Wallis Jucá' | sed -E s/J/G/g
    Goel Wallis Gucá

    View Slide

  35. $ sed
    Útil para transformar dumps locais utilizáveis em
    produção:
    mysqldump 'my_project' \
    sed -E s/meu-projeto.local/meu-projeto.com/g \
    > meu-projeto.sql
    WordPress salva inúmeras URLs do ambiente de
    desenvolvimento no banco de dados, complicando a vida do
    desenvolvedor :(

    View Slide

  36. Links simbólicos
    Arquivos ou pastas "virtuais", cujo seu conteódo é na
    verdade o conteúdo de um(a) outro(a) arquivo/pasta.
    # creates a symbolic hosts file in user's home dir;
    # any change made on it will directly be stored on
    # original /etc/hosts
    ln -s /etc/hosts ~/hosts

    View Slide

  37. Técnicas
    [x] rsync
    [x] SSH + git pull
    [ ] Git no servidor ( git init --bare )
    Git bare + Git hooks

    View Slide

  38. Deploy com rsync
    Necessário instalar em ambos ambientes (local e
    destino):
    # Debian, Ubuntu, Linux Mint, elementary OS, etc.
    sudo apt-get install rsync
    # macOS comes with rsync pre-installed, but most recent
    # versions are available on Homebrew
    brew install rsync

    View Slide

  39. Deploy com rsync
    + my-project/
    +-- .git/
    +-- bin/
    +----- deploy
    +-- www/
    +----- wp-admin/
    +----- wp-content/
    +-------- uploads/
    +----- (...)
    +----- wp-config.local.php

    View Slide

  40. Deploy com rsync
    + my-project/
    +-- .git/
    +-- bin/
    +----- deploy <-- Bash script (plain-text)
    +-- www/
    +----- wp-admin/
    +----- wp-content/
    +-------- uploads/ <- Ignored by Git
    +----- (...)
    +----- wp-config.local.php <- Ignored by Git

    View Slide

  41. Deploy com rsync
    #!/bin/bash
    # file: ./bin/deploy
    # WordPress in current directory
    rsync -crz \
    --exclude='wp-content/uploads' \
    --exclude='wp-config.local.php' \
    --delete \
    ./www/ 'user@host:/path/to/project/www/'

    View Slide

  42. Deploy com rsync
    Grsync - interface grá ca para operações com rsync

    View Slide

  43. Deploy com SSH + Git
    Servidor:
    git clone [email protected]:your/your-project.git /var/www
    Máquina local:
    #!/bin/bash
    echo '-- Pushing latest commits to master'
    git push origin master
    echo '-- Pulling latest commits from server'
    ssh you@your-host 'git -C /var/www/ pull origin master'

    View Slide

  44. Deploy com SSH + Git
    Para autenticar automaticamente, sem digitar senha:
    # generate a key pair of SSH keys
    ssh-keygen -t rsa -b 4096
    # adds it to ssh-agent
    ssh-add
    # get the contents of id_rsa.pub to enter on GitHub
    cat ~/.ssh/id_rsa.pub
    # copy the output and send to GitHub (Account > SSH keys)
    # test the connection
    ssh -T [email protected]

    View Slide

  45. Deploy com Git no servidor
    No servidor:
    # starts a bare repository that works pretty much
    # like GitHub repositories (you can `git push` to them)
    git init --bare ~/my-project.git
    Na máquina local:
    # add the bare repo as a remote to your project
    git remote add server you@host:~/my-project.git
    # `git push` to your bare repo
    git push server master

    View Slide

  46. Deploy com Git no servidor
    No servidor, use the post-update hook para executar
    uma ação automaticamente após receber dados no
    repositório:
    + ~/my-project.git/
    +-- HEAD
    +-- config
    +-- (...)
    +-- hooks/
    +----- post-update <- post-update hook (Bash script)

    View Slide

  47. Perguntas?

    View Slide

  48. Mais infos
    GitHub e SSH
    Manual do GNU Bash
    The Twelve-Factor App
    Capistrano (Ruby)
    Fabric (Python)

    View Slide

  49. Obrigado! =*
    Vamos continuar a discussão:
    twitter.com/joelwallis1

    View Slide