Skip to content
This repository has been archived by the owner on Jun 13, 2024. It is now read-only.

Commit

Permalink
add Makefile, downstream build script, enable CI for downstream
Browse files Browse the repository at this point in the history
Signed-off-by: Adam Miller <admiller@redhat.com>
  • Loading branch information
maxamillion committed Aug 26, 2020
1 parent 16059a8 commit 3885eb1
Show file tree
Hide file tree
Showing 4 changed files with 359 additions and 4 deletions.
91 changes: 91 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,3 +108,94 @@ jobs:
- name: Run molecule default test scenario
run: molecule test
working-directory: ./ansible_collections/community/kubernetes

downstream-sanity:
runs-on: ubuntu-latest
strategy:
matrix:
python_version: ['3.6']
steps:
- name: Check out code
uses: actions/checkout@v2
with:
path: ansible_collections/community/kubernetes

- name: Set up Python ${{ matrix.python_version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python_version }}

- name: Install ansible base (devel branch)
run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check

- name: Run sanity tests on Python ${{ matrix.python_version }}
run: make downstream-test-sanity
working-directory: ./ansible_collections/community/kubernetes

downstream-integration:
runs-on: ubuntu-latest
strategy:
matrix:
python_version: ['3.6']
steps:
- name: Check out code
uses: actions/checkout@v2
with:
path: ansible_collections/community/kubernetes

- name: Set up Python ${{ matrix.python_version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python_version }}

- name: Install ansible base (devel branch)
run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check

- name: Run integration tests on Python ${{ matrix.python_version }}
run: make downstream-test-integration
working-directory: ./ansible_collections/community/kubernetes

downstream-molecule:
runs-on: ubuntu-latest
strategy:
matrix:
python_version: ['3.7']
steps:
- name: Check out code
uses: actions/checkout@v2
with:
path: ansible_collections/community/kubernetes

- name: Set up KinD cluster
uses: engineerd/setup-kind@v0.4.0

- name: Set up Python ${{ matrix.python_version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python_version }}

- name: Install molecule and openshift dependencies
run: pip install ansible molecule yamllint openshift flake8

# The latest release doesn't work with Molecule currently.
# See: https://github.com/ansible-community/molecule/issues/2757
# - name: Install ansible base, latest release.
# run: |
# pip uninstall -y ansible
# pip install --pre ansible-base

# The devel branch doesn't work with Molecule currently.
# See: https://github.com/ansible-community/molecule/issues/2757
# - name: Install ansible base (devel branch)
# run: |
# pip uninstall -y ansible
# pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check

- name: Create default collection path symlink
run: |
mkdir -p /home/runner/.ansible
ln -s /home/runner/work/kubernetes/kubernetes /home/runner/.ansible/collections
- name: Run molecule default test scenario
run: make downstream-test-molecule
working-directory: ./ansible_collections/community/kubernetes
39 changes: 39 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Also needs to be updated in galaxy.yml
VERSION = 1.0.0

clean:
rm -f community-kubernetes-${VERSION}.tar.gz
rm -rf ansible_collections

build: clean
ansible-galaxy collection build

release: build
ansible-galaxy collection publish community-kubernetes-${VERSION}.tar.gz

install: build
ansible-galaxy collection install -p ansible_collections community-kubernetes-${VERSION}.tar.gz

test-sanity:
ansible-test sanity -v --docker --color $(TEST_ARGS)

test-integration:
ansible-test integration --docker -v --color $(TEST_ARGS)

test-molecule:
ansible-test integration --docker -v --color $(TEST_ARGS)

downstream-test-sanity:
./utils/downstream.sh -s

downstream-test-integration:
./utils/downstream.sh -i

downstream-test-molecule:
./utils/downstream.sh -m

downstream-build:
./utils/downstream.sh -b

downstream-release:
./utils/downstream.sh -r
13 changes: 9 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,15 @@ The `tests` directory contains configuration for running sanity and integration

You can run the collection's test suites with the commands:

ansible-test sanity --docker -v --color
ansible-test integration --docker -v --color
make test-sanity
make test-integration

### Testing with `molecule`

There are also integration tests in the `molecule` directory which are meant to be run against a local Kubernetes cluster, e.g. using [KinD](https://kind.sigs.k8s.io) or [Minikube](https://minikube.sigs.k8s.io). To run the tests, set up a local cluster, then run Molecule:
There are also integration tests in the `molecule` directory which are meant to be run against a local Kubernetes cluster, e.g. using [KinD](https://kind.sigs.k8s.io) or [Minikube](https://minikube.sigs.k8s.io). To setup a local cluster using KinD and run Molecule:

kind create cluster
molecule test
make test-molecule

## Publishing New Versions

Expand All @@ -157,6 +157,11 @@ Releases are automatically built and pushed to Ansible Galaxy for any new tag. B
1. Run `antsibull-changelog release`.
1. Commit the changes and create a PR with the changes. Wait for tests to pass, then merge it once they have.
1. Tag the version in Git and push to GitHub.
1. Run the following commands to build and release the new version on Galaxy:

```
make release
```

After the version is published, verify it exists on the [Kubernetes Collection Galaxy page](https://galaxy.ansible.com/community/kubernetes).

Expand Down
220 changes: 220 additions & 0 deletions utils/downstream.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
#!/bin/bash -eu

# Script to dual-home the upstream and downstream Collection in a single repo
#
# This script will build or test a downstream collection, removing any
# upstream components that will not ship in the downstream release
#
# NOTES:
# - All functions are prefixed with f_ so it's obvious where they come
# from when in use throughout the script

DOWNSTREAM_VERSION="1.0.0"
KEEP_DOWNSTREAM_TMPDIR="${KEEP_DOWNSTREAM_TMPDIR:-''}"


f_log_info()
{
printf "%s:LOG:INFO: %s\n" "${0}" "${1}\n"
}

f_prep()
{
f_log_info "${FUNCNAME[0]}"
# Array of excluded files from downstream build (relative path)
_file_exclude=(
)

# Files to copy downstream (relative repo root dir path)
_file_manifest=(
CHANGELOG.rst
galaxy.yml
LICENSE
README.md
Makefile
)

# Directories to recursively copy downstream (relative repo root dir path)
_dir_manifest=(
changelogs
meta
plugins
tests
)

# Temp build dir
_tmp_dir=$(mktemp -d)
_build_dir="${_tmp_dir}/ansible_collections/kubernetes/base"
mkdir -p "${_build_dir}"
}

f_show_help()
{
printf "Usage: downstream.sh [OPTION]\n"
printf "\t-s\t\tCreate a temporary downstream release and perform sanity tests.\n"
printf "\t-i\t\tCreate a temporary downstream release and perform integration tests.\n"
printf "\t-m\t\tCreate a temporary downstream release and perform molecule tests.\n"
printf "\t-b\t\tCreate a downstream release and stage for release.\n"
printf "\t-r\t\tCreate a downstream release and publish release.\n"
}

f_text_sub()
{
# Switch FQCN and dependent components
sed -i "s/community-kubernetes/kubernetes-base/" "${_build_dir}/Makefile"
sed -i "s/community\/kubernetes/kubernetes\/base/" "${_build_dir}/Makefile"
sed -i "s/^VERSION\:/VERSION: ${DOWNSTREAM_VERSION}/" "${_build_dir}/Makefile"
sed -i "s/community.kubernetes/kubernetes.base/" "${_build_dir}/galaxy.yml"
sed -i "s/name\:.*$/name: base/" "${_build_dir}/galaxy.yml"
sed -i "s/namespace\:.*$/namespace: kubernetes/" "${_build_dir}/galaxy.yml"
sed -i "s/^version\:.*$/version: ${DOWNSTREAM_VERSION}/" "${_build_dir}/galaxy.yml"
find "${_build_dir}" -type f -exec sed -i "s/community\.kubernetes/kubernetes\.base/g" {} \;
}

f_cleanup()
{
f_log_info "${FUNCNAME[0]}"
if [[ -n ${KEEP_DOWNSTREAM_TMPDIR} ]]; then
if [[ -d ${_build_dir} ]]; then
rm -fr "${_build_dir}"
fi
fi
}

# Exit and handle cleanup processes if needed
f_exit()
{
f_cleanup
exit "$0"
}

f_create_collection_dir_structure()
{
f_log_info "${FUNCNAME[0]}"
# Create the Collection
for f_name in "${_file_manifest[@]}";
do
cp "./${f_name}" "${_build_dir}/${f_name}"
done
for d_name in "${_dir_manifest[@]}";
do
cp -r "./${d_name}" "${_build_dir}/${d_name}"
done
for exclude_file in "${_file_exclude[@]}";
do
if [[ -f "${_build_dir}/${exclude_file}" ]]; then
rm -f "${_build_dir}/${exclude_file}"
fi
done
}

f_copy_collection_to_working_dir()
{
f_log_info "${FUNCNAME[0]}"
# Copy the Collection build result into original working dir
cp "${_build_dir}"/*.tar.gz ./
}

f_common_steps()
{
f_log_info "${FUNCNAME[0]}"
f_prep
f_create_collection_dir_structure
f_text_sub
}

# Run the test sanity scanerio
f_test_sanity_option()
{
f_log_info "${FUNCNAME[0]}"
f_common_steps
pushd "${_build_dir}" || return
f_log_info "SANITY TEST PWD: ${PWD}"
make test-sanity
popd || return
f_cleanup
}

# Run the test integration
f_test_integration_option()
{
f_log_info "${FUNCNAME[0]}"
f_common_steps
pushd "${_build_dir}" || return
f_log_info "INTEGRATION TEST WD: ${PWD}"
make test-integration
popd || return
f_cleanup
}

# Run the molecule tests
f_test_molecule_option()
{
f_log_info "${FUNCNAME[0]}"
f_common_steps
pushd "${_build_dir}" || return
f_log_info "MOLECULE TEST WD: ${PWD}"
make test-molecule
popd || return
f_cleanup
}

# Run the release scanerio
f_release_option()
{
f_log_info "${FUNCNAME[0]}"
f_common_steps
pushd "${_build_dir}" || return
f_log_info "RELEASE WD: ${PWD}"
make release
popd || return
f_cleanup
}

# Run the build scanerio
f_build_option()
{
f_log_info "${FUNCNAME[0]}"
f_common_steps
pushd "${_build_dir}" || return
f_log_info "BUILD WD: ${PWD}"
make build
popd || return
f_copy_collection_to_working_dir
f_cleanup
}

# If no options are passed, display usage and exit
if [[ "${#}" -eq "0" ]]; then
f_show_help
f_exit 0
fi

# Handle options
while getopts ":simrb" option
do
case $option in
s)
f_test_sanity_option
;;
i)
f_test_integration_option
;;
m)
f_test_molecule_option
;;
r)
f_release_option
;;
b)
f_build_option
;;
*)
printf "ERROR: Unimplemented option chosen.\n"
f_show_help
f_exit 1
;; # Default.
esac
done

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

0 comments on commit 3885eb1

Please sign in to comment.