Skip to content

Versionando binarios en Go

Posted on:September 11, 2021 at 01:30 PM

Table of Contents

Open Table of Contents

Introducción

En este artículo aprenderemos como añadir una versión a nuestros binarios en Go usando un archivo Makefile y un paquete de terceros para imprimir nuestro logo en código ASCII.

Tener una versión en nuestros binarios es muy importante ya que con esto podríamos saber que versión de nuestra aplicación estamos corriendo en producción, además nuestros usuarios podrían reportar errores para versiones específicas y así poder corregirlas.

Makefile para crear el binario y añadir versión

# Get version from git hash
git_hash := $(shell git rev-parse --short HEAD || echo 'development')

# Get current date
current_time = $(shell date +"%Y-%m-%d:T%H:%M:%S")

# Add linker flags
linker_flags = '-s -X main.buildTime=${current_time} -X main.version=${git_hash}'

# Build binaries for current OS and Linux
.PHONY:
build:
	@echo "Building binaries..."
	go build -ldflags=${linker_flags} -o=./bin/binver ./main.go
	GOOS=linux GOARCH=amd64 go build -ldflags=${linker_flags} -o=./bin/linux_amd64/binver ./main.go

Después de esto únicamente necesitaremos ejecutar el comando make build desde nuestra terminal para crear el binario con su respectiva versión.

Crear el archivo main en Go

package main

import (
	"flag"
	"fmt"
	"os"

	"github.com/morikuni/aec"
)

var (
	buildTime string
	version   string
)

const binverFigletStr = `
_     _
| |__ (_)_ ____   _____ _ __
| '_ \| | '_ \ \ / / _ \ '__|
| |_) | | | | \ V /  __/ |
|_.__/|_|_| |_|\_/ \___|_|
`

func printASCIIArt() {
	binverLogo := aec.LightGreenF.Apply(binverFigletStr)
	fmt.Println(binverLogo)
}

func main() {
	displayVersion := flag.Bool("version", false, "Display version and exit")

	flag.Parse()

	if *displayVersion {
		printASCIIArt()
		fmt.Printf("Version:\t%s\n", version)
		fmt.Printf("Build time:\t%s\n", buildTime)
		os.Exit(0)
	}
}

Repositorio y video

Si deseas ver el código completo o el video donde explico como hacerlo paso a paso te dejo aquí los links: