Skip to content

Commit

Permalink
Support installing just in mulitple operating systems.
Browse files Browse the repository at this point in the history
This follows the official just instructions for [installing pre-built
binaries](https://github.com/casey/just#pre-built-binaries).

However, the current version of https://just.systems/install.sh doesn't
quite work in windows. I have fixed that and [proposed the changes
upstream](casey/just#1474), and include a copy
of the fixed script in this repo for now.

As part of this, have added tests for this action, which runs on
multiple OSs, in order to test the cross platfoem installation

Also, allow installing a specific version of just.
  • Loading branch information
bloodearnest committed Jan 4, 2023
1 parent 7dd5e19 commit 310e68a
Show file tree
Hide file tree
Showing 4 changed files with 209 additions and 3 deletions.
32 changes: 32 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: self test

on:
pull_request:
push:
branches: [main]


jobs:
test:
strategy:
matrix:
os:
- ubuntu-20.04
- ubuntu-22.04
- windows-2019
- windows-2022
- macOS-12
- macOS-11
runs-on: ${{ matrix.os }}

steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: self test
uses: ./
with:
install-just: true
- name: test just works
shell: bash
run: just test
10 changes: 7 additions & 3 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ inputs:
install-just:
description: 'If true, this installs Just'
required: false
just-version:
description: 'Specific version of just to install'
default: 1.9.0

runs:
using: 'composite'
Expand All @@ -24,7 +27,8 @@ runs:
cache-dependency-path: requirements.*.txt
- name: Install just
if: ${{ inputs.install-just }}
shell: bash
run: |
curl -L https://github.com/casey/just/releases/download/1.9.0/just-1.9.0-x86_64-unknown-linux-musl.tar.gz \
| tar -xzf - --directory /usr/local/bin just
shell: bash
mkdir -p "$HOME/bin"
bash install-just.sh --to "$HOME/bin" --tag "${{ inputs.just-version }}"
echo "$HOME/bin" >> $GITHUB_PATH
167 changes: 167 additions & 0 deletions install-just.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
#!/usr/bin/env bash

set -euo pipefail

if [ ! -z ${GITHUB_ACTIONS-} ]; then
set -x
fi

help() {
cat <<'EOF'
Install a binary release of a just hosted on GitHub
USAGE:
install [options]
FLAGS:
-h, --help Display this message
-f, --force Force overwriting an existing binary
OPTIONS:
--tag TAG Tag (version) of the crate to install, defaults to latest release
--to LOCATION Where to install the binary [default: ~/.cargo/bin]
--target TARGET
EOF
}

git=casey/just
crate=just
url=https://github.com/casey/just
releases=$url/releases

say() {
echo "install: $@"
}

say_err() {
say "$@" >&2
}

err() {
if [ ! -z ${td-} ]; then
rm -rf $td
fi

say_err "error: $@"
exit 1
}

need() {
if ! command -v $1 > /dev/null 2>&1; then
err "need $1 (command not found)"
fi
}

force=false
while test $# -gt 0; do
case $1 in
--force | -f)
force=true
;;
--help | -h)
help
exit 0
;;
--tag)
tag=$2
shift
;;
--target)
target=$2
shift
;;
--to)
dest=$2
shift
;;
*)
;;
esac
shift
done

# Dependencies
need curl
need install
need mkdir
need mktemp
need tar

# Optional dependencies
if [ -z ${tag-} ]; then
need grep
need cut
fi

if [ -z ${target-} ]; then
need cut
fi

if [ -z ${dest-} ]; then
dest="$HOME/.cargo/bin"
fi

if [ -z ${tag-} ]; then
tag=$(curl --proto =https --tlsv1.2 -sSf https://api.github.com/repos/casey/just/releases/latest |
grep tag_name |
cut -d'"' -f4
)
fi

if [ -z ${target-} ]; then
# bash compiled with MINGW (e.g. git-bash, used in github windows runnners),
# unhelpfully includes a version suffix in `uname -s` output, so handle that.
# e.g. MINGW64_NT-10-0.19044
kernel=$(uname -s | cut -d- -f1)
uname_target="`uname -m`-$kernel"

case $uname_target in
aarch64-Linux) target=aarch64-unknown-linux-musl;;
arm64-Darwin) target=aarch64-apple-darwin;;
x86_64-Darwin) target=x86_64-apple-darwin;;
x86_64-Linux) target=x86_64-unknown-linux-musl;;
x86_64-Windows_NT) target=x86_64-pc-windows-msvc;;
x86_64-MINGW64_NT) target=x86_64-pc-windows-msvc;;
*)
err 'Could not determine target from output of `uname -m`-`uname -s`, please use `--target`:' $uname_target
;;
esac
fi

# windows archives are zips, not tarballs
case $target in
x86_64-pc-windows-msvc) extension=zip; need unzip;;
*) extension=tar.gz;;
esac

archive="$releases/download/$tag/$crate-$tag-$target.$extension"

say_err "Repository: $url"
say_err "Crate: $crate"
say_err "Tag: $tag"
say_err "Target: $target"
say_err "Destination: $dest"
say_err "Archive: $archive"

td=$(mktemp -d || mktemp -d -t tmp)

if [ "$extension" = "zip" ]; then
# unzip on windows cannot always handle stdin, so download first.
curl --proto =https --tlsv1.2 -sSfL $archive > $td/just.zip
unzip -d $td $td/just.zip
else
curl --proto =https --tlsv1.2 -sSfL $archive | tar -C $td -xz
fi

for f in $(ls $td); do
test -x $td/$f || continue

if [ -e "$dest/$f" ] && [ $force = false ]; then
err "$f already exists in $dest"
else
mkdir -p $dest
install -m 755 $td/$f $dest
fi
done

rm -rf $td
3 changes: 3 additions & 0 deletions justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# test just file
test:
echo ok

0 comments on commit 310e68a

Please sign in to comment.