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.

Avatar for Sebastian Webber

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