Build for all gccgo-supported platforms by default, disable those which you don't want (bagop with CGo support).

bagccgop

Build for all gccgo-supported platforms by default, disable those which you don't want (bagop with CGo support).

hydrun CI Matrix Binary Downloads

Overview

bagccgop is a simple build tool for Go which tries to build your app for all platforms supported by gccgo by default. Instead of manually adding specific GOOSes and GOARCHes, bagccgop builds for all valid targets by default, and gives you the choice to disable those which you don't want to support or which can't be supported. It is a variant of bagop which uses gccgo instead of gc, the default Go compiler, and as such it does not intend to replace bagop, but instead tries to give a similar user experience for Go apps which rely on CGo or target platforms which are only supported by gccgo (such as 32-bit PowerPC).

Installation

Static binaries are available on GitHub releases.

You can install them like so:

$ curl -L -o /tmp/bagccgop "https://github.com/pojntfx/bagccgop/releases/latest/download/bagccgop.linux-$(uname -m)"
$ sudo install /tmp/bagccgop /usr/local/bin

Usage

Let's assume we have a Go app called hello-world and we want to build it for as many platforms as possible using bagccgop. This is the main.go:

package main

// #include <stdio.h>
//
// void print_using_c(char* s) {
//   printf("%s\n", s);
// }
import "C"

func main() {
	C.print_using_c(C.CString("Hello, world!"))
}

As you can see, it includes C code. It can be compiled like so:

$ go build -o out/hello-world main.go
$ file out/*
out/hello-world: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=bd2259005fcb565f71b26181762eeecaefe0bc31, for GNU/Linux 3.2.0, not stripped

But as we try to cross-compile, we start to get errors:

$ GOARCH=riscv64 go build -o out/hello-world main.go
package command-line-arguments: build constraints exclude all Go files in /home/pojntfx/Projects/hello-world
$ CGO_ENABLED=1 GOARCH=riscv64 go build -o out/hello-world main.go
# runtime/cgo
gcc_riscv64.S: Assembler messages:
gcc_riscv64.S:15: Error: no such instruction: `sd x1,-200(sp)'
gcc_riscv64.S:16: Error: no such instruction: `addi sp,sp,-200'
gcc_riscv64.S:17: Error: no such instruction: `sd x8,8(sp)'
gcc_riscv64.S:18: Error: no such instruction: `sd x9,16(sp)'
# ...

This is because in order to use C code in Go, we have to use CGo, which requires a C compiler for the specified GOOS and GOARCH. bagccgo simplifies this process. To use it, we first create an interactive shell in of the base images using hydrun:

$ hydrun -o ghcr.io/pojntfx/bagccgop-base-sid -e '--privileged' -i bash
2021/10/24 19:03:37 /usr/bin/docker inspect ghcr.io/pojntfx/bagccgop-base-sid-amd64
2021/10/24 19:03:37 /usr/bin/docker run -it -v /home/pojntfx/Projects/hello-world:/data:z --platform linux/amd64 --privileged ghcr.io/pojntfx/bagccgop-base-bullseye /bin/sh -c cd /data && bash
root@bed49fc87e96:/data#

We now have a temporary shell which we can use to cross-compile. There are currently two convenience images available; ghcr.io/pojntfx/bagccgop-base-bullseye, which is based on Debian 11 (Bullseye), and ghcr.io/pojntfx/bagccgop-base-sid, which is based on Debian Unstable. It is recommended to always use the former; the latter might have broken multi-architecture packages, but is more up-to-date. Note that for architectures which are only available as Debian ports (linux/alpha, linux/ppc, linux/ppc64, linux/sparc64 and linux/riscv64), Debian Unstable is the only option. You may alternatively also use the host system and set up the chroots there; see prepare_chroots and the Dockerfiles for instructions.

In the next step, let's install bagccgop inside the shell:

$ curl -L -o /tmp/bagccgop "https://github.com/pojntfx/bagccgop/releases/latest/download/bagccgop.linux-$(uname -m)"
$ install /tmp/bagccgop /usr/local/bin

You can now start the cross-compilation process:

$ bagccgop -j "$(nproc)" -b hello-world main.go
2021/10/24 17:15:01 building linux/arm (out/hello-world.linux-armv6l)
2021/10/24 17:15:01 building linux/alpha (out/hello-world.linux-alpha)
2021/10/24 17:15:01 building linux/sparc64 (out/hello-world.linux-sparc64)
2021/10/24 17:15:01 building linux/ppc (out/hello-world.linux-powerpc)
2021/10/24 17:15:01 building linux/amd64 (out/hello-world.linux-x86_64)
2021/10/24 17:15:01 building linux/ppc64 (out/hello-world.linux-ppc64)
2021/10/24 17:15:01 building linux/arm64 (out/hello-world.linux-aarch64)
2021/10/24 17:15:01 building linux/riscv64 (out/hello-world.linux-riscv64)
2021/10/24 17:15:02 building linux/arm (out/hello-world.linux-armv7l)
2021/10/24 17:15:03 building linux/386 (out/hello-world.linux-i686)
2021/10/24 17:15:03 building linux/mipsle (out/hello-world.linux-mips)
2021/10/24 17:15:03 building linux/mips64le (out/hello-world.linux-mips64)
2021/10/24 17:15:03 building linux/ppc64le (out/hello-world.linux-ppc64le)
2021/10/24 17:15:03 building linux/s390x (out/hello-world.linux-s390x)
2021/10/24 17:15:04 could not build for platform linux/alpha: err=could not install packages: err=exit status 2, stdout=, stderr=# command-line-arguments
cgo: cannot load DWARF output from $WORK/b001//_cgo_.o: applyRelocations: not implemented

As you can see, we get an error for the linux/alpha platform. We decide we don't want to support linux/alpha, so let's re-run the command with these platforms disabled:

$ bagccgop -j "$(nproc)" -b hello-world -x '(linux/alpha)' main.go
2021/10/24 17:16:06 building linux/arm (out/hello-world.linux-armv6l)
2021/10/24 17:16:06 building linux/ppc64 (out/hello-world.linux-ppc64)
2021/10/24 17:16:06 building linux/sparc64 (out/hello-world.linux-sparc64)
2021/10/24 17:16:06 building linux/ppc (out/hello-world.linux-powerpc)
2021/10/24 17:16:06 building linux/amd64 (out/hello-world.linux-x86_64)
2021/10/24 17:16:06 skipping linux/alpha (platform matched the provided regex)
2021/10/24 17:16:06 building linux/arm64 (out/hello-world.linux-aarch64)
2021/10/24 17:16:06 building linux/arm (out/hello-world.linux-armv7l)
2021/10/24 17:16:06 building linux/riscv64 (out/hello-world.linux-riscv64)
2021/10/24 17:16:07 building linux/386 (out/hello-world.linux-i686)
2021/10/24 17:16:07 building linux/mipsle (out/hello-world.linux-mips)
2021/10/24 17:16:07 building linux/mips64le (out/hello-world.linux-mips64)
2021/10/24 17:16:08 building linux/ppc64le (out/hello-world.linux-ppc64le)
2021/10/24 17:16:08 building linux/s390x (out/hello-world.linux-s390x)

If we now check the out directory, we can see that we now have successfully built binaries for all supported platforms:

$ file out/*
out/hello-world.linux-aarch64: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with debug_info, not stripped
out/hello-world.linux-armv6l:  ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-armv7l:  ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-i686:    ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-mips:    ELF 32-bit LSB pie executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-mips64:  ELF 64-bit LSB pie executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter /lib64/ld.so.1, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-powerpc: ELF 32-bit MSB pie executable, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-ppc64:   ELF 64-bit MSB pie executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.1, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-ppc64le: ELF 64-bit LSB pie executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.2, for GNU/Linux 3.10.0, with debug_info, not stripped
out/hello-world.linux-riscv64: ELF 64-bit LSB pie executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped
out/hello-world.linux-s390x:   ELF 64-bit MSB pie executable, IBM S/390, version 1 (SYSV), dynamically linked, interpreter /lib/ld64.so.1, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-sparc64: ELF 64-bit MSB pie executable, SPARC V9, relaxed memory ordering, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-x86_64:  ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped

Now, let's a few compiler flags to make the build binaries fully static; we can do this by setting the GOFLAGS env variable:

$ GOFLAGS='-gccgoflags=-static' bagccgop -j "$(nproc)" -b hello-world -x '(linux/alpha)' main.go
2021/10/24 17:18:00 building linux/arm (out/hello-world.linux-armv6l)
2021/10/24 17:18:00 building linux/sparc64 (out/hello-world.linux-sparc64)
2021/10/24 17:18:00 building linux/ppc (out/hello-world.linux-powerpc)
2021/10/24 17:18:00 skipping linux/alpha (platform matched the provided regex)
2021/10/24 17:18:00 building linux/arm (out/hello-world.linux-armv7l)
2021/10/24 17:18:00 building linux/ppc64 (out/hello-world.linux-ppc64)
2021/10/24 17:18:00 building linux/amd64 (out/hello-world.linux-x86_64)
2021/10/24 17:18:00 building linux/riscv64 (out/hello-world.linux-riscv64)
2021/10/24 17:18:00 building linux/arm64 (out/hello-world.linux-aarch64)
2021/10/24 17:18:02 building linux/386 (out/hello-world.linux-i686)
2021/10/24 17:18:03 building linux/mipsle (out/hello-world.linux-mips)
2021/10/24 17:18:03 building linux/mips64le (out/hello-world.linux-mips64)
2021/10/24 17:18:03 building linux/ppc64le (out/hello-world.linux-ppc64le)
2021/10/24 17:18:03 building linux/s390x (out/hello-world.linux-s390x)

If we now check the output again, you can see that the binaries are now fully static:

$ file out/*
out/hello-world.linux-aarch64: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.7.0, with debug_info, not stripped
out/hello-world.linux-armv6l:  ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-armv7l:  ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-i686:    ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-mips:    ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-mips64:  ELF 64-bit LSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-powerpc: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-ppc64:   ELF 64-bit MSB executable, 64-bit PowerPC or cisco 7500, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-ppc64le: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.10.0, with debug_info, not stripped
out/hello-world.linux-riscv64: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, for GNU/Linux 4.15.0, with debug_info, not stripped
out/hello-world.linux-s390x:   ELF 64-bit MSB executable, IBM S/390, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-sparc64: ELF 64-bit MSB executable, SPARC V9, Sun UltraSPARC1 Extensions Required, relaxed memory ordering, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
out/hello-world.linux-x86_64:  ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped

🚀 That's it! We've successfully added support for most Debian ports to this app.

If you're enjoying bagccgop, the following projects might also be of help to you too:

  • Need to cross-compile with additional packages, such as OpenSSL, SDL2 or SQLite? Check out the Reference!
  • Also want to test these cross-compiled binaries? Check out hydrun!
  • Need to cross-compile without CGo? Check out bagop!
  • Want to build fully-featured desktop GUI for all these platforms without CGo? Check out Lorca!
  • Want to use SQLite without CGo? Check out cznic/sqlite!

Reference

$ bagccgop --help
Build for all gccgo-supported platforms by default, disable those which you don't want (bagop with CGo support).

Example usage: bagccgop -b mybin -x '(linux/alpha|linux/ppc64el)' -j "$(nproc)" 'main.go'
Example usage (with plain flag): bagccgop -b mybin -x '(linux/alpha|linux/ppc64el)' -j "$(nproc)" -p 'go build -o $DST main.go'

See https://github.com/pojntfx/bagccgop for more information.

Usage: bagccgop [OPTION...] '<INPUT>'
          -b, --bin string               Prefix of resulting binary (default "mybin")
  -d, --dist string              Directory build into (default "out")
  -x, --exclude string           Regex of platforms not to build for, i.e. (linux/alpha|linux/ppc64el)
  -e, --extra-args string        Extra arguments to pass to the Go compiler
  -g, --goisms                   Use Go's conventions (i.e. amd64) instead of uname's conventions (i.e. x86_64)
  -s, --hostPackages strings     Comma-seperated list of Debian packages to install for the host architecture
  -j, --jobs int                 Maximum amount of parallel jobs (default 1)
  -m, --manualPackages strings   Comma-seperated list of Debian packages to manually install for the selected architectures (i.e. those which would break the dependency graph)
  -a, --packages strings         Comma-seperated list of Debian packages to install for the selected architectures
  -p, --plain                    Sets GOARCH, GOARCH, CC, GCCGO, GOFLAGS and DST and leaves the rest up to you (see example usage)
  -r, --prepare string           Command to run before running the main command; will have only CC and GCCGO set (i.e. for code generation)
  -v, --verbose                  Enable logging of executed commands

Contributing

To contribute, please use the GitHub flow and follow our Code of Conduct.

To build bagccgop locally, run:

$ git clone https://github.com/pojntfx/bagccgop.git
$ cd bagccgop
$ go run main.go --help

To build the convenience images with pre-built Debian chroots, run:

$ docker buildx build --allow security.insecure -t ghcr.io/pojntfx/bagccgop-base-sid --load -f Dockerfile.sid .
$ docker buildx build --allow security.insecure -t ghcr.io/pojntfx/bagccgop-base-bullseye --load -f Dockerfile.bullseye .

Have any questions or need help? Chat with us on Matrix!

License

bagccgop (c) 2021 Felix Pojtinger and contributors

SPDX-License-Identifier: AGPL-3.0

Owner
Felix Pojtinger
20 | They/he | Developer (Go, Rust, JS) @incloud | Student at HdM Stuttgart | Lefty with a focus on digital rights
Felix Pojtinger
Similar Resources

A lightweight, universal OneDrive upload tool for all platforms

简体中文 OneDriveUploader MoeClub wrote a very good version, but unfortunately it's not open source and hasn't been updated in a while. This project is a

Dec 18, 2022

A lightweight, universal cloud drive upload tool for all platforms

简体中文 LightUploader MoeClub wrote a very good version, but unfortunately it's not open source and hasn't been updated in a while. This project is a sim

Jan 3, 2023

Nix derivations as Dockerfiles (`docker build -f default.nix .`)

BuildKit-Nix: Nix as Dockerfiles (docker build -f default.nix .) BuildKit-Nix allows using Nix derivations (default.nix) as Dockerfiles. Examples ./ex

Dec 28, 2022

red-tldr is a lightweight text search tool, which is used to help red team staff quickly find the commands and key points they want to execute, so it is more suitable for use by red team personnel with certain experience.

red-tldr is a lightweight text search tool, which is used to help red team staff quickly find the commands and key points they want to execute, so it is more suitable for use by red team personnel with certain experience.

Red Team TL;DR English | 中文简体 What is Red Team TL;DR ? red-tldr is a lightweight text search tool, which is used to help red team staff quickly find t

Jan 5, 2023

Build platforms that flexibly mix SQL, batch, and stream processing paradigms

Overview Gazette makes it easy to build platforms that flexibly mix SQL, batch, and millisecond-latency streaming processing paradigms. It enables tea

Dec 12, 2022

[爬虫框架 (golang)] An awesome Go concurrent Crawler(spider) framework. The crawler is flexible and modular. It can be expanded to an Individualized crawler easily or you can use the default crawl components only.

go_spider A crawler of vertical communities achieved by GOLANG. Latest stable Release: Version 1.2 (Sep 23, 2014). QQ群号:337344607 Features Concurrent

Dec 30, 2022

[爬虫框架 (golang)] An awesome Go concurrent Crawler(spider) framework. The crawler is flexible and modular. It can be expanded to an Individualized crawler easily or you can use the default crawl components only.

go_spider A crawler of vertical communities achieved by GOLANG. Latest stable Release: Version 1.2 (Sep 23, 2014). QQ群号:337344607 Features Concurrent

Jan 6, 2023

PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms & email.

PingMe is a CLI tool which provides the ability to send messages or alerts to multiple messaging platforms & email.

PingMe is a personal project to satisfy my needs of having alerts, most major platforms have integration to send alerts but its not always useful, either you are stuck with one particular platform, or you have to do alot of integrations. I needed a small app which i can just call from my backup scripts, cron jobs, CI/CD pipelines or from anywhere to send a message with particular information. And i can ship it everywhere with ease. Hence, the birth of PingMe.

Dec 28, 2022

:chart_with_upwards_trend: Monitors Go MemStats + System stats such as Memory, Swap and CPU and sends via UDP anywhere you want for logging etc...

Package stats Package stats allows for gathering of statistics regarding your Go application and system it is running on and sent them via UDP to a se

Nov 10, 2022

converts text-formats from one to another, it is very useful if you want to re-format a json file to yaml, toml to yaml, csv to yaml, ... etc

re-txt reformates a text file from a structure to another, i.e: convert from json to yaml, toml to json, ... etc Supported Source Formats json yaml hc

Sep 23, 2022

Are you forwarding DNS traffic to another server for some reason, but want to make sure only queries for certain names are passed? Say no more.

DNSFWD Redirect DNS traffic to an upstream. Get Latest: wget https://github.com/C-Sto/dnsfwd/releases/latest/download/dnsfwd_linux (replace linux with

Dec 16, 2022

For whatever reason you want to transfer TLS certificates in kubernetes to Qiniu CDN

Qiniu Certificate Sync For whatever reason you want to transfer TLS certificates in kubernetes to Qiniu CDN This app will upload provided TLS secrets

Oct 21, 2021

I will be uploading some basic programming in Golang so if you want to contribute please Fork this repo and contriute.

I will be uploading some basic programming in Golang so if you want to contribute please Fork this repo and contriute.

Go-language I will be uploading some basic programming in Golang so if you want to contribute please Fork this repo and contriute. This repo is for pr

Jan 21, 2022

Application to save log of anything you want

Logbook Application to save log of anything you want. SSL Gen Key openssl genrsa -out logbook.key 4096 Gen PEM file openssl req -x509 -new -days 365 -

Dec 2, 2021

Give it an URI and it will open it how you want.

url_handler Give it an url and it will open it how you want. Browers are anoying so when I can, I open links with dedicated programs. I started out us

Jan 8, 2022

Gron - gron transforms JSON into discrete assignments to make it easier to grep for what you want and see the absolute 'path' to it

gron Make JSON greppable! gron transforms JSON into discrete assignments to make

Feb 14, 2022

MIDI tunneling through BGP, for times when you want to broadcast your music instead of your IP packets.

BGPiano MIDI tunneling through BGP, for times when you want to broadcast your music instead of your IP packets. Usage bgpiano-send and bgpiano-recv Po

Jun 9, 2022

A minimal framework to build web apps; with handler chaining, middleware support; and most of all standard library compliant HTTP handlers(i.e. http.HandlerFunc).

A minimal framework to build web apps; with handler chaining, middleware support; and most of all standard library compliant HTTP handlers(i.e. http.HandlerFunc).

WebGo v4.1.3 WebGo is a minimalistic framework for Go to build web applications (server side) with zero 3rd party dependencies. Unlike full-fledged fr

Jan 1, 2023
Bluepill - Have an app that's letting you down? Keep it up!

Bluepill Have an app that's letting you down? Keep it up! What is this? Do you have an app that needs to run continuously in the terminal or in the ba

Jan 5, 2022
Build for all Go-supported platforms by default, disable those which you don't want.

bagop Build for all Go-supported platforms by default, disable those which you don't want. Overview bagop is a simple build tool for Go which tries to

Jul 29, 2022
Year-end-review - enables those want to look back on PRs at the end of year to review PRs and the comments as single Markdown file.

year-end-review year-end-review enables those want to look back on PRs at the end of year to review PRs and the comments as single Markdown file. HOW

Dec 31, 2021
A minimal CLI tool to enable (or disable) dependabot for all your repositories

Enable Dependabot A minimal CLI tool to enable (or disable) dependabot for all your repositories. Installation Install via Go go get -v github.com/RiR

Feb 10, 2022
dont-interface calculates how many interface{} are declared or used in your project?

dont-interface calculates how many interface{} are declared or used in your project?

Jun 9, 2022
Squizit is a simple tool, that aim to help you get the grade you want, not the one you have learnt for.
Squizit is a simple tool, that aim to help you get the grade you want, not the one you have learnt for.

Squizit is a simple tool, that aim to help you get the grade you want, not the one you have learnt for. Screenshots First, input PIN Then enjoy! Hoste

Mar 11, 2022
Flock is a project which provides a Go solution for system level file locks for all platforms Golang supports.

Flock is a project which provides a Go solution for system level file locks for all platforms Golang supports.

Feb 8, 2022
:recycle: Now you can easily rollback to previous deployed images whatever you want on k8s environment

EasyRollback EasyRollback is aim to easy rollback to previous images that deployed on k8s environment Installation You should have go installation fir

Dec 24, 2022
If you accept that 1 day is 24 hours in some situations, you might want to parse it in Go too.

relaxduration If you accept that 1 day is 24 hours in some situations, you might want to parse it in Go too. This package tries to handle situations w

Dec 7, 2022
Permits a Go application to implement subcommands support similar to what is supported by the 'go' tool.

subcommands golang library This package permits a Go application to implement subcommands support similar to what is supported by the 'go' tool. The l

Jul 28, 2022