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 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 Slide

  3. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. 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 Slide

  9. 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 Slide

  10. Ooops.
    @nirev
    [email protected]

    View Slide

  11. 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 Slide

  12. 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 Slide

  13. 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 Slide

  14. 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 Slide

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

    View Slide

  16. 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 Slide

  17. 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 Slide

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

    View Slide

  19. 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 Slide

  20. 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 Slide

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

    View Slide

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

    View Slide

  23. 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 Slide

  24. Cluster Jenkins
    @nirev
    [email protected]

    View Slide

  25. 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 Slide

  26. 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 Slide

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

    View Slide

  28. 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 Slide

  29. Resultado final
    @nirev
    [email protected]

    View Slide

  30. 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 Slide

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

    View Slide