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. 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. =/
  2. Ruby • Testes • Distribuição através de gems • Sintaxe

    atrativa • Relativamente simples • Amplo ecosistema de pacotes
  3. 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!
  4. 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!") }
  5. 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.
  6. 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) } ..
  7. WTF! o que é esse _???? .. _, err :=

    db.Query("SELECT id,name FROM people;") if err != nil { panic(err) } ..
  8. 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) }
  9. 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 }
  10. 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}
  11. 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) } } }
  12. Coisas que aprendi • Standard library te deixa independente de

    packages externos • Gestão de dependência de packages não existe.
  13. Sugestões de leituras • Go at Google: Language Design in

    the Service of Software Engineering • Effective Go • Exercism