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!
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
.
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
$ 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
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
$ 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
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
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"]