Skip to content

CLI util for retrieving the latest release from a GitHub repo

License

Notifications You must be signed in to change notification settings

backplane/ghlatest

Repository files navigation

ghlatest

This is a tool for downloading the latest release of a package from GitHub and optionally extracting the contents.

NOTE: This project is not yet ready for production use!

Installation

This app is statically compiled for various platforms, binaries can be downloaded from the ghlatest releases page.

Note: Your system or container will need to have PKI trust roots of some kind in order to run ghlatest. One common package that provides these on unix systems is called ca-certificates.

Usage

This is the general help text produced by the program. Each command has additional help text available, you can access this text with a command-line like: ghlatest list -h

General Help

$ ghlatest -h
NAME:
   ghlatest - Release locator for software on github

USAGE:
   ghlatest [global options] command [command options] [arguments...]

VERSION:
   dev

COMMANDS:
   list, ls      list available releases
   download, dl  download the latest available release
   json, j       print json doc representing latest release from github api
   extract, x    Extract files from the given archive (supports zip, gzip, bzip2, xz, 7z, and tar formats)
   help, h       Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --verbosity value  Sets the verbosity level of the log messages printed by the program, should be one of the following:
      "debug", "error", "fatal", "info", "panic", "trace", or "warn"
   --help, -h     show help
   --version, -v  print the version

Download Help

NAME:
   ghlatest download - download the latest available release

USAGE:
   ghlatest download [command options] [arguments...]

OPTIONS:
   --filter value, -f value [ --filter value, -f value ]  Filter release assets with the given regular expression
   --ifilter value, -i value                              Filter release assets with the given CASE-INSENSITIVE regular expression
   --current-arch                                         Filter release assets with a regex describing the current processor architecture (default: false)
   --current-os                                           Filter release assets with a regex describing the current operating system (default: false)
   --source, -s                                           List/download source zip files instead of released assets (default: false)
   --outputpath value, -o value                           The name of the file to write to
   --mode value, -m value                                 Set the output file's protection mode (ala chmod) (default: "0755")
   --extract, -x                                          Extract files from the downloaded archive (supports zip, gzip, bzip2, xz, 7z, and tar formats) (default: false)
   --keep value, -k value [ --keep value, -k value ]      When extracting, only keep the files matching this/these regex(s)
   --overwrite                                            When extracting, if one of the output files already exists, overwrite it (default: false)
   --remove-archive, --rm                                 After extracting the archive, delete it (default: false)
   --help, -h                                             show help

List Help

$ ghlatest list -h
NAME:
   ghlatest list - list available releases

USAGE:
   ghlatest list [command options] [arguments...]

OPTIONS:
   --filter value, -f value [ --filter value, -f value ]  Filter release assets with the given regular expression
   --ifilter value, -i value                              Filter release assets with the given CASE-INSENSITIVE regular expression
   --current-arch                                         Filter release assets with a regex describing the current processor architecture (default: false)
   --current-os                                           Filter release assets with a regex describing the current operating system (default: false)
   --source, -s                                           List/download source zip files instead of released assets (default: false)
   --help, -h                                             show help

Extract Help

NAME:
   ghlatest extract - Extract files from the given archive (supports zip, gzip, bzip2, xz, 7z, and tar formats)

USAGE:
   ghlatest extract [command options] [arguments...]

OPTIONS:
   --outputpath value, -o value                       The name of the file to write to
   --mode value, -m value                             Set the output file's protection mode (ala chmod) (default: "0755")
   --keep value, -k value [ --keep value, -k value ]  When extracting, only keep the files matching this/these regex(s)
   --overwrite                                        When extracting, if one of the output files already exists, overwrite it (default: false)
   --remove-archive, --rm                             After extracting the archive, delete it (default: false)
   --help, -h                                         show help

Example Session

I want to find out the what files are available in the latest release of the repo glvnst/snakeeyes.

$ ghlatest ls glvnst/snakeeyes
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/checksums.txt
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_dragonfly_amd64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_freebsd_amd64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_freebsd_armv7.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_linux_amd64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_linux_arm64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_linux_armv7.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_macOS_all.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_macOS_amd64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_netbsd_amd64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_netbsd_armv7.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_openbsd_amd64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_openbsd_arm64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_openbsd_armv7.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_windows_amd64.zip
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_windows_armv7.zip

I only care about the ones for my current operating system (linux) so I'll filter for those:

$ ghlatest ls --current-os glvnst/snakeeyes
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_linux_amd64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_linux_arm64.tar.gz
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_linux_armv7.tar.gz

I also only want the release for my current processor architecture so I apply that filter as well:

$ ghlatest ls --current-os --current-arch glvnst/snakeeyes
https://github.com/glvnst/snakeeyes/releases/download/v0.2.3/snakeeyes_0.2.3_linux_arm64.tar.gz

Now that I have that down to just a single URL I can change ls to dl to download the release, I also want to extract it, so I'll add the --extract flag:

$ ghlatest dl --current-os --current-arch --extract glvnst/snakeeyes
INFO[0001] wrote 825399 bytes to snakeeyes_0.2.3_linux_arm64.tar.gz
INFO[0001] extracting (tgz) snakeeyes_0.2.3_linux_arm64.tar.gz
INFO[0001] created COPYING mode: 0644
INFO[0001] created README.md mode: 0644
INFO[0001] created snakeeyes mode: 0755
INFO[0001] extraction complete
$ ls -al
total 3156
drwxr-xr-x    6 user     user           192 Feb 20 09:23 .
drwxr-xr-x   21 user     user           672 Feb 20 09:23 ..
-rw-r--r--    1 user     user         34523 Feb 20 09:23 COPYING
-rw-r--r--    1 user     user          7080 Feb 20 09:23 README.md
-rwxr-xr-x    1 user     user       2359296 Feb 20 09:23 snakeeyes
-rwxr-xr-x    1 user     user        825399 Feb 20 09:23 snakeeyes_0.2.3_linux_arm64.tar.gz

That produced a lot of files that I don't want at the moment. So I'll add a --keep snakeeyes filter so that I'm only extracting that solitary file. I'll also add --rm to remove the downloaded archive (snakeeyes_0.2.3_linux_arm64.tar.gz) after I'm done with it.

$ ghlatest dl --current-os --current-arch --extract --keep snakeeyes --rm glvnst/snakeeyes
INFO[0001] wrote 825399 bytes to snakeeyes_0.2.3_linux_arm64.tar.gz
INFO[0001] extracting (tgz) snakeeyes_0.2.3_linux_arm64.tar.gz
INFO[0001] created snakeeyes mode: 0755
INFO[0001] extraction complete
INFO[0001] removed "snakeeyes_0.2.3_linux_arm64.tar.gz" after extraction
$ $ ls -al
total 2304
drwxr-xr-x    3 user     user            96 Feb 20 09:26 .
drwxr-xr-x   21 user     user           672 Feb 20 09:23 ..
-rwxr-xr-x    1 user     user       2359296 Feb 20 09:26 snakeeyes

Now that we have a command which produces the file that I want from the latest release of the given GitHub repo, we can use it in scripting contexts or in container infrastructure, such as this Dockerfile:

FROM backplane/ghlatest as downloader
RUN ghlatest dl --current-os --current-arch --extract --keep snakeeyes --rm glvnst/snakeeyes

FROM scratch
COPY --from=downloader /work/snakeeyes /
ENTRYPOINT ["/snakeeyes"]