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

GoLang pra DEVOPS

GoLang pra DEVOPS

Nessa [tentativa de] palestra eu tentei falar de como podemos usar golang pra criar server side apps de forma mais divertida.

Nessa palestra gostaria de explorar o uso de golang para criar scripts e programas úteis no servidor. Gostaria também de explorar algumas boas práticas de desenvolvimento, como testes, a fim de tentar apresentar uma boa estratégia de gerar programas testáveis e distribuíveis. Minha motivação para essa apresentação é a complicação de algumas linguagens de script tem para gestão de dependências.

Sebastian Webber

December 09, 2017
Tweet

More Decks by Sebastian Webber

Other Decks in Technology

Transcript

  1. Golang para
    DEVOPS
    ou um guia motivacional
    criar server-side apps

    View Slide

  2. @sebawebber

    View Slide

  3. Senta que lá vem
    história...

    View Slide

  4. BASH é legal...
    até parar pra ver que tu não tem
    como distribuir ou reutilizar código
    sem passar um pouco de trabalho.
    Ainda assim testes são um problema.
    =/

    View Slide

  5. Ruby
    ● Testes
    ● Distribuição através de gems
    ● Sintaxe atrativa
    ● Relativamente simples
    ● Amplo ecosistema de pacotes

    View Slide

  6. O deploy disso é
    uma bosta.
    Sério.

    View Slide

  7. O deploy disso é
    uma bosta.
    Sério.

    View Slide

  8. View Slide

  9. View Slide

  10. Golang
    ● Gera binários
    ● tem suporte a testes
    ● Parece ser ultra rápido
    ● Todo mundo diz que usa
    ● Tem o gopher!
    Eu precisava testar isso!

    View Slide

  11. Como eu
    começo?

    View Slide

  12. Quem aqui programa no bash?

    View Slide

  13. Alguma semelhança aqui?
    #!/bin/bash
    function log() {
    echo $(date "+%Y/%m/%d %H:%M:%S") ${*}
    }
    # outro comentario aqui...
    log "Hello, tche linux!"
    ///usr/local/bin/go run $0 [email protected] ; exit
    package main
    import "log"
    // outro comentario aqui...
    func main() {
    log.Println("Hello, tche linux!")
    }

    View Slide

  14. Ficou
    parecido?
    Ficou parecido?

    View Slide

  15. Anatomia de um
    programa golang
    ///usr/local/bin/go run $0 [email protected] ; exit
    package main
    import "log"
    // outro comentario aqui...
    func main() {
    log.Println("Hello, tche linux!")
    }
    shebang
    nome do
    package
    uso de
    bibliotecas
    externas
    comentário
    função que
    executa
    Atenção! shebang não é obrigatório.
    Ele é apenas é um artifício para rodar programas
    em Go sem ter que compilar e executar.

    View Slide

  16. Há algo em comum também
    ..
    psql -c "SELECT id,name FROM
    people;"
    if [ $? -ne 0 ]; then
    echo problema! && exit 1
    if
    ..
    ..
    _, err := db.Query("SELECT id,name
    FROM people;")
    if err != nil {
    panic(err)
    }
    ..

    View Slide

  17. WTF! o que é esse _????
    ..
    _, err := db.Query("SELECT
    id,name FROM people;")
    if err != nil {
    panic(err)
    }
    ..

    View Slide

  18. O compilador te obriga a programar melhor

    View Slide

  19. Parser da linha de
    comando é fácil!
    package main
    import (
    "flag"
    "fmt"
    )
    func main() {
    name := flag.String("name", "John Do", "You
    name")
    flag.Parse()
    fmt.Printf("Hello, %s!\n", *name)
    }

    View Slide

  20. Parser da linha de
    comando é fácil!

    View Slide

  21. Suporte a testes
    // checkIfDatabaseExists connects in the database server and checks if
    database exists
    func checkIfDatabaseExists(connDetail ConnectionDetails, dbName string)
    (found bool, err error) {
    var db *sql.DB
    if db, err = connect(connDetail); err != nil {
    return
    }
    defer db.Close()
    totalRows := 0
    if err = db.QueryRow("SELECT count(1) FROM pg_database WHERE datname =
    $1", dbName).Scan(&totalRows); err != nil {
    return
    }
    found = (totalRows > 0)
    return
    }

    View Slide

  22. Suporte a testes
    func TestCheckIfDatabaseExists(t *testing.T) {
    var testCases = []struct {
    description string
    dbName string
    expected bool
    }{
    {"Test on a existing database", "template1", true},
    {"Test on a existing empty database", "", false},
    {"Test on a non existing database",
    "missing_db_from_server_125126616_1", false},
    }
    dbConnectionInfo := ConnectionDetails{
    Username: "seba",
    Database: "seba",
    SslMode: "disable",
    Port: 5432}

    View Slide

  23. Suporte a testes
    for _, tc := range testCases {
    t.Name()
    t.Log(tc.description)
    found, _ := checkIfDatabaseExists(dbConnectionInfo, tc.dbName)
    if found != tc.expected {
    t.Errorf("Expected %v got %v", found, tc.expected)
    }
    }
    }

    View Slide

  24. builds
    multi-plataforma
    mesmo código pode rodar no
    windows, mac e linux!

    View Slide

  25. Automação dos
    builds no github
    https://goreleaser.com/

    View Slide

  26. http://github.com/umovme/dbview

    View Slide

  27. Coisas que
    aprendi
    ● Standard library te deixa
    independente de packages
    externos
    ● Gestão de dependência de
    packages não existe.

    View Slide

  28. Sugestões de
    leituras
    ● Go at Google: Language
    Design in the Service of
    Software Engineering
    ● Effective Go
    ● Exercism

    View Slide

  29. Obrigado.

    View Slide