From caf3529b796107fdb2b70b7e5c6a6365cf586d9c Mon Sep 17 00:00:00 2001 From: Hal Blackburn Date: Sun, 14 May 2023 17:49:03 +0000 Subject: [PATCH] feat: add oras feature --- src/oras/devcontainer-feature.json | 15 +++++++++++++++ src/oras/ensure_command.sh | 28 ++++++++++++++++++++++++++++ src/oras/install.sh | 21 +++++++++++++++++++++ test/oras/scenarios.json | 1 + test/oras/test.sh | 9 +++++++++ 5 files changed, 74 insertions(+) create mode 100644 src/oras/devcontainer-feature.json create mode 100644 src/oras/ensure_command.sh create mode 100644 src/oras/install.sh create mode 100644 test/oras/scenarios.json create mode 100644 test/oras/test.sh diff --git a/src/oras/devcontainer-feature.json b/src/oras/devcontainer-feature.json new file mode 100644 index 0000000..65b5137 --- /dev/null +++ b/src/oras/devcontainer-feature.json @@ -0,0 +1,15 @@ +{ + "name": "ORAS", + "id": "oras", + "version": "1.0.0", + "description": "Install ORAS ( https://oras.land ), an OCI Artifact tool", + "options": { + "version": { + "type": "string", + "proposals": ["1.0.0"], + "default": "1.0.0", + "description": "The specific version to install" + } + }, + "installsAfter": ["ghcr.io/devcontainers/features/common-utils"] +} diff --git a/src/oras/ensure_command.sh b/src/oras/ensure_command.sh new file mode 100644 index 0000000..fd1bfc8 --- /dev/null +++ b/src/oras/ensure_command.sh @@ -0,0 +1,28 @@ +ensure_apt_updated() { + if [ "${_apt_updated:-}" != "true" ]; then + apt-get update + _apt_updated=true + fi +} + +ensure_command() { + command=${1:?} + package=${2:-$command} + + if ! which "$command" >/dev/null; then + ensure_package "$package" + fi +} + +ensure_package() { + package=${1:?} + if which apt-get >/dev/null; then + ensure_apt_updated + apt-get -y install "$package" + elif which apk >/dev/null; then + apk add "${package}" + else + echo "Unable to install $package, no supported package manager found" >&2 + exit 1 + fi +} diff --git a/src/oras/install.sh b/src/oras/install.sh new file mode 100644 index 0000000..a48a422 --- /dev/null +++ b/src/oras/install.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -euo pipefail + +. ./ensure_command.sh +ensure_command curl + +VERSION="${VERSION:-1.0.0}" +if [[ ! $VERSION =~ ^[a-zA-Z0-9.-]+$ ]]; then + echo "Error: invalid version: $VERSION" >&2 + exit 1 +fi + +declare -A uname_platforms=([aarch64]=arm64 [x86_64]=amd64) +platform=${uname_platforms[$(uname -m)]:?"Error: unsupported platform: $(uname -m)"} + +curl --fail --location -# -o oras.tar.gz \ + "https://github.com/oras-project/oras/releases/download/v${VERSION?}/oras_${VERSION:?}_linux_${platform:?}.tar.gz" +mkdir -p oras-install/ +tar -zxf oras.tar.gz -C oras-install/ +mv oras-install/oras /usr/local/bin/ +rm -rf oras.tar.gz oras-install/ diff --git a/test/oras/scenarios.json b/test/oras/scenarios.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/test/oras/scenarios.json @@ -0,0 +1 @@ +{} diff --git a/test/oras/test.sh b/test/oras/test.sh new file mode 100644 index 0000000..727368f --- /dev/null +++ b/test/oras/test.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +# https://github.com/devcontainers/cli/blob/main/docs/features/test.md +source dev-container-features-test-lib + +check "oras command available" oras version + +reportResults