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

Continuous Delivery com Jenkins e Watir

Continuous Delivery com Jenkins e Watir

Descrição de como melhoramos nosso processo de deploy ao integrar os testes de aceitação com Watir no pipeline do Jenkins, com um tempo de execução adequado.

Guilherme de Maio, nirev

September 14, 2013
Tweet

More Decks by Guilherme de Maio, nirev

Other Decks in Programming

Transcript

  1. Continuous Delivery
    com Jenkins e Watir
    Guilherme Nogueira - Software Craftsman @ Elo7
    31º Encontro GURU-SP - 14/09/2013
    @nirev - [email protected]

    View full-size slide

  2. O que é a Elo7?
    @nirev
    [email protected]
    Plataforma de compra e venda de artesanato
    Maior marketplace de artesanato da América Latina
    Mais de:
    ·
    ·
    ·
    105 mil artesães
    1,7 milhões de produtos
    1,5 buscas por segundo
    7,8 milhões de visitas/mês
    60 milhões de pageviews/mês
    -
    -
    -
    -
    -
    Dados: Dez/2012

    View full-size slide

  3. Continuous Delivery
    Desenvolvimento constante
    Builds regulares
    Testes automatizados
    Sempre pronto para deploy
    @nirev
    [email protected]

    View full-size slide

  4. Ambiente inicial
    @nirev
    [email protected]
    Código no github
    ·
    master
    production
    features
    ·
    ·
    ·

    View full-size slide

  5. Ambiente inicial
    Integração Contínua com Hudson
    @nirev
    [email protected]

    View full-size slide

  6. E o Deploy...
    The BADGER explosion on April 18, 1953, Nevada Test Site. Fed. Gov. USA

    View full-size slide

  7. Primeiros testes de aceitação
    Funcionou!
    Mas...
    @nirev
    [email protected]
    Selenium IDE
    Competição quem faz mais testes por Sprint
    ·
    ·
    Montamos uma suite pequena rapidamente
    Pegou vários bugs antes de ir pra produção
    ·
    ·

    View full-size slide

  8. Problemas
    Execução manual =(
    Difícil de escrever testes modulares
    Timeout para encontrar elementos na página
    Testes falhando sem sabermos o porquê..
    @nirev
    [email protected]

    View full-size slide

  9. Watir, pronounced water, is an open-
    source (BSD) family of Ruby libraries for
    automating web browsers. It allows you
    to write tests that are easy to read and
    maintain. It is simple and flexible.


    watir.com

    View full-size slide

  10. Testes com Watir e Rspec
    @nirev
    [email protected]
    r
    e
    q
    u
    i
    r
    e "
    r
    u
    b
    y
    g
    e
    m
    s
    "
    r
    e
    q
    u
    i
    r
    e "
    r
    s
    p
    e
    c
    "
    r
    e
    q
    u
    i
    r
    e "
    w
    a
    t
    i
    r
    -
    w
    e
    b
    d
    r
    i
    v
    e
    r
    "
    d
    e
    s
    c
    r
    i
    b
    e "
    g
    o
    o
    g
    l
    e
    .
    c
    o
    m
    " d
    o
    l
    e
    t
    (
    :
    b
    r
    o
    w
    s
    e
    r
    ) { @
    b
    r
    o
    w
    s
    e
    r |
    |
    = W
    a
    t
    i
    r
    :
    :
    B
    r
    o
    w
    s
    e
    r
    .
    n
    e
    w :
    f
    i
    r
    e
    f
    o
    x }
    b
    e
    f
    o
    r
    e { b
    r
    o
    w
    s
    e
    r
    .
    g
    o
    t
    o "
    h
    t
    t
    p
    :
    /
    /
    g
    o
    o
    g
    l
    e
    .
    c
    o
    m
    " }
    a
    f
    t
    e
    r { b
    r
    o
    w
    s
    e
    r
    .
    c
    l
    o
    s
    e }
    i
    t "
    s
    h
    o
    u
    l
    d s
    e
    a
    r
    c
    h f
    o
    r w
    a
    t
    i
    r
    " d
    o
    b
    r
    o
    w
    s
    e
    r
    .
    t
    e
    x
    t
    _
    f
    i
    e
    l
    d
    (
    :
    n
    a
    m
    e =
    > "
    q
    "
    )
    .
    s
    e
    t "
    w
    a
    t
    i
    r
    "
    b
    r
    o
    w
    s
    e
    r
    .
    b
    u
    t
    t
    o
    n
    .
    c
    l
    i
    c
    k
    b
    r
    o
    w
    s
    e
    r
    .
    d
    i
    v
    (
    :
    i
    d =
    > "
    r
    e
    s
    u
    l
    t
    S
    t
    a
    t
    s
    "
    )
    .
    w
    a
    i
    t
    _
    u
    n
    t
    i
    l
    _
    p
    r
    e
    s
    e
    n
    t
    b
    r
    o
    w
    s
    e
    r
    .
    t
    i
    t
    l
    e
    .
    s
    h
    o
    u
    l
    d =
    = "
    w
    a
    t
    i
    r - G
    o
    o
    g
    l
    e S
    e
    a
    r
    c
    h
    "
    e
    n
    d
    e
    n
    d
    R
    U
    B
    Y

    View full-size slide

  11. Passando todos os testes de Selenium pra Watir
    @nirev
    [email protected]
    $ b
    u
    n
    d
    l
    e e
    x
    e
    c r
    a
    k
    e s
    p
    e
    c
    [
    r
    u
    n
    _
    a
    c
    c
    e
    p
    t
    a
    n
    c
    e
    _
    t
    e
    s
    t
    s
    ] r
    u
    n
    n
    i
    n
    g t
    e
    s
    t
    s
    :
    .
    /
    c
    r
    e
    a
    t
    e
    _
    p
    r
    o
    d
    u
    c
    t
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    r
    e
    g
    i
    s
    t
    e
    r
    _
    a
    s
    _
    s
    e
    l
    l
    e
    r
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    r
    e
    g
    i
    s
    t
    e
    r
    _
    a
    s
    _
    b
    u
    y
    e
    r
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    s
    t
    o
    r
    e
    _
    i
    m
    a
    g
    e
    s
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    s
    e
    a
    r
    c
    h
    i
    n
    g
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    d
    e
    t
    e
    c
    t
    _
    n
    o
    n
    _
    s
    s
    l
    _
    c
    o
    m
    p
    o
    n
    e
    n
    t
    s
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    a
    l
    b
    u
    m
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    f
    a
    v
    o
    r
    i
    t
    e
    s
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    f
    e
    a
    t
    u
    r
    e
    d
    _
    s
    u
    b
    s
    c
    r
    i
    p
    t
    i
    o
    n
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    c
    a
    r
    t
    _
    s
    p
    e
    c
    .
    r
    b
    .
    /
    b
    u
    y
    _
    p
    r
    o
    d
    u
    c
    t
    _
    s
    p
    e
    c
    .
    r
    b
    $ g
    r
    e
    p '
    i
    t "
    ' *
    .
    r
    b | w
    c -
    l
    7
    4

    View full-size slide

  12. Passando todos os testes de Selenium pra Watir
    Helpers para ações comuns
    @nirev
    [email protected]
    d
    e
    f c
    r
    e
    a
    t
    e
    _
    a
    l
    b
    u
    m a
    t
    t
    r
    i
    b
    u
    t
    e
    s
    a
    t
    t
    r
    i
    b
    u
    t
    e
    s = {
    n
    a
    m
    e
    : "
    N
    e
    w a
    l
    b
    u
    m
    "
    , i
    m
    g
    : "
    .
    .
    /
    r
    e
    s
    /
    u
    s
    e
    r
    _
    p
    i
    c
    .
    j
    p
    g
    "
    }
    .
    m
    e
    r
    g
    e a
    t
    t
    r
    i
    b
    u
    t
    e
    s
    @
    b
    r
    o
    w
    s
    e
    r
    .
    f
    i
    l
    e
    _
    f
    i
    e
    l
    d
    (
    n
    a
    m
    e
    : "
    i
    m
    a
    g
    e
    F
    i
    l
    e
    "
    )
    .
    s
    e
    t F
    i
    l
    e
    .
    e
    x
    p
    a
    n
    d
    _
    p
    a
    t
    h a
    t
    t
    r
    i
    b
    u
    t
    e
    s
    [
    :
    i
    m
    g
    ]
    @
    b
    r
    o
    w
    s
    e
    r
    .
    t
    e
    x
    t
    _
    f
    i
    e
    l
    d
    (
    n
    a
    m
    e
    : "
    a
    l
    b
    u
    m
    N
    a
    m
    e
    "
    )
    .
    w
    h
    e
    n
    _
    p
    r
    e
    s
    e
    n
    t
    .
    s
    e
    t a
    t
    t
    r
    i
    b
    u
    t
    e
    s
    [
    :
    n
    a
    m
    e
    ]
    @
    b
    r
    o
    w
    s
    e
    r
    .
    b
    u
    t
    t
    o
    n
    (
    i
    d
    : "
    c
    r
    e
    a
    t
    e
    -
    a
    l
    b
    u
    m
    -
    s
    u
    b
    m
    i
    t
    "
    )
    .
    w
    h
    e
    n
    _
    p
    r
    e
    s
    e
    n
    t
    .
    c
    l
    i
    c
    k
    e
    n
    d
    d
    e
    f r
    e
    g
    i
    s
    t
    e
    r
    _
    n
    e
    w
    _
    u
    s
    e
    r f
    u
    l
    l
    _
    n
    a
    m
    e
    , e
    m
    a
    i
    l
    , b
    i
    r
    t
    h
    _
    d
    a
    t
    e
    , p
    a
    s
    s
    w
    d
    , p
    a
    s
    s
    w
    d
    _
    c
    o
    n
    f
    i
    r
    m
    @
    b
    r
    o
    w
    s
    e
    r
    .
    t
    e
    x
    t
    _
    f
    i
    e
    l
    d
    (
    :
    i
    d =
    > "
    f
    u
    l
    l
    N
    a
    m
    e
    "
    )
    .
    w
    h
    e
    n
    _
    p
    r
    e
    s
    e
    n
    t
    .
    s
    e
    t f
    u
    l
    l
    _
    n
    a
    m
    e
    @
    b
    r
    o
    w
    s
    e
    r
    .
    t
    e
    x
    t
    _
    f
    i
    e
    l
    d
    (
    :
    i
    d =
    > "
    e
    m
    a
    i
    l
    "
    )
    .
    w
    h
    e
    n
    _
    p
    r
    e
    s
    e
    n
    t
    .
    s
    e
    t e
    m
    a
    i
    l
    .
    .
    .
    @
    b
    r
    o
    w
    s
    e
    r
    .
    b
    u
    t
    t
    o
    n
    (
    :
    i
    d =
    > "
    s
    u
    b
    m
    i
    t
    B
    u
    t
    t
    o
    n
    "
    )
    .
    w
    h
    e
    n
    _
    p
    r
    e
    s
    e
    n
    t
    .
    c
    l
    i
    c
    k
    e
    n
    d
    R
    U
    B
    Y

    View full-size slide

  13. Passando todos os testes de Selenium pra Watir
    Tempo pra rodar tudo: 15-20 min
    @nirev
    [email protected]

    View full-size slide

  14. Aumentando a cobertura de aceitação
    Também passamos a usar o Joaquim
    @nirev
    [email protected]
    $ g
    r
    e
    p '
    i
    t "
    ' *
    .
    r
    b | w
    c -
    l
    1
    3
    2

    View full-size slide

  15. Deploy longo, novamente.
    30 min+ pra passar tudo aceitação, sem erros
    Com erros, retry local, baby-sitting: a tarde inteira =(
    @nirev
    [email protected]
    Erros de timeout
    Retries infinitos
    ·
    ·

    View full-size slide

  16. Peraí! O que queremos?
    Pipeline desenvolvimento
    Pipeline deploy
    Metas:
    @nirev
    [email protected]
    Testes de Aceitação: 10 min
    Pipeline deploy: 20 - 30 min
    ·
    ·

    View full-size slide

  17. Melhorando o tempo do teste de aceitação
    Resolver erros de Timeout
    Testes devem rodar em paralelo
    Reduzir o tempo dos maiores testes
    @nirev
    [email protected]

    View full-size slide

  18. Erros de Timeout
    Estudo:
    Conclusão:
    @nirev
    [email protected]
    Vários browsers: firefox, chrome, phantomjs
    Máquina maior para o ambiente de integração
    Máquina maior para o Joaquim
    ·
    ·
    ·
    O problema era a máquina de CI.
    ·

    View full-size slide

  19. Erros de Timeout
    Solução:
    @nirev
    [email protected]
    Criar slaves num cluster do Jenkins, exclusivos para rodar os testes de
    aceitação.
    ·

    View full-size slide

  20. Cluster Jenkins
    Jenkins -> Manage nodes -> Add node
    @nirev
    [email protected]

    View full-size slide

  21. Cluster Jenkins
    Custo: c1.medium
    # Nodes Ligada 100% Ligada apenas em Horas de Trabalho
    1 $ 106.14 $ 49.88
    2 $ 212.28 $ 99.76
    3 $ 318.42 $ 149.64
    4 $ 424.56 $ 199.52
    @nirev
    [email protected]

    View full-size slide

  22. Testes em paralelo
    Problema:
    @nirev
    [email protected]
    A maioria dos testes utilizava um usuário padrão pra tomar certas ações e
    modificavam o estado dessa conta.
    Foi mais fácil de criar os testes no começo, mas impede que eles sejam
    executados em paralelo
    ·
    ·

    View full-size slide

  23. Testes em paralelo
    Solução:
    @nirev
    [email protected]
    Todo teste deve criar suas depêndencias antes de ser executado. E só deve utilizar o que foi criado.
    ·
    d
    e
    s
    c
    r
    i
    b
    e "
    P
    r
    o
    d
    u
    c
    t C
    r
    e
    a
    t
    i
    o
    n
    " d
    o
    l
    e
    t
    (
    :
    s
    e
    l
    l
    e
    r
    ) { U
    s
    e
    r
    .
    c
    r
    e
    a
    t
    e
    _
    s
    e
    l
    l
    e
    r }
    b
    e
    f
    o
    r
    e :
    a
    l
    l d
    o
    @
    t
    e
    s
    t
    _
    h
    e
    l
    p
    e
    r = M
    a
    r
    k
    e
    t
    P
    l
    a
    c
    e
    T
    e
    s
    t
    H
    e
    l
    p
    e
    r
    .
    s
    t
    a
    r
    t
    !
    @
    t
    e
    s
    t
    _
    h
    e
    l
    p
    e
    r
    .
    l
    o
    g
    i
    n s
    e
    l
    l
    e
    r
    .
    e
    m
    a
    i
    l
    , s
    e
    l
    l
    e
    r
    .
    p
    a
    s
    s
    w
    o
    r
    d
    _
    p
    l
    a
    i
    n
    e
    n
    d
    .
    .
    .
    a
    f
    t
    e
    r :
    a
    l
    l d
    o
    s
    e
    l
    l
    e
    r
    .
    d
    e
    s
    t
    r
    o
    y
    @
    t
    e
    s
    t
    _
    h
    e
    l
    p
    e
    r
    .
    f
    i
    n
    i
    s
    h
    !
    e
    n
    d
    R
    U
    B
    Y

    View full-size slide

  24. Testes longos demorando muito
    Problema:
    @nirev
    [email protected]
    Testes com muitos casos, que precisam de várias condições iniciais
    diferentes, demoram muito
    ·

    View full-size slide

  25. Testes longos demorando muito
    Solução:
    Resultado:
    @nirev
    [email protected]
    Criar depêndencias utilizando ActiveRecord, e só fazer a aceitação do que
    interessa.
    ·
    Redução média de 50% do tempo
    ·

    View full-size slide

  26. Recapitulando
    @nirev
    [email protected]
    Definição de metas para o pipeline
    Construção de testes auto-contidos
    Utilização do site apenas para o que é do escopo do teste. As dependências
    podem ser criadas por fora.
    Mais de uma instância do browser rodando na mesma máquina
    normalmente causa problemas.
    O tempo de execução é inverso à sua quantidade de slaves.
    Cultura de deploys!

    View full-size slide

  27. Obrigado!
    Blog técnico Elo7: craftedbits.wordpress.com
    @nirev
    [email protected]

    View full-size slide