Slide 1

Slide 1 text

Building Go projects made easy with Gradle Benjamin Muschko

Slide 2

Slide 2 text

About me @bmuschko h*ps:/ /github.com/bmuschko h*p:/ /bmuschko.com

Slide 3

Slide 3 text

my WAY tO GO

Slide 4

Slide 4 text

learn by coding https://github.com/bmuschko/link-verifier

Slide 5

Slide 5 text

Typical tasks Package management Cross-compila;on of binaries Test execu;on & repor;ng Go environment setup

Slide 6

Slide 6 text

What’s out there?

Slide 7

Slide 7 text

The community is using… #!/bin/sh Make Shell Scrip;ng Build Tool What do you use?

Slide 8

Slide 8 text

The old world

Slide 9

Slide 9 text

Throwing the red flag Copy-pas;ng of code snippets Unstructured spagheE code Tes;ng through manual execu;on Only understood by build guru™

Slide 10

Slide 10 text

Why Gradle? Performant Flexible Polyglot Extensible Conven?ons Declara?ve Deep API https://gradle.org/

Slide 11

Slide 11 text

GoGradle FTW! https://github.com/gogradle/gogradle

Slide 12

Slide 12 text

distribution management

Slide 13

Slide 13 text

executing gradle without installation Gradle Wrapper

Slide 14

Slide 14 text

generated wrapper files . !"" build.gradle !"" settings.gradle !"" gradle # $"" wrapper # !"" gradle-wrapper.jar # $"" gradle-wrapper.properties !"" gradlew $"" gradlew.bat supposed to be checked into SCM

Slide 15

Slide 15 text

gradle wrapper ›_

Slide 16

Slide 16 text

Applying the gogradle plugin build.gradle plugins {
 id 'com.github.blindpirate.gogradle' version '0.8.1'
 }
 
 golang {
 packagePath = 'github.com/bmuschko/link-verifier'
 } custom plugin DSL

Slide 17

Slide 17 text

managing the Go version build.gradle golang {
 goVersion = '1.9.2'
 } downloaded and installed automatically

Slide 18

Slide 18 text

package management

Slide 19

Slide 19 text

Use revision for Reproducibility go get https://github.com/mvdan/xurls git clone https://github.com/mvdan/xurls may include vendored packages

Slide 20

Slide 20 text

go package managers godep, govendor, glide…

Slide 21

Slide 21 text

Use revision for Reproducibility glide.yaml package: .
 import:
 - package: github.com/mvdan/xurls
 version: 1.1.0
 testImport:
 - package: github.com/stretchr/testify
 version: 1.1.4
 concrete version or version ranges

Slide 22

Slide 22 text

Use revision for Reproducibility glide.lock hash: 806deb3bb1bb02051f152c49856cac37224f623247...
 updated: 2018-01-08T20:54:38.326434-07:00
 imports:
 - name: github.com/mvdan/xurls
 version: d315b61cf6727664f310fa87b3197e9faf2a8513
 testImports:
 - name: github.com/davecgh/go-spew
 version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9
 subpackages:
 - spew
 - name: github.com/pmezard/go-difflib
 version: d8ed2627bdf02c080bf22230dbb337003b7aba2d
 subpackages:
 - difflib
 - ...

Slide 23

Slide 23 text

gradle init ›_

Slide 24

Slide 24 text

Migrate package declarations dependencies {
 golang {
 build(['name':'github.com/mvdan/xurls', 'version':'d315b61cf6727664f310fa87...', 'transitive':false])
 test(['name':'github.com/davecgh/go-spew', 'version':'6d212800a42e8ab5c146b8ace...', 'subpackages':['.', 'spew'] 'transitive':false]) ...
 }
 } build.gradle configuration

Slide 25

Slide 25 text

gradle dependencies ›_

Slide 26

Slide 26 text

Dependency report in console $ gradle dependencies > Task :dependencies build: github.com/bmuschko/link-verifier \-- github.com/mvdan/xurls:d315b61 test: github.com/bmuschko/link-verifier |-- github.com/davecgh/go-spew:6d21280 [spew] |-- github.com/pmezard/go-difflib:d8ed262 [difflib] \-- github.com/stretchr/testify:69483b4 [assert]

Slide 27

Slide 27 text

gradle vendor ›_

Slide 28

Slide 28 text

Vendored packages in source tree $ tree vendor vendor $"" github.com !"" davecgh # $"" go-spew # $"" spew !"" mvdan # $"" xurls !"" pmezard # $"" go-difflib # $"" difflib $"" stretchr $"" testify !"" assert $"" doc.go

Slide 29

Slide 29 text

gradle lock ›_

Slide 30

Slide 30 text

Vendored packages in source tree ---
 apiVersion: "0.8.1"
 dependencies:
 build:
 - urls:
 - "https://github.com/mvdan/xurls.git"
 - "[email protected]:mvdan/xurls.git"
 vcs: "git"
 name: "github.com/mvdan/xurls"
 commit: "d315b61cf6727664f310fa87b3197e9faf2a8513"
 transitive: false
 test:
 - urls:
 - "https://github.com/davecgh/go-spew.git"
 - "[email protected]:davecgh/go-spew.git"
 ... gogradle.lock

Slide 31

Slide 31 text

performing verifications so-called lifecycle or aggregation task gradle check fmt coverage vet test depends on

Slide 32

Slide 32 text

test execution & reporting

Slide 33

Slide 33 text

executing tests $ gradle test > Task :test Test for github.com/bmuschko/link-verifier/http finished, 3 completed, 0 failed Test for github.com/bmuschko/link-verifier/file finished, 6 completed, 0 failed Test for github.com/bmuschko/link-verifier/stat finished, 4 completed, 0 failed Test for github.com/bmuschko/link-verifier/text finished, 8 completed, 0 failed filtering: gradle test --tests file*.go

Slide 34

Slide 34 text

test Html report .gogradle/reports/tests/index.html

Slide 35

Slide 35 text

gradle test ›_

Slide 36

Slide 36 text

code coverage

Slide 37

Slide 37 text

coverage Html report .gogradle/reports/coverage/index.html

Slide 38

Slide 38 text

coverage line details

Slide 39

Slide 39 text

gradle coverage ›_

Slide 40

Slide 40 text

gradle fmt & vet ›_

Slide 41

Slide 41 text

Linting the source code

Slide 42

Slide 42 text

calling golint from task task lint(type: com.github.blindpirate.gogradle.Go) {
 run 'golint github.com/bmuschko/link-verifier/...'
 }
 
 check.dependsOn lint build.gradle hooks into check task

Slide 43

Slide 43 text

cross-compiling binaries

Slide 44

Slide 44 text

declaring target platforms build {
 targetPlatform = ['darwin-amd64', 'netbsd-amd64', 'netbsd-386', 'openbsd-amd64', 'openbsd-386', 'freebsd-amd64', 'freebsd-386', 'linux-amd64', 'linux-386', 'linux-arm', 'windows-amd64', 'windows-386']
 } build.gradle -

Slide 45

Slide 45 text

Generated binaries $ tree .gogradle .gogradle !"" link-verifier-darwin-amd64 !"" link-verifier-freebsd-386 !"" link-verifier-freebsd-amd64 !"" link-verifier-linux-386 !"" link-verifier-linux-amd64 !"" link-verifier-linux-arm !"" link-verifier-netbsd-386 !"" link-verifier-netbsd-amd64 !"" link-verifier-openbsd-386 !"" link-verifier-openbsd-amd64 !"" link-verifier-windows-386 $"" link-verifier-windows-amd64

Slide 46

Slide 46 text

gradle build ›_

Slide 47

Slide 47 text

Resources Gradle webpage hHps:/ /gradle.org/ GoGradle plugin hHps:/ /github.com/gogradle/gogradle Link Verifier example source code hHps:/ /github.com/bmuschko/link-verifier

Slide 48

Slide 48 text

We want your feedback!

Slide 49

Slide 49 text

w Thank you