Skip to content

Deploy bundle and run UATs on self-hosted runners #234

Deploy bundle and run UATs on self-hosted runners

Deploy bundle and run UATs on self-hosted runners #234

name: Tests
on:
workflow_dispatch:
inputs:
bundle-test-path:
description: 'Test folder to run'
required: true
bundle-source:
description: 'Either `--channel <channel_name>` or `--file <bundle_file>.yaml`'
required: true
uats-branch:
description: 'The branch of `charmed-kubeflow-uats` to run, e.g. `track/1.7`'
type: string
default: 'main'
required: true
workflow_call:
inputs:
bundle-test-path:
description: 'Test folder to run'
type: string
required: true
bundle-source:
description: 'Either `--channel <channel_name>` or `--file <bundle_file>.yaml`'
type: string
required: true
uats-branch:
description: 'The branch of `charmed-kubeflow-uats` to run, e.g. `track/1.7`'
type: string
default: 'main'
required: true
jobs:
test-bundle:
runs-on: [self-hosted, linux, X64, two-xlarge]
steps:
- uses: actions/checkout@v3
- name: Parse and enable DNS server
id: dns-name
run: |
dns_server=$(grep -oPm1 'Current DNS Server: \K[^\s]+' <<< "$(resolvectl status)")
echo "Using following DNS Server: $dns_server"
echo "MY_ADDONS=hostpath-storage ingress dns:$dns_server rbac registry metallb:'10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'" >> $GITHUB_OUTPUT
- name: Setup Python
run: |
echo "deb-src http://archive.ubuntu.com/ubuntu/ jammy main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update -yqq
sudo apt-get build-dep -yqq python3
sudo apt-get install -yqq pkg-config
sudo apt-get install -yqq build-essential gdb lcov pkg-config \
libbz2-dev libffi-dev libgdbm-dev libgdbm-compat-dev liblzma-dev \
libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \
lzma lzma-dev tk-dev uuid-dev zlib1g-dev
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
pyenv install 3.8.16
pyenv global 3.8.16
# configure environment variables to be available in subsequent steps
echo "PYENV_ROOT=$PYENV_ROOT" >> "$GITHUB_ENV"
echo "PATH=$PATH" >> "$GITHUB_ENV"
- name: Install tools
run: |
eval "$(pyenv init -)"
pip install tox
sudo snap install charmcraft --classic
sudo snap install kubectl --classic
sudo snap install firefox
- name: Setup microk8s
run: |
sudo snap install microk8s --classic --channel=1.24/stable
sudo usermod -a -G microk8s $USER
# - name: update registry
# run: |
# sg microk8s -c "cat > /var/snap/microk8s/current/args/certs.d/docker.io/hosts.toml << EOF
# server = \"https://rocks.canonical.com\"
# [host.\"https://rocks.canonical.com\"]
# capabilities = [\"pull\", \"resolve\"]
# EOF"
#
# - run: |
# sudo cat /var/snap/microk8s/current/args/certs.d/docker.io/hosts.toml
- name: Update credentials
run: |
sg microk8s -c "cat >> /var/snap/microk8s/current/args/containerd-template.toml << EOF
[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"registry-1.docker.io\".auth]
username = \"${{ secrets.MAKSIM_DOCKERHUB_USER }}\"
password = \"${{ secrets.MAKSIM_DOCKERHUB_PASSWORD }}\"
EOF"
- name: Restart microk8s
run: |
sg microk8s -c "microk8s stop"
sg microk8s -c "microk8s start"
sg microk8s -c "microk8s status --wait-ready --timeout 150"
- name: Enable addons
run: |
sg microk8s -c "microk8s enable ${{ steps.dns-name.outputs.MY_ADDONS }}"
- name: Wait for microk8s to be ready and give time for addons
run: |
sleep 90
sg microk8s -c "microk8s status --wait-ready --timeout 150"
sg microk8s -c "mkdir -p ~/.kube"
sg microk8s -c "microk8s config > ~/.kube/config"
- name: Install and bootstrap Juju
run: |
sudo snap install juju --classic --channel=2.9/stable
sg microk8s -c 'juju bootstrap microk8s bundle-controller --model-default test-mode=true --model-default logging-config="<root>=DEBUG" --agent-version="2.9.44" --debug --verbose'
- name: Show all pods status
run: |
sg microk8s -c "microk8s kubectl get pods --all-namespaces"
- name: Increase file system limits
run: |
sudo sysctl fs.inotify.max_user_instances=1280
sudo sysctl fs.inotify.max_user_watches=655360
- name: Configure Juju model
run: |
sg microk8s -c "juju add-model kubeflow --config default-series=focal --config automatically-retry-hooks=true"
sg microk8s -c "juju model-config"
sg microk8s -c "juju status"
- name: Configure env for Gecko driver
run: |
# required for gecko driver
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
export DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/bus"
echo "$(id -u)"
loginctl enable-linger $USER
sudo apt-get install dbus-user-session -yqq
systemctl --user start dbus.service
- name: Run bundle tests
run: |
eval "$(pyenv init -)"
export BUNDLE_TEST_PATH=${{ inputs.bundle-test-path }}
export GH_TOKEN=${{ secrets.GITHUB_TOKEN }}
sg microk8s -c "tox -e full_bundle_tests -- ${{ inputs.bundle-source }}"
- name: Checkout Kubeflow UATs
run: |
git clone https://github.com/canonical/charmed-kubeflow-uats.git ~/charmed-kubeflow-uats
cd ~/charmed-kubeflow-uats
git checkout ${{ inputs.uats-branch }}
- name: Create UAT environment configuration file
run: |
# Define the environment variables to include in the configuration file
variables=("HTTP_PROXY" "HTTPS_PROXY")
# Create the params.env file and populate it with the values of the specified variables
for var in "${variables[@]}"; do
echo "$var=$(eval echo \$$var)" >> params.env
done
- name: Run UATs
run: |
eval "$(pyenv init -)"
sg microk8s -c "tox -c ~/charmed-kubeflow-uats/ -e kubeflow -- --env params.env"
- name: Upload selenium screenshots
if: failure()
uses: actions/upload-artifact@v3
with:
name: selenium-screenshots
path: |
sel-screenshots
**/sel-screenshots
**/**/sel-screenshots
- name: Run connectivity check
if: always()
run: |
sg microk8s -c "curl --max-time 10 --connect-timeout 10 http://10.64.140.43.nip.io"
- name: Dump Juju/k8s logs on failure
if: failure() || cancelled()
run: |
sg microk8s -c "juju status"
echo "Dumping k8s logs"
sg microk8s -c "microk8s kubectl get all --all-namespaces"
- name: Descript all pods
if: failure()
run: |
sg microk8s -c "microk8s kubectl describe pods --all-namespaces"
- name: Get logs from failed pods
if: failure() || cancelled()
run: |
POD_LIST=$(sg microk8s -c "microk8s kubectl get pods --all-namespaces -o 'custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace,CONTAINERS:.status.containerStatuses[*].ready'" | awk '$3 == "false" {print $1,$2}')
if [ -n "$POD_LIST" ]; then
echo "Actual Logs"
while read -r POD NAMESPACE; do
echo "\n\n\nPod: $POD"
sg microk8s -c "microk8s kubectl logs -n $NAMESPACE $POD"
done <<< "$POD_LIST"
fi
- name: Save debug artifacts
uses: canonical/kubeflow-ci/actions/dump-charm-debug-artifacts@main
if: always()