Desenvolvendo para WordPress
com Docker, Git e WP-CLI
Como construir um ambiente de desenvolvimento inteligente para um workflow mais prático e ágil
Rudá AlmeidaIntegrante da equipe de Tecnologia da Informação da UFRJ
Entusiasta do WordPress e integrante da comunidade carioca
Já palestrei e ajudei a organizar Meetups e WordCamps no Rio de Janeiro
WP-CLIUm verdadeiro canivete
suíço para o WordPress
O que éGerencia o WordPress via linha de comando
Simplifica tarefas tediosas e repetitivas
Dispensa o uso do navegador
Automação e programabilidade
Vamos ver alguns exemplos?
Instalando o WordPress “do zero”$ wp core download
$ wp core config --dbname=wordpress --dbuser=root --dbpass=wordpress
$ wp db create
$ wp core install --url=localhost --title=WordCamp --admin_user=admin --admin_password=admin [email protected] --skip-email
Gerenciando usuários$ wp user list
$ wp user update <usuario> --user_pass=<senha>
$ wp user create <username> <email> --role=administrator --user_pass=<senha>
$ wp user delete <user>
$ wp plugin list
$ wp plugin install advanced-custom-fields --activate
Instalando plugins
Atualizando o core e os plugins$ wp core update
$ wp plugin update --all
$ wp theme update --all
Para saber mais sobre WP-CLI
“Dominando o WP-CLI”, Gustavo Bordoni - WordPress Meetup RJ de junho de 2016
“WP-CLI: o WordPress na linha de comando”, Rodrigo Primo” - InterConWP 2014
“Gerenciando o WordPress com o WP-CLI”, Rodrigo Primo” - WordCamp BH 2014
Gitgit commit -m "#WCRJ16"
git push
O que éSistema de controle de versionamento
Guarda histórico das alterações nos arquivos
Permite “voltar no tempo” a pontos específicos
Permite colaboração entre um time
Descentralizado
Git é uma skill essencial para todo desenvolvedor WordPress
Git é uma skill essencial para todo desenvolvedor PHP
Git é uma skill essencial para todo desenvolvedor back-end
Git é uma skill essencial para todo desenvolvedor front-end
Git é uma skill essencial para todo desenvolvedor
Exemplo (extremamente!) básico de Git$ git init$ git add .$ git commit -m "initial commit"
(...algumas alterações aqui…)
$ git add .$ git commit -m "descrição do que mudou"$ git log
Github
Git Cheat Sheet
Git não é backup!
Git não é backup!
Git não é backup!
Para saber mais sobre Git
Uma das 76 mil questões com a tag “Git” no Stack Overflow
O livro “Pro Git”, de Scott Chacon e Ben Straub
O curso interativo “Try Git”, parceria entre Code School e Github (gratuito)
DockerÉ igual uma máquina virtual,
só que é completamente diferente.
O que éPlataforma de virtualização baseada
em contêineres
Extremamente rápido e leve em tamanho e uso de recursos
Modular e extensível
Replicabilidade e comportamento previsível
Versatilidade: a configuração do ambiente de desenvolvimento não fica mais presa à configuração da máquina local
Garantia de que desenvolvimento e produção possuem ambientes idênticos
Atualizações de pacotes na máquina local não causam interferência no ambiente de desenvolvimento.
Simplifica subir ambientes complexos em poucos comandos.
Estrutura básica da plataforma Docker
Build? Pull? Run?Imagem? Contêiner? Dockerfile?
Keep calm e lembre do boloImagem => Bolo
Dockerfile => Receita do bolo
Contêiner => Fatia do bolo
Registry / Docker Hub => Padaria
Docker build => Fazer um bolo
Docker pull => Comprar pronto
Docker run => Cortar uma fatia
Imagem: Freepik
Docker Hub
Instanciando um WordPress em contêineres$ docker pull mysql:5.7.14$ docker pull wordpress:4.5.1
$ docker run --name wp-db -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14
$ docker run --name wp --link wp-db:mysql -p 80:80 -d wordpress:4.5.1
Usando um tema na sua máquina local$ docker pull mysql:5.7.14$ docker pull wordpress:4.5.1
$ docker run --name wp-db -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14
$ docker run --name wp --link wp-db:mysql --volume /home/user/tema:/var/www/html/wp-content/themes/meutema -p 80:80 -d wordpress:4.5.1
Importando um projeto já existente$ docker pull mysql:5.7.14$ docker pull wordpress:4.5.1
$ docker run --name wp-db --volume=/home/ruda/Projetos/wordcamp/database/import:/docker-entrypoint-initdb.d -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -p 3306:3306 -d mysql:5.7.14
$ docker run --name wp --link wp-db:mysql --volume=/home/ruda/Projetos/wordcamp/wp-content:/var/www/html/wp-content -p 80:80 -d wordpress:4.5.1
...mas e o WP-CLI?
A peça que faltava$ git clone [email protected]:DockerDemos/appstack-wpcli.git
$ docker build -t wpcli appstack-wpcli
$ docker run --rm --link wp-db:mysql --volumes-from wp -w /var/www/html -it wpcli wp --allow-root <comando do wp-cli>
Vamos simplificar mais um pouco!
Um atalho para o WP-CLI dockerizado#!/bin/bash
docker run --rm --link "${1}"-db:mysql --volumes-from "${1}" -w="/var/www/html" -it wpcli wp --path=/var/www/html --allow-root "${@:2}"
DICAS
A imagem oficial do WordPress vem com opcache ativado. Alterações em arquivos PHP demoram até 60 segundos para ser reconhecidas. Para desativar o opcache, edite o arquivo /usr/local/etc/php/conf.d/opcache-recommended.ini
Contêineres perdem seus dados ao serem encerrados. Para garantir a permanência dos dados, use contêineres de volume, ou volumes da máquina hospedeira com --volume
Ao usar volumes, preste atenção às permissões das pastas e arquivos do host. Se o host usar SELinux, use ":z" no final dos caminhos.
Para rodar um contêiner em background, use -dPara visualizar os logs de um contêiner em background, use: docker logs -f <container>
Para ter acesso ao terminal dentro de um contêiner:docker exec -it <container> bash
Deixe a porta do contêiner MySQL visível para o host, dessa forma o MySQL WorkBench ou o adminer podem manipular os dados diretamente
Contêineres não são apagados ao ter sua execução interrompida (a menos que executados com a opção --rm), e devem ser apagados manualmente.
Se já existir um contêiner com o mesmo nome, o Docker se recusa a criar um novo contêiner.
Se um contêiner estiver em execução, deve ser parado manualmente para poder ser excluído.
Se ocorrer um erro na criação do conteiner, ele deve ser excluido manualmente assim mesmo
Docker Compose
...ou: decorar comandos pra quê?
O que éControla e gerencia instâncias de contêineres com base em arquivos
de configuração.
Cuida das tarefas de iniciar, reiniciar, manter executando, parar a execução, remover, e criar novamente cada contêiner
Detecta alterações nos arquivos de configuração e recria apenas o que for necessário
docker-compose up -dDocker-compose down
docker-compose.ymlversion: '2'services: database:
image: mysql:5.7.14ports:
- "3306:3306"volumes:
- "./database/import:/docker-entrypoint-initdb.d:Z"
restart: alwaysenvironment:
MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress:
depends_on: - database
image: wordpress:4.5.1links:
- database:mysqlports:
- "80:80"
volumes: - "./tema:/var/www/html/wp-content/themes/meutema:z" - "./arquivos:/var/www/html/wp-content:z"
restart: alwaysenvironment:
WORDPRESS_DB_HOST: database:3306 WORDPRESS_DB_PASSWORD: wordpress
Melhorando o atalho do WP-CLI#!/bin/bash
docker run --rm --net="${1}"_default --link "${1}"_database_1:mysql --volumes-from "${1}"_wordpress_1 -w="/var/www/html" -it wpcli wp --path=/var/www/html --allow-root "${@:2}"
Para saber mais sobre Docker
PERGUNTAS ?