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 full-size slide

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

    View full-size slide

  3. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. 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 full-size slide

  8. Como eu
    começo?

    View full-size slide

  9. Quem aqui programa no bash?

    View full-size slide

  10. 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 $@ ; exit
    package main
    import "log"
    // outro comentario aqui...
    func main() {
    log.Println("Hello, tche linux!")
    }

    View full-size slide

  11. Ficou
    parecido?
    Ficou parecido?

    View full-size slide

  12. Anatomia de um
    programa golang
    ///usr/local/bin/go run $0 $@ ; 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 full-size slide

  13. 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 full-size slide

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

    View full-size slide

  15. O compilador te obriga a programar melhor

    View full-size slide

  16. 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 full-size slide

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

    View full-size slide

  18. 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 full-size slide

  19. 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 full-size slide

  20. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide