Skip to content

Commit

Permalink
Add Ansible Development Tools and Environment features (#17)
Browse files Browse the repository at this point in the history
* Add Ansible Development Tools feature

This commit adds the Ansible Development Tools feature to the project. It includes a new README.md file with information about the feature and its usage. It also includes a devcontainer-feature.json file that defines the feature and its options. Additionally, it includes an install.sh script and a library_scripts.sh file that are used to install and configure the feature. Finally, it includes a scenarios.json file and a test.sh script for testing the feature.

* Add Ansible Development Environment feature

This commit adds the Ansible Development Environment feature to the project. It includes a README.md file with instructions and options for using the feature, a devcontainer-feature.json file that defines the feature, an install.sh script to install the feature, a library_scripts.sh file with utility functions, and test files for the feature.

* Add ansible-dev-tools and ansible-development-environment to the test workflow

* Update version number and fix typo in devcontainer feature
  • Loading branch information
hspaans authored Dec 28, 2023
1 parent fa8cfbf commit 2ce8733
Show file tree
Hide file tree
Showing 13 changed files with 516 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ jobs:
strategy:
matrix:
features:
- ansible-dev-tools
- ansible-development-environment
- ansible-lint
- pyadr
- pytest
Expand All @@ -38,6 +40,8 @@ jobs:
strategy:
matrix:
features:
- ansible-dev-tools
- ansible-development-environment
- ansible-lint
- pyadr
- pytest
Expand Down
25 changes: 25 additions & 0 deletions src/ansible-dev-tools/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

# Ansible Lint (via pipx) (ansible-lint)

ansible-lint checks playbooks for practices and behavior that could potentially be improved.

## Example Usage

```json
"features": {
"ghcr.io/hspaans/devcontainer-features/ansible-lint:1": {}
}
```

## Options

| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select the version to install. | string | latest |
| plugins | A space delimitered list of ansible-lint plugins (will be injected into the ansible-lint pipx env). see proposals for examples | string | - |



---

_Note: This file was auto-generated from the [devcontainer-feature.json](https://github.com/hspaans/devcontainer-features/blob/main/src/ansible-lint/devcontainer-feature.json). Add additional notes to a `NOTES.md`._
22 changes: 22 additions & 0 deletions src/ansible-dev-tools/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"id": "ansible-dev-tools",
"version": "1.0.0",
"name": "Ansible Development Tools (via pipx)",
"documentationURL": "http://github.com/hspaans/devcontainers-features/tree/main/src/ansible-dev-tools",
"description": "The ansible-dev-tools python package provides an easy way to install and discover the best tools available to create and test ansible content.",
"options": {
"version": {
"default": "latest",
"description": "Select the version to install.",
"proposals": [
"latest"
],
"type": "string"
}
},
"installsAfter": [
"ghcr.io/devcontainers-contrib/features/pipx-package",
"ghcr.io/devcontainers/features/python",
"ghcr.io/devcontainers-contrib/features/ansible"
]
}
22 changes: 22 additions & 0 deletions src/ansible-dev-tools/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

set -e

. ./library_scripts.sh

# nanolayer is a cli utility which keeps container layers as small as possible
# source code: https://github.com/devcontainers-contrib/nanolayer
# `ensure_nanolayer` is a bash function that will find any existing nanolayer installations,
# and if missing - will download a temporary copy that automatically get deleted at the end
# of the script
ensure_nanolayer nanolayer_location "v0.5.0"


$nanolayer_location \
install \
devcontainer-feature \
"ghcr.io/devcontainers-contrib/features/pipx-package:1.1.7" \
--option package='ansible-dev-tools' --option version="$VERSION"



echo 'Done!'
170 changes: 170 additions & 0 deletions src/ansible-dev-tools/library_scripts.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@


clean_download() {
# The purpose of this function is to download a file with minimal impact on container layer size
# this means if no valid downloader is found (curl or wget) then we install a downloader (currently wget) in a
# temporary manner, and making sure to
# 1. uninstall the downloader at the return of the function
# 2. revert back any changes to the package installer database/cache (for example apt-get lists)
# The above steps will minimize the leftovers being created while installing the downloader
# Supported distros:
# debian/ubuntu/alpine

url=$1
output_location=$2
tempdir=$(mktemp -d)
downloader_installed=""

_apt_get_install() {
tempdir=$1

# copy current state of apt list - in order to revert back later (minimize contianer layer size)
cp -p -R /var/lib/apt/lists $tempdir
apt-get update -y
apt-get -y install --no-install-recommends wget ca-certificates
}

_apt_get_cleanup() {
tempdir=$1

echo "removing wget"
apt-get -y purge wget --auto-remove

echo "revert back apt lists"
rm -rf /var/lib/apt/lists/*
rm -r /var/lib/apt/lists && mv $tempdir/lists /var/lib/apt/lists
}

_apk_install() {
tempdir=$1
# copy current state of apk cache - in order to revert back later (minimize contianer layer size)
cp -p -R /var/cache/apk $tempdir

apk add --no-cache wget
}

_apk_cleanup() {
tempdir=$1

echo "removing wget"
apk del wget
}
# try to use either wget or curl if one of them already installer
if type curl >/dev/null 2>&1; then
downloader=curl
elif type wget >/dev/null 2>&1; then
downloader=wget
else
downloader=""
fi

# in case none of them is installed, install wget temporarly
if [ -z $downloader ] ; then
if [ -x "/usr/bin/apt-get" ] ; then
_apt_get_install $tempdir
elif [ -x "/sbin/apk" ] ; then
_apk_install $tempdir
else
echo "distro not supported"
exit 1
fi
downloader="wget"
downloader_installed="true"
fi

if [ $downloader = "wget" ] ; then
wget -q $url -O $output_location
else
curl -sfL $url -o $output_location
fi

# NOTE: the cleanup procedure was not implemented using `trap X RETURN` only because
# alpine lack bash, and RETURN is not a valid signal under sh shell
if ! [ -z $downloader_installed ] ; then
if [ -x "/usr/bin/apt-get" ] ; then
_apt_get_cleanup $tempdir
elif [ -x "/sbin/apk" ] ; then
_apk_cleanup $tempdir
else
echo "distro not supported"
exit 1
fi
fi

}


ensure_nanolayer() {
# Ensure existance of the nanolayer cli program
local variable_name=$1

local required_version=$2

local __nanolayer_location=""

# If possible - try to use an already installed nanolayer
if [ -z "${NANOLAYER_FORCE_CLI_INSTALLATION}" ]; then
if [ -z "${NANOLAYER_CLI_LOCATION}" ]; then
if type nanolayer >/dev/null 2>&1; then
echo "Found a pre-existing nanolayer in PATH"
__nanolayer_location=nanolayer
fi
elif [ -f "${NANOLAYER_CLI_LOCATION}" ] && [ -x "${NANOLAYER_CLI_LOCATION}" ] ; then
__nanolayer_location=${NANOLAYER_CLI_LOCATION}
echo "Found a pre-existing nanolayer which were given in env variable: $__nanolayer_location"
fi

# make sure its of the required version
if ! [ -z "${__nanolayer_location}" ]; then
local current_version
current_version=$($__nanolayer_location --version)


if ! [ $current_version == $required_version ]; then
echo "skipping usage of pre-existing nanolayer. (required version $required_version does not match existing version $current_version)"
__nanolayer_location=""
fi
fi

fi

# If not previuse installation found, download it temporarly and delete at the end of the script
if [ -z "${__nanolayer_location}" ]; then

if [ "$(uname -sm)" = 'Linux x86_64' ] || [ "$(uname -sm)" = "Linux aarch64" ]; then
tmp_dir=$(mktemp -d -t nanolayer-XXXXXXXXXX)

clean_up () {
ARG=$?
rm -rf $tmp_dir
exit $ARG
}
trap clean_up EXIT


if [ -x "/sbin/apk" ] ; then
clib_type=musl
else
clib_type=gnu
fi

tar_filename=nanolayer-"$(uname -m)"-unknown-linux-$clib_type.tgz

# clean download will minimize leftover in case a downloaderlike wget or curl need to be installed
clean_download https://github.com/devcontainers-contrib/cli/releases/download/$required_version/$tar_filename $tmp_dir/$tar_filename

tar xfzv $tmp_dir/$tar_filename -C "$tmp_dir"
chmod a+x $tmp_dir/nanolayer
__nanolayer_location=$tmp_dir/nanolayer


else
echo "No binaries compiled for non-x86-linux architectures yet: $(uname -m)"
exit 1
fi
fi

# Expose outside the resolved location
export ${variable_name}=$__nanolayer_location

}
25 changes: 25 additions & 0 deletions src/ansible-development-environment/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

# Ansible Lint (via pipx) (ansible-lint)

ansible-lint checks playbooks for practices and behavior that could potentially be improved.

## Example Usage

```json
"features": {
"ghcr.io/hspaans/devcontainer-features/ansible-lint:1": {}
}
```

## Options

| Options Id | Description | Type | Default Value |
|-----|-----|-----|-----|
| version | Select the version to install. | string | latest |
| plugins | A space delimitered list of ansible-lint plugins (will be injected into the ansible-lint pipx env). see proposals for examples | string | - |



---

_Note: This file was auto-generated from the [devcontainer-feature.json](https://github.com/hspaans/devcontainer-features/blob/main/src/ansible-lint/devcontainer-feature.json). Add additional notes to a `NOTES.md`._
22 changes: 22 additions & 0 deletions src/ansible-development-environment/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"id": "ansible-development-environment",
"version": "1.0.0",
"name": "Ansible Development Ennvironment (via pipx)",
"documentationURL": "http://github.com/hspaans/devcontainers-features/tree/main/src/ansible-development-environment",
"description": "A pip-like install for ansible collections.",
"options": {
"version": {
"default": "latest",
"description": "Select the version to install.",
"proposals": [
"latest"
],
"type": "string"
}
},
"installsAfter": [
"ghcr.io/devcontainers-contrib/features/pipx-package",
"ghcr.io/devcontainers/features/python",
"ghcr.io/devcontainers-contrib/features/ansible"
]
}
22 changes: 22 additions & 0 deletions src/ansible-development-environment/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

set -e

. ./library_scripts.sh

# nanolayer is a cli utility which keeps container layers as small as possible
# source code: https://github.com/devcontainers-contrib/nanolayer
# `ensure_nanolayer` is a bash function that will find any existing nanolayer installations,
# and if missing - will download a temporary copy that automatically get deleted at the end
# of the script
ensure_nanolayer nanolayer_location "v0.5.0"


$nanolayer_location \
install \
devcontainer-feature \
"ghcr.io/devcontainers-contrib/features/pipx-package:1.1.7" \
--option package='ansible-development-environment' --option version="$VERSION"



echo 'Done!'
Loading

0 comments on commit 2ce8733

Please sign in to comment.