Slide 1

Slide 1 text

Golang para DEVOPS ou um guia motivacional criar server-side apps

Slide 2

Slide 2 text

@sebawebber

Slide 3

Slide 3 text

Senta que lá vem história...

Slide 4

Slide 4 text

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. =/

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

O deploy disso é uma bosta. Sério.

Slide 7

Slide 7 text

O deploy disso é uma bosta. Sério.

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

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!

Slide 11

Slide 11 text

Como eu começo?

Slide 12

Slide 12 text

Quem aqui programa no bash?

Slide 13

Slide 13 text

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!") }

Slide 14

Slide 14 text

Ficou parecido? Ficou parecido?

Slide 15

Slide 15 text

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.

Slide 16

Slide 16 text

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) } ..

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

O compilador te obriga a programar melhor

Slide 19

Slide 19 text

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) }

Slide 20

Slide 20 text

Parser da linha de comando é fácil!

Slide 21

Slide 21 text

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 }

Slide 22

Slide 22 text

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}

Slide 23

Slide 23 text

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) } } }

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

http://github.com/umovme/dbview

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Obrigado.