#!/bin/bash -eu # # Build Ansible Collection from ansible-freeipa repo # prog=$(basename "$0") pwd=$(pwd) usage() { cat < Build offline without using git, using version A.B.C Also enables -a -p Install the generated collection in the given path, the ansible_collections sub directory will be created and will contain the collection: ansible_collections// Also enables -i -h Print this help EOF } all=0 keep=0 install=0 path= offline= version= namespace="freeipa" name="ansible_freeipa" while getopts "ahkio:p:" arg; do case $arg in a) all=1 ;; h) usage exit 0 ;; k) keep=1 ;; i) install=1 ;; o) version=$OPTARG offline=1 all=1 ;; p) path=$OPTARG install=1 ;; \?) echo usage exit 1 ;; esac done shift $((OPTIND-1)) if [ $# != 1 ]; then usage exit 1 fi collection="$1" case "$collection" in rpm|galaxy) # namespace and name are already set ;; aah) namespace="redhat" name="rhel_idm" ;; *) echo "Unknown collection '$collection'" usage exit 1 ;; esac collection_prefix="${namespace}.${name}" collection_uname="${collection^^}" [ -z "$version" ] && \ version=$(git describe --tags 2>/dev/null | sed -e "s/^v//") if [ -z "$version" ]; then echo "Version could not be detected" exit 1 fi echo "Building collection: ${namespace}-${name}-${version} for ${collection_uname}" BUILD=".collection-build" if [ -e "$BUILD" ]; then echo "Removing existing $BUILD ..." rm -rf "$BUILD" echo -e "\033[ARemoving existing $BUILD ... \033[32;1mDONE\033[0m" fi mkdir "$BUILD" echo "Copying files to build dir $BUILD ..." if [ $all == 1 ]; then # Copy all files except collection build dir for file in .[A-z]* [A-z]*; do [[ "$file" == "${BUILD}" ]] && continue cp -a "$file" "${BUILD}/" done else # git ls-tree is quoting, therefore ignore SC2046: Quote this to prevent # word splitting # shellcheck disable=SC2046 tar -cf - $(git ls-tree HEAD --name-only -r) | (cd "$BUILD/" && tar -xf -) fi echo -e "\033[ACopying files to build dir $BUILD ... \033[32;1mDONE\033[0m" cd "$BUILD" || exit 1 echo "Removing .copr, .git* and .pre* files from build dir $BUILD ..." rm -rf .copr .git* .pre* echo -e "\033[ARemoving files from build dir $BUILD ... \033[32;1mDONE\033[0m" if [ "$collection" != "rpm" ]; then cat > README-COLLECTION.md <> README-COLLECTION.md < CHANGELOG.rst echo -e "\033[ACreating CHANGELOG.rst... \033[32;1mDONE\033[0m" else echo "Empty changelog, offline generated." > CHANGELOG.rst fi sed -i -e "s/ansible.module_utils.ansible_freeipa_module/ansible_collections.${collection_prefix}.plugins.module_utils.ansible_freeipa_module/" plugins/modules/*.py python utils/create_action_group.py "meta/runtime.yml" "$collection_prefix" mv roles/*/module_utils/*.py plugins/module_utils/ rmdir roles/*/module_utils sed -i -e "s/ansible.module_utils.ansible_ipa_/ansible_collections.${collection_prefix}.plugins.module_utils.ansible_ipa_/" roles/*/library/*.py mv roles/*/library/*.py plugins/modules/ rmdir roles/*/library # There are no action plugins anymore in the roles, therefore this section # is commneted out. #[ ! -x plugins/action ] && mkdir plugins/action #mv roles/*/action_plugins/*.py plugins/action/ #rmdir roles/*/action_plugins # Adapt inventory plugin and inventory plugin README echo "Fixing inventory plugin and doc..." sed -i -e "s/plugin: freeipa/plugin: ${collection_prefix}.freeipa/g" plugins/inventory/freeipa.py sed -i -e "s/choices: \[\"freeipa\"\]/choices: \[\"${collection_prefix}.freeipa\"\]/g" plugins/inventory/freeipa.py sed -i -e "s/plugin: freeipa/plugin: ${collection_prefix}.freeipa/g" README-inventory-plugin-freeipa.md echo -e "\033[AFixing inventory plugin and doc... \033[32;1mDONE\033[0m" for doc_fragment in plugins/doc_fragments/*.py; do fragment=$(basename -s .py "$doc_fragment") echo "Fixing doc fragments for ${fragment} in plugins/modules..." for file in plugins/modules/*.py; do sed -i -e "s/- ${fragment}/- ${collection_prefix}.${fragment}/" "$file" done echo -e "\033[AFixing doc framents for ${fragment} in plugins/modules... \033[32;1mDONE\033[0m" done echo "Fixing examples in plugins/modules..." find plugins/modules -name "*.py" -print0 | while IFS= read -d '' -r line; do python utils/galaxyfy-module-EXAMPLES.py "$line" \ "ipa" "$collection_prefix" done echo -e "\033[AFixing examples in plugins/modules... \033[32;1mDONE\033[0m" echo "Fixing playbooks in roles/*/tasks..." for line in roles/*/tasks/*.yml; do python utils/galaxyfy-playbook.py "$line" "ipa" "$collection_prefix" done echo -e "\033[AFixing playbooks in roles/*/tasks... \033[32;1mDONE\033[0m" echo "Fixing playbooks in playbooks..." find playbooks -name "*.yml" -print0 | while IFS= read -d '' -r line; do python utils/galaxyfy-playbook.py "$line" "ipa" "$collection_prefix" done echo -e "\033[AFixing playbooks in playbooks... \033[32;1mDONE\033[0m" echo "Fixing README(s)..." find . -name "README*.md" -print0 | while IFS= read -d '' -r line; do python utils/galaxyfy-README.py "$line" "ipa" "$collection_prefix" done echo -e "\033[AFixing examples in plugins/modules... \033[32;1mDONE\033[0m" echo "Fixing playbooks in tests..." find tests -name "*.yml" -print0 | while IFS= read -d '' -r line; do python utils/galaxyfy-playbook.py "$line" "ipa" "$collection_prefix" done echo -e "\033[AFixing playbooks in tests... \033[32;1mDONE\033[0m" ansible-galaxy collection build --force --output-path="$pwd" cd "$pwd" || exit 1 if [ $keep == 0 ]; then echo "Removing build dir $BUILD ..." rm -rf "$BUILD" echo -e "\033[ARemoving build dir $BUILD ... \033[32;1mDONE\033[0m" else echo "Keeping build dir $BUILD" fi if [ $install == 1 ]; then echo "Installing collection ${namespace}-${name}-${version}.tar.gz ..." ansible-galaxy collection install ${path:+"-p$path"} "${namespace}-${name}-${version}.tar.gz" --force ${offline/1/--offline} fi