Skip to content

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

Deploy bundle and run UATs on self-hosted runners

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

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
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: Install tools
run: |
sudo apt-get update -yqq
sudo apt-get install -yqq python3-pip
sudo --preserve-env=http_proxy,https_proxy,no_proxy pip3 install tox
sudo snap install charmcraft --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
- 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"
- 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: |
export BUNDLE_TEST_PATH=${{ github.event.inputs.bundle-test-path }}
export GH_TOKEN=${{ secrets.GITHUB_TOKEN }}
sg microk8s -c "tox -e full_bundle_tests -- ${{ github.event.inputs.bundle-source }}"
- name: Sleep
if: always()
run: |
sg microk8s -c "sleep 3600"
- 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