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.

6f3efd5477238ca18957c723854ec795?s=128

Sebastian Webber

December 09, 2017
Tweet

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.