Deploy bundle and run UATs on self-hosted runners #216
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
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 | |
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=${{ inputs.bundle-test-path }} | |
export GH_TOKEN=${{ secrets.GITHUB_TOKEN }} | |
sg microk8s -c "tox -e full_bundle_tests -- ${{ inputs.bundle-source }}" | |
- 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 |