Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scripts de build e servidores de CI para Mobile e Web

Scripts de build e servidores de CI para Mobile e Web

Palestra realizada no 2º DevDay da comunidade de TI de Jaraguá do Sul.

Ione Souza Junior

May 19, 2018
Tweet

More Decks by Ione Souza Junior

Other Decks in Technology

Transcript

  1. Scripts de build e
    servidores de CI para
    Mobile e Web
    Você nunca mais vai querer executar
    qualquer tarefa de forma manual
    Ione Souza Junior

    View full-size slide

  2. Apresentação
    Ione Souza Junior
    Desenvolvedor Mobile@Unimestre
    ❤ Xamarin
    @ionixjunior
    [email protected]

    View full-size slide

  3. O que veremos na apresentação?

    View full-size slide

  4. O que veremos na apresentação?
    → Um estudo de caso sobre como foi realizado a
    entrega de um app para diversos clientes
    → Discutir as dificuldades encontradas
    → Mostrar as soluções adotadas (mobile e web)

    View full-size slide

  5. Parte 1 - O aplicativo

    View full-size slide

  6. Parte 1 - O aplicativo
    → Era uma vez um ERP...
    → Um app foi desenvolvido integrado ao sistema
    → App foi publicado, os clientes começaram a usar
    o app, até que...

    View full-size slide

  7. Parte 1 - O aplicativo
    → Alguns clientes se demonstraram um pouco
    vaidosos
    → Eles queriam um app próprio, publicado com seu
    nome e sua logo

    View full-size slide

  8. E agora, o que fazer?

    View full-size slide

  9. Muitas foram as ideias, alternativas, mas...
    O que realmente precisava ser feito?

    View full-size slide

  10. O que realmente precisava ser feito?
    → Alterar drawables Android
    → Alterar resources iOS
    → Alterar AndroidManifest.xml
    → Alterar Info.plist
    → Alterar Entitlements.plist

    View full-size slide

  11. O que realmente precisava ser feito?
    → Alterar constantes - classe C#
    → Alterar styles - resource dictionary

    View full-size slide

  12. Solução: criar um script de build
    Mas como isso funciona??

    View full-size slide

  13. Iniciamos com um script simples que
    alterava as imagens dos clientes

    View full-size slide

  14. Mas antes, foi necessário
    padronizar algumas coisas...

    View full-size slide

  15. Padronizações - parte I
    → Criamos uma pasta para armazenar as imagens
    específicas de cada cliente

    View full-size slide

  16. Padronizações - parte I
    Solução
    └─── Core
    └─── Droid
    └─── iOS
    └─── Build
    │ └─── script.sh
    │ └─── Clientes
    │ └─── Cliente1
    │ │ └─── Droid
    │ │ │ └─── arquivo1.png
    │ │ │ └─── arquivo2.png
    │ │ │
    │ │ └─── iOS
    │ │ └─── arquivo1.png
    │ │ └─── arquivo2.png
    │ │
    │ └─── Cliente2
    │ └─── ...

    View full-size slide

  17. Início do script
    #!/bin/bash
    # ./Build/script.sh
    SOLUTION_DIR=/diretorio/projeto
    CLIENTE=Cliente1

    View full-size slide

  18. Início do script
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    CLIENTE=Cliente1
    cp ORIGEM DESTINO

    View full-size slide

  19. Início do script
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    CLIENTE=Cliente1
    cp $SOLUTION_DIR/Build/Clientes/$CLIENTE/Droid/Resources/drawable/*.png

    View full-size slide

  20. Início do script
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    CLIENTE=Cliente1
    cp $SOLUTION_DIR/Build/Clientes/$CLIENTE/Droid/Resources/drawable/*.png \
    $SOLUTION_DIR/Droid/Resources/drawable/

    View full-size slide

  21. Início do script
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    CLIENTE=Cliente1
    cp $SOLUTION_DIR/Build/Clientes/$CLIENTE/Droid/Resources/drawable/*.png \
    $SOLUTION_DIR/Droid/Resources/drawable/
    cp $SOLUTION_DIR/Build/Clientes/$CLIENTE/iOS/Resources/*.png \
    $SOLUTION_DIR/iOS/Resources/

    View full-size slide

  22. O que realmente precisava ser feito?


    Alterar drawables Android


    Alterar resources iOS
    → Alterar AndroidManifest.xml
    → Alterar Info.plist
    → Alterar Entitlements.plist

    View full-size slide

  23. Continuação do script...
    → Alterar atributos do AndroidManifest.xml
    → android:label
    → android:versionName
    → package

    View full-size slide

  24. Continuação do script -
    AndroidManifest.xml

    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionName="1.4"
    package="com.ionixjunior.app"
    android:versionCode="4"
    >









    View full-size slide

  25. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed

    View full-size slide

  26. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed 's'

    View full-size slide

  27. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed 's/SEARCH/REPLACE/'

    View full-size slide

  28. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed 's#SEARCH#REPLACE#'

    View full-size slide

  29. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed 's%SEARCH%REPLACE%'

    View full-size slide

  30. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed 's/SEARCH/REPLACE/'

    View full-size slide

  31. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed 's/SEARCH/REPLACE/' ARQUIVO_DESTINO

    View full-size slide

  32. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed 's/REGEX_SEARCH/REGEX_REPLACE/' ARQUIVO_DESTINO

    View full-size slide

  33. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    sed -i '' 's/REGEX_SEARCH/REGEX_REPLACE/' ARQUIVO_DESTINO
    !

    View full-size slide

  34. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    MANIFEST=$SOLUTION_DIR/Droid/Properties/AndroidManifest.xml
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp

    View full-size slide

  35. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    MANIFEST=$SOLUTION_DIR/Droid/Properties/AndroidManifest.xml
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    sed -i '' 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $MANIFEST

    View full-size slide

  36. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    MANIFEST=$SOLUTION_DIR/Droid/Properties/AndroidManifest.xml
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    sed -i '' 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $MANIFEST
    sed -i '' 's/android:label="[a-zA-Zà-úÀ-Ú0-9 ]*"/android:label="'"$APP_NAME"'"/' $MANIFEST

    View full-size slide

  37. Continuação do script -
    AndroidManifest.xml
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    MANIFEST=$SOLUTION_DIR/Droid/Properties/AndroidManifest.xml
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    sed -i '' 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $MANIFEST
    sed -i '' 's/android:label="[a-zA-Zà-úÀ-Ú0-9 ]*"/android:label="'"$APP_NAME"'"/' $MANIFEST
    sed -i '' 's/package="[a-zA-Z.]*"/package="'$PACKAGE'"/' $MANIFEST
    !

    View full-size slide

  38. O que realmente precisava ser feito?


    Alterar drawables Android


    Alterar resources iOS


    Alterar AndroidManifest.xml
    → Alterar Info.plist
    → Alterar Entitlements.plist

    View full-size slide

  39. Continuação do script...
    → Alterar atributos do Info.plist
    → CFBundleIdentifier
    → CFBundleName
    → CFBundleShortVersionString

    View full-size slide

  40. Continuação do script - Info.plist

    "-//Apple//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"
    >


    CFBundleIdentifier
    com.ionixjunior.app
    CFBundleName
    Ionix App
    CFBundleShortVersionString
    1.4


    View full-size slide

  41. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp

    View full-size slide

  42. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil

    View full-size slide

  43. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil -replace

    View full-size slide

  44. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil -replace CFBundleIdentifier

    View full-size slide

  45. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil -replace CFBundleIdentifier -string

    View full-size slide

  46. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil -replace CFBundleIdentifier -string $PACKAGE

    View full-size slide

  47. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil -replace CFBundleIdentifier -string $PACKAGE $INFO_PLIST

    View full-size slide

  48. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil -replace CFBundleIdentifier -string $PACKAGE $INFO_PLIST
    plutil -replace CFBundleName -string $APP_NAME $INFO_PLIST

    View full-size slide

  49. Continuação do script - Info.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    plutil -replace CFBundleIdentifier -string $PACKAGE $INFO_PLIST
    plutil -replace CFBundleName -string $APP_NAME $INFO_PLIST
    plutil -replace CFBundleShortVersionString -string $VERSION_NAME $INFO_PLIST

    View full-size slide

  50. O que realmente precisava ser feito?


    Alterar drawables Android


    Alterar resources iOS


    Alterar AndroidManifest.xml


    Alterar Info.plist
    → Alterar Entitlements.plist

    View full-size slide

  51. Continuação do script...
    → Alterar atributos do Entitlements.plist
    → aps-environment

    View full-size slide

  52. Continuação do script - Entitlements.plist

    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"
    >


    aps-environment
    development


    View full-size slide

  53. Continuação do script - Entitlements.plist
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    ENTITLEMENTS_PLIST=$SOLUTION_DIR/iOS/Entitlements.plist
    APS_ENVIRONMENT=production
    plutil -replace aps-environment -string $APS_ENVIRONMENT $ENTITLEMENTS_PLIST

    View full-size slide

  54. O que realmente precisava ser feito?


    Alterar drawables Android


    Alterar resources iOS


    Alterar AndroidManifest.xml


    Alterar Info.plist


    Alterar Entitlements.plist
    Mas ainda não acabou...

    View full-size slide

  55. O que realmente precisava ser feito?
    → Alterar constantes - classe C#
    → Alterar styles - resource dictionary

    View full-size slide

  56. Continuação do script - constantes
    public static class AppConfig
    {
    public const string ApiUrl = "https://homol.app.com";
    }

    View full-size slide

  57. Continuação do script - constantes
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_CONFIG=$SOLUTION_DIR/Core/AppConfig.cs
    API_URL=https://prod.app.com
    sed -i '' 's#ApiUrl = "[a-z:./]*"#ApiUrl = "'$API_URL'"#' $APP_CONFIG

    View full-size slide

  58. O que realmente precisava ser feito?


    Alterar constantes - classe C#
    → Alterar styles - resource dictionary

    View full-size slide

  59. Continuação do script - styles - resource
    dictionary

    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="Core.App"
    >


    #3F51B5
    #F90000



    View full-size slide

  60. Continuação do script - styles - resource
    dictionary
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_XAML=$SOLUTION_DIR/Core/App.xaml
    PRIMARY_COLOR=Green
    SECONDARY_COLOR=#0000FF
    sed -i '' 's/"PrimaryColor">[a-zA-Z0-9#]*"PrimaryColor">'$PRIMARY_COLOR'' $APP_XAML
    sed -i '' 's/"SecondaryColor">[a-zA-Z0-9#]*"SecondaryColor">'$SECONDARY_COLOR'' $APP_XAML

    View full-size slide

  61. O que realmente precisava ser feito?


    Alterar constantes - classe C#


    Alterar styles - resource dictionary
    !

    View full-size slide

  62. Pensa que acabou?

    View full-size slide

  63. Pensa que acabou?
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    CLIENTE=Cliente1
    MANIFEST=$SOLUTION_DIR/Droid/Properties/AndroidManifest.xml
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    ENTITLEMENTS_PLIST=$SOLUTION_DIR/iOS/Entitlements.plist
    APP_CONFIG=$SOLUTION_DIR/Core/AppConfig.cs
    API_URL=https://prod.app.com
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    ...
    O que tem de "errado"?

    View full-size slide

  64. Pensa que acabou?
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    CLIENTE=Cliente1
    MANIFEST=$SOLUTION_DIR/Droid/Properties/AndroidManifest.xml
    INFO_PLIST=$SOLUTION_DIR/iOS/Info.plist
    ENTITLEMENTS_PLIST=$SOLUTION_DIR/iOS/Entitlements.plist
    APP_CONFIG=$SOLUTION_DIR/Core/AppConfig.cs
    API_URL=https://prod.app.com
    VERSION_NAME=1.5
    APP_NAME=Ionix App Corp
    PACKAGE=com.ionix.corp
    ...
    As variáveis estão fixas no script

    View full-size slide

  65. Aqui começa a loucura...

    View full-size slide

  66. Padronizações - parte II
    → Criamos um arquivo para armazenar as variáveis
    do build
    # ./Build/app.ini
    CLIENTE = Cliente1
    API_URL = https://prod.app.com
    VERSION_NAME = 1.5
    APP_NAME = Ionix App Corp
    PACKAGE = com.ionix.corp

    View full-size slide

  67. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=

    View full-size slide

  68. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$()

    View full-size slide

  69. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI)
    # Vai mostrar o conteúdo de todo o arquivo...

    View full-size slide

  70. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = ")
    # CLIENTE = Cliente1

    View full-size slide

  71. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = " | awk)
    #

    View full-size slide

  72. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = " | awk '{print $0}')
    # CLIENTE = Cliente1

    View full-size slide

  73. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = " | awk '{print $1}')
    # CLIENTE

    View full-size slide

  74. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = " | awk '{print $2}')
    # =

    View full-size slide

  75. Padronizações - parte II
    → No script principal, carregamos estas variáveis...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = " | awk '{print $3}')
    # Cliente1

    View full-size slide

  76. Padronizações - parte II
    → Outro exemplo...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    APP_NAME=

    View full-size slide

  77. Padronizações - parte II
    → Outro exemplo...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    APP_NAME=$(cat $APP_INI)

    View full-size slide

  78. Padronizações - parte II
    → Outro exemplo...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    APP_NAME=$(cat $APP_INI | grep "APP_NAME = ")
    # APP_NAME = Ionix App Corp

    View full-size slide

  79. Padronizações - parte II
    → Outro exemplo...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    APP_NAME=$(cat $APP_INI | grep "APP_NAME = " | awk '{print $3}')
    # Ionix
    Está faltando coisa aí...

    View full-size slide

  80. Padronizações - parte II
    → Vamos revisar...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    APP_NAME=$(cat $APP_INI | grep "APP_NAME = " | awk '{print $0}')
    # APP_NAME = Ionix App Corp

    View full-size slide

  81. Padronizações - parte II
    → Vamos revisar...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    APP_NAME=$(cat $APP_INI | grep "APP_NAME = " | awk '{print $3 " " $4 " " $5}')
    # Ionix App Corp

    View full-size slide

  82. Padronizações - parte II
    → Como deixar isso dinâmico??
    ... awk '{print $3 " " $4 " " $5}'
    # Ionix App Corp

    View full-size slide

  83. Padronizações - parte II
    → Como deixar isso dinâmico??
    ... awk '{ {out=$3} }'
    # APP_NAME = Ionix App Corp
    # out = Ionix

    View full-size slide

  84. Padronizações - parte II
    → Como deixar isso dinâmico??
    ... awk '{ {out=$3}; for (i=4; i <= NF; i++) { } }'
    # APP_NAME = Ionix App Corp
    # out = Ionix
    # NF = number of fields = 5

    View full-size slide

  85. Padronizações - parte II
    → Como deixar isso dinâmico??
    ... awk '{ {out=$3}; for (i=4; i <= NF; i++) { out=out" "$i } }'
    # APP_NAME = Ionix App Corp
    # out = Ionix
    # out = Ionix App
    # out = Ionix App Corp

    View full-size slide

  86. Padronizações - parte II
    → Como deixar isso dinâmico??
    ... awk '{{out=$3; for(i=4; i<=NF; i++) { out=out" "$i }; print out}}'
    # Ionix App Corp
    !

    View full-size slide

  87. Padronizações - parte II
    → Outro exemplo...
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    APP_INI=$SOLUTION_DIR/Build/app.ini
    MANIFEST = $SOLUTION_DIR/Droid/Properties/AndroidManifest.xml
    INFO_PLIST = $SOLUTION_DIR/iOS/Info.plist
    ENTITLEMENTS_PLIST = $SOLUTION_DIR/iOS/Entitlements.plist
    APP_CONFIG = $SOLUTION_DIR/Core/AppConfig.cs
    CLIENTE = $(cat $APP_INI | grep "CLIENTE = " | awk '{print $3}')
    API_URL = $(cat $APP_INI | grep "API_URL = " | awk '{print $3}')
    VERSION_NAME = $(cat $APP_INI | grep "VERSION_NAME = " | awk '{print $3}')
    APP_NAME = $(cat $APP_INI | grep "APP_NAME = " | awk '{{out=$3; for(i=4;i<=NF;i++){out=out" "$i}; print out}}')
    PACKAGE = $(cat $APP_INI | grep "PACKAGE = " | awk '{print $3}')

    View full-size slide

  88. E para o Windows? Tem??

    View full-size slide

  89. Tem que criar o .bat

    View full-size slide

  90. Isso é automatizado?

    View full-size slide

  91. Não, mas vamos melhorar...
    vamos configurar na IDE

    View full-size slide

  92. Script
    → Ajustes no $SOLUTION_DIR
    #!/bin/bash
    SOLUTION_DIR=/diretorio/projeto
    ...

    View full-size slide

  93. Script
    → Ajustes no $SOLUTION_DIR
    #!/bin/bash
    SOLUTION_DIR=$1
    ...

    View full-size slide

  94. Isso sempre vai executar
    na minha máquina?

    View full-size slide

  95. Calma, agora que tudo vai ficar mais legal...
    Vamos integrar ao CI server

    View full-size slide

  96. Visual Studio App Center

    View full-size slide

  97. Visual Studio App Center
    → Muito fácil de usar
    → Ideal para quem está iniciando no mundo
    DevOps
    → Poucos cliques e os problemas estão resolvidos

    View full-size slide

  98. Visual Studio App Center
    → Build
    → UI Test
    → Distribuir para grupos de testes e lojas
    → Diagnóstico de erros
    → Analytics
    → Push

    View full-size slide

  99. Configurando o build

    View full-size slide

  100. Configurando o
    build
    → Conectar o repositório

    View full-size slide

  101. Configurando o
    build
    → Escolher o projeto

    View full-size slide

  102. Configurando o
    build
    → Branches serão listados

    View full-size slide

  103. Configurando o
    build
    → Configurar os branches

    View full-size slide

  104. Configurando o
    build
    → Configurar os branches

    View full-size slide

  105. Configurando o
    build
    → Configurar os branches

    View full-size slide

  106. Mas como nosso script
    lê as variáveis do App Center?

    View full-size slide

  107. Como nosso script lê as variáveis do App
    Center?
    → Customizações precisaram ser feitas...

    View full-size slide

  108. Padronizações - parte III
    → O app.ini não deve ser versionado
    → Então podemos verificar se ele existe no script...

    View full-size slide

  109. Padronizações - parte III
    #!/bin/bash
    # Script antes
    SOLUTION_DIR=$1
    APP_INI=$SOLUTION_DIR/Build/app.ini
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = " | awk '{print $3}')

    View full-size slide

  110. Padronizações - parte III
    #!/bin/bash
    # Script depois :)
    SOLUTION_DIR=$1
    APP_INI=$SOLUTION_DIR/Build/app.ini
    if [ -e "$APP_INI" ]
    then
    CLIENTE=$(cat $APP_INI | grep "CLIENTE = " | awk '{print $3}')
    else
    # Não precisa fazer nada, as variáveis já foram setadas :)
    fi

    View full-size slide

  111. Padronizações - parte III
    → Ainda falta deixar dinâmico o $SOLUTION_DIR...
    → O App Center também tem suas próprias
    variáveis de ambiente

    View full-size slide

  112. Padronizações - parte III
    #!/bin/bash
    # Script antes
    SOLUTION_DIR=$1

    View full-size slide

  113. Padronizações - parte III
    #!/bin/bash
    # Script depois :)
    if [ -n "$1" ]
    then
    SOLUTION_DIR=$1
    else
    SOLUTION_DIR=$APPCENTER_SOURCE_DIRECTORY
    fi

    View full-size slide

  114. Padronizações - parte III
    → O App Center não vai achar esse script sozinho
    → É necessário criar o script post-clone / pre-
    build / post-build

    View full-size slide

  115. Padronizações
    - parte III
    Solução
    └─── Build
    └─── Droid
    │ └─── appcenter-post-clone.sh
    │ └─── appcenter-pre-build.sh
    │ └─── appcenter-post-build.sh
    └─── iOS
    └─── appcenter-post-clone.sh
    └─── appcenter-pre-build.sh
    └─── appcenter-post-build.sh

    View full-size slide

  116. Padronizações - parte III
    #!/usr/bin/env bash
    # Droid/appcenter-pre-build.sh
    # iOS/appcenter-pre-build.sh
    sh $APPCENTER_SOURCE_DIRECTORY/Build/script.sh
    !

    View full-size slide

  117. Parte 2 - O web server

    View full-size slide

  118. Parte 2 - O web server
    → Backend em PHP
    → Gitlab.com -> CI e CD ❤

    View full-size slide

  119. O que automatizamos no
    build do web server?

    View full-size slide

  120. O que automatizamos no build do web
    server?
    → Ferramentas de QA (PHPMD, PHPCS, PHPCPD,
    PHPUnit)
    → Documentação da API
    → Deploy

    View full-size slide

  121. Configurar isso no
    Gitlab.com é muito fácil

    View full-size slide

  122. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    image: php:7.1
    cache:
    paths:
    - vendor/
    - node_modules/
    stages:
    - qa
    - test
    - doc
    - deploy
    #...

    View full-size slide

  123. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    phpmd:
    stage: qa
    only:
    - develop
    script:
    - apt-get update -yqq
    - apt-get install -yqq git
    - php composer.phar install --dev --no-plugins --no-scripts
    - vendor/bin/phpmd module/ text phpmd_ruleset.xml
    #...

    View full-size slide

  124. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    phpcpd:
    stage: qa
    only:
    - develop
    script:
    - apt-get update -yqq
    - apt-get install -yqq git
    - php composer.phar install --dev --no-plugins --no-scripts
    - vendor/bin/phpcpd --min-tokens=30 /module
    #...

    View full-size slide

  125. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    phpcs:
    stage: qa
    only:
    - develop
    script:
    - apt-get update -yqq
    - apt-get install -yqq git
    - php composer.phar install --dev --no-plugins --no-scripts
    - vendor/bin/phpcs --standard=phpcs_ruleset.xml module/
    #...

    View full-size slide

  126. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    modulo-application:
    stage: test
    only:
    - develop
    script:
    - apt-get update -yqq
    - apt-get install -yqq libsqlite3-dev git
    - pecl install xdebug
    - docker-php-ext-enable xdebug
    - docker-php-ext-install pdo_sqlite
    - php composer.phar install --no-plugins --no-scripts
    - vendor/bin/doctrine-module orm:schema-tool:drop --force
    - vendor/bin/doctrine-module orm:schema-tool:create
    - vendor/bin/phpunit -c phpunit.xml.dist --testsuite Application
    #...

    View full-size slide

  127. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    modulo-integracao:
    stage: test
    only:
    - develop
    script:
    - apt-get update -yqq
    - apt-get install -yqq libsqlite3-dev git
    - pecl install xdebug
    - docker-php-ext-enable xdebug
    - docker-php-ext-install pdo_sqlite
    - php composer.phar install --no-plugins --no-scripts
    - vendor/bin/doctrine-module orm:schema-tool:drop --force
    - vendor/bin/doctrine-module orm:schema-tool:create
    - vendor/bin/phpunit -c phpunit.xml.dist --testsuite Integracao
    #...

    View full-size slide

  128. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    modulo-mobile:
    stage: test
    only:
    - develop
    script:
    - apt-get update -yqq
    - apt-get install -yqq libsqlite3-dev git
    - pecl install xdebug
    - docker-php-ext-enable xdebug
    - docker-php-ext-install pdo_sqlite
    - php composer.phar install --no-plugins --no-scripts
    - vendor/bin/doctrine-module orm:schema-tool:drop --force
    - vendor/bin/doctrine-module orm:schema-tool:create
    - vendor/bin/phpunit -c phpunit.xml.dist --testsuite Mobile
    #...

    View full-size slide

  129. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    modulo-cli:
    stage: test
    only:
    - develop
    script:
    - apt-get update -yqq
    - apt-get install -yqq libsqlite3-dev git
    - pecl install xdebug
    - docker-php-ext-enable xdebug
    - docker-php-ext-install pdo_sqlite
    - php composer.phar install --no-plugins --no-scripts
    - vendor/bin/doctrine-module orm:schema-tool:drop --force
    - vendor/bin/doctrine-module orm:schema-tool:create
    - vendor/bin/phpunit -c phpunit.xml.dist --testsuite Cli
    #...

    View full-size slide

  130. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    integracao:
    stage: doc
    only:
    - develop
    - master
    script:
    - curl -sL https://deb.nodesource.com/setup_6.x | bash -
    - apt-get install -y nodejs
    - npm install
    - nodejs node_modules/apidoc/bin/apidoc -i module/ -o build/integracao

    View full-size slide

  131. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    homologacao:
    stage: deploy
    artifacts:
    paths:
    - build/projeto/
    environment:
    name: homologacao
    only:
    - develop
    script:
    # Transfere os arquivos para o servidor de homologação
    # São apenas comandos (ssh, scp, rsync...) :)
    #...

    View full-size slide

  132. Configurar isso no Gitlab.com é muito fácil
    # .gitlab-ci.yml
    #...
    producao:
    stage: deploy
    when: manual
    artifacts:
    paths:
    - build/projeto/
    environment:
    name: producao
    only:
    - master
    script:
    # Transfere os arquivos para o servidor de produção
    # São apenas comandos (ssh, scp, rsync...) :)
    #...

    View full-size slide

  133. E isso gera o pipeline

    View full-size slide

  134. Quer conhecer mais sobre ferramentas de QA?
    → https://phpqa.io
    → https://speakerdeck.com/ionixjunior =>
    Mantendo seu software sob controle

    View full-size slide

  135. Na palestra de hoje vimos que...
    → É possível compilar um app de forma dinâmica
    → É possível fazer integração e deploy contínuo,
    tanto no mobile quanto no web server
    → Você vai se encher de repetir as mesmas tarefas
    → Precisamos fazer a máquina trabalhar mais
    → Automatização é tudo

    View full-size slide

  136. Ione Souza Junior
    Desenvolvedor Mobile @ Unimestre
    @ionixjunior
    [email protected]

    View full-size slide