$30 off During Our Annual Pro Sale. View Details »

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

  2. @sebawebber

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

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

    atrativa • Relativamente simples • Amplo ecosistema de pacotes
  6. O deploy disso é uma bosta. Sério.

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

  8. None
  9. None
  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!
  11. Como eu começo?

  12. Quem aqui programa no bash?

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

  15. 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.
  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) } ..
  17. WTF! o que é esse _???? .. _, err :=

    db.Query("SELECT id,name FROM people;") if err != nil { panic(err) } ..
  18. O compilador te obriga a programar melhor

  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) }
  20. Parser da linha de comando é fácil!

  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 }
  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}
  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) } } }
  24. builds multi-plataforma mesmo código pode rodar no windows, mac e

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

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

  27. Coisas que aprendi • Standard library te deixa independente de

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

    the Service of Software Engineering • Effective Go • Exercism
  29. Obrigado.