diff --git a/.github/workflows/openstack-ubuntu-20.yml b/.github/workflows/openstack-ubuntu-20.yml new file mode 100644 index 00000000..c08140ba --- /dev/null +++ b/.github/workflows/openstack-ubuntu-20.yml @@ -0,0 +1,630 @@ +name: "Test Run: ubuntu-20.04" + +on: + push: + branches: + - "main" + - '!docs' + tags-ignore: + - "*" + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-openstack-ubuntu-20.04 + cancel-in-progress: true + +env: + TF_VAR_application_credential_id: ${{ secrets.OS_APPLICATION_CREDENTIAL_ID }} + TF_VAR_application_credential_secret: ${{ secrets.OS_APPLICATION_CREDENTIAL_SECRET }} + TF_VAR_github_repository: ${{ github.repository }} + TF_VAR_github_run_id: ${{ github.run_id }} + TF_VAR_ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} + TF_VAR_ssh_public_key: ${{ secrets.SSH_PUBLIC_KEY }} + TF_VAR_os_auth_region: ${{ secrets.OS_AUTH_REGION }} + TF_VAR_os_auth_url: ${{ secrets.OS_AUTH_URL }} + TF_VAR_os_interface: ${{ secrets.OS_INTERFACE }} + TF_VAR_os_project_domain_name: ${{ secrets.OS_PROJECT_DOMAIN_NAME }} + TF_VAR_os_password: ${{ secrets.OS_PASSWORD }} + TF_VAR_os_project_id: ${{ secrets.OS_PROJECT_ID }} + TF_VAR_os_project_domain_id: ${{ secrets.OS_PROJECT_DOMAIN_ID }} + TF_VAR_os_project_name: ${{ secrets.OS_PROJECT_NAME }} + TF_VAR_os_region_name: ${{ secrets.OS_REGION_NAME }} + TF_VAR_os_username: ${{ secrets.OS_USERNAME }} + tf_working_directory: "${{ github.workspace }}/.github/workflows/openstack/centos-7" + +jobs: + terraform_openstack_create: + runs-on: self-hosted + defaults: + run: + working-directory: "${{ github.workspace }}/.github/workflows/openstack/ubuntu-20.04" + steps: + - uses: actions/checkout@v4 + - name: Terraform fmt + id: fmt + run: | + terraform fmt -check + continue-on-error: true + + - name: Terraform Init + id: init + run: | + terraform init + + - name: Terraform Plan + id: plan + run: | + terraform plan -no-color + + - name: Terraform Apply + id: apply + run: | + pwd + terraform apply -no-color -auto-approve + mv -v .terraform.lock.hcl terraform.lock.hcl + + - name: Upload Terraform State File as Artifact + uses: actions/upload-artifact@v4.4.3 + with: + name: ${{ github.run_id }}-ubuntu20-terraform.tfstate + path: "${{ github.workspace }}/.github/workflows/openstack/ubuntu-20.04" + + - name: Terraform Output File Create + run: | + terraform output -json > ${{ github.run_id }}-tf.out.json + + - name: Make vm_ip file from Terraform Output File + id: get_vm_ip + run: | + echo "$(jq -r '.address.value' ${{ github.run_id }}-tf.out.json)" > ${{ github.workspace }}/${{ github.run_id }}-vm_ip + + - name: Upload VM Output + uses: actions/upload-artifact@v4.4.3 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/${{ github.run_id }}-vm_ip + overwrite: true + + clone_elevate_repo: + runs-on: self-hosted + needs: terraform_openstack_create + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Checkout Repo and Commit + if: github.event_name != 'pull_request' + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + script: | + cd /opt + echo "## [INFO]: ${{ github.ref }}" + echo "## [INFO]: ${{ github.ref_name }}" + echo "## [INFO}: ${{ github.repository }}" + git clone --depth 1 --branch ${{ github.ref_name }} https://github.com/${{ github.repository }}.git + hostname && pwd && ls -la + cd /opt/$(echo ${{ github.repository }} | cut -d / -f2) + git status + + - name: Checking out Repo and Pull Request + if: github.event_name == 'pull_request' + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + script: | + cd /opt + echo "[DEBUG]: ${{ github.ref }}" + echo "[DEBUG]: ${{ github.head_ref }}" + echo "## [INFO}: ${{ github.repository }}" + git clone --depth 1 --branch ${{ github.head_ref }} https://github.com/${{ github.repository }}.git + cd /opt/$(echo ${{ github.repository }} | cut -d / -f2) + git status + + setup_integration_checks: + runs-on: self-hosted + needs: clone_elevate_repo + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + + - name: Setup for Integration Checks Prior to Running Elevate + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + script: | + REPODIR=$(echo ${{ github.repository }} | cut -d / -f2) + chmod -v +x /opt/${REPODIR}/t/integration/setup + /opt/${REPODIR}/t/integration/setup + + start_elevate: + runs-on: self-hosted + needs: setup_integration_checks + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + + - name: Starting Elevate + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + timeout: 30m + command_timeout: 30m + script: | + REPODIR=$(echo ${{ github.repository }} | cut -d / -f2) + cp -pv /opt/${REPODIR}/elevate-cpanel /scripts/elevate-cpanel + cp -pv /opt/${REPODIR}/.github/workflows/openstack/status_marker /scripts/status_marker + cp -pv /opt/${REPODIR}/.github/workflows/openstack/reboot_watch /scripts/reboot_watch + while pgrep -x post_snapshot > /dev/null; do echo "Sleeping until post_snapshot is no longer running as it may be locking apt."; sleep 1; done + chmod -v +x /scripts/elevate-cpanel + until /usr/local/cpanel/cpkeyclt; do echo "Retrying /usr/local/cpanel/cpkeyct until it passes..."; sleep 5; done + /scripts/elevate-cpanel --non-interactive --skip-cpanel-version-check --start & + exit 0 + + wait_for_stage_1_reboot: + runs-on: self-hosted + needs: start_elevate + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Wait For VM to Come Back From Initial Reboot + working-directory: "./.github/workflows/openstack/" + run: | + ./ssh_retry ${{ steps.VM_IP.outputs.VM_IP }} + + watch_for_stage_2_reboot: + runs-on: self-hosted + needs: wait_for_stage_1_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Monitor Elevate for Reboot from Stage 1 into Stage 2 + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + timeout: 60m + command_timeout: 30m + debug: true + script: | + /scripts/status_marker 1 + tail -n40 -F /var/log/elevate-cpanel.log & + sleep .5 + REBOOT_STRING="Rebooting into stage 2 of 5" RETVAL=1 /scripts/reboot_watch + + wait_for_stage_2_reboot: + runs-on: self-hosted + needs: watch_for_stage_2_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Wait For VM to Come Back From Stage 2 Reboot + working-directory: "./.github/workflows/openstack/" + run: | + ./ssh_retry ${{ steps.VM_IP.outputs.VM_IP }} + + watch_for_stage_3_reboot: + runs-on: self-hosted + needs: wait_for_stage_2_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Monitor Elevate for Stage 3 Reboot + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + timeout: 60m + command_timeout: 30m + debug: true + script: | + /scripts/status_marker 2 + tail -n40 -F /var/log/elevate-cpanel.log & + sleep .5 + REBOOT_STRING="Rebooting into stage 3 of 5" RETVAL=1 /scripts/reboot_watch + + wait_for_stage_3_reboot: + runs-on: self-hosted + needs: watch_for_stage_3_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Wait For VM to Come Back From Stage 3 Reboot + working-directory: "./.github/workflows/openstack/" + run: | + ./ssh_retry ${{ steps.VM_IP.outputs.VM_IP }} + + watch_for_stage_4_reboot: + runs-on: self-hosted + needs: wait_for_stage_3_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Monitor Elevate for Stage 4 Reboot + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + timeout: 30m + command_timeout: 30m + script: | + /scripts/status_marker 3 + tail -n40 -F /var/log/elevate-cpanel.log & + sleep .5 + REBOOT_STRING="Rebooting into stage 4 of 5" RETVAL=1 /scripts/reboot_watch + + wait_for_stage_4_reboot: + runs-on: self-hosted + needs: watch_for_stage_4_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Wait For VM to Come Back From Stage 4 Reboot + working-directory: "./.github/workflows/openstack/" + run: | + ./ssh_retry ${{ steps.VM_IP.outputs.VM_IP }} + + watch_for_stage_5_reboot: + runs-on: self-hosted + needs: wait_for_stage_4_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Monitor Elevate for Stage 5 Reboot + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + timeout: 45m + command_timeout: 35m + script: | + /scripts/status_marker 4 + tail -n40 -F /var/log/elevate-cpanel.log & + sleep .5 + REBOOT_STRING="Rebooting into stage 5 of 5" RETVAL=1 /scripts/reboot_watch + + wait_for_stage_5_reboot: + runs-on: self-hosted + needs: watch_for_stage_5_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Wait For VM to Come Back From Stage 5 Reboot + working-directory: "./.github/workflows/openstack/" + run: | + ./ssh_retry ${{ steps.VM_IP.outputs.VM_IP }} + + watch_for_final_reboot: + runs-on: self-hosted + needs: wait_for_stage_5_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Monitor Elevate for Final Reboot + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + timeout: 45m + command_timeout: 35m + script: | + /scripts/status_marker 5 + tail -n40 -F /var/log/elevate-cpanel.log & + sleep 2.5 + SKIP_PID_CHECK=1 REBOOT_STRING="Doing final reboot" RETVAL=1 /scripts/reboot_watch + + wait_for_final_reboot: + runs-on: self-hosted + needs: watch_for_final_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Wait For VM to Come Back From Final Reboot + working-directory: "./.github/workflows/openstack/" + run: | + ./ssh_retry ${{ steps.VM_IP.outputs.VM_IP }} + + verify_upgraded_os: + runs-on: self-hosted + needs: wait_for_final_reboot + outputs: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + steps: + - name: Download VM IP + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-vm_ip + path: ${{ github.workspace }}/ + + - name: Get VM IP from Artifact + id: VM_IP + run: | + echo "VM_IP=$(cat ${{ github.run_id }}-vm_ip)" >> "$GITHUB_OUTPUT" + cat ${{ github.run_id }}-vm_ip > VM_IP + + - name: Export VM_IP to env + env: + VM_IP: ${{ steps.VM_IP.outputs.VM_IP }} + run: echo "VM_IP is ${{ steps.VM_IP.outputs.VM_IP }}" + - name: Verify End Result Integration Tests + uses: appleboy/ssh-action@v1.1.0 + with: + host: ${{ steps.VM_IP.outputs.VM_IP }} + username: 'root' + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: '22' + timeout: 5m + command_timeout: 1m + script: | + REPODIR=$(echo ${{ github.repository }} | cut -d / -f2) + /usr/local/cpanel/3rdparty/bin/prove -lvm /opt/${REPODIR}/t/integration/ubuntu7-to-almalinux8/*.t + /usr/local/cpanel/3rdparty/bin/prove -lvm /opt/${REPODIR}/t/integration/*.t + + terraform_openstack_destroy: + runs-on: self-hosted + needs: verify_upgraded_os + defaults: + run: + working-directory: "${{ github.workspace }}/.github/workflows/openstack/ubuntu-20.04" + steps: + - name: Download Terraform State + uses: actions/download-artifact@v4.1.8 + with: + name: ${{ github.run_id }}-ubuntu20-terraform.tfstate + path: "${{ github.workspace }}/.github/workflows/openstack/ubuntu-20.04/terraform" + + + - name: Stage Files & Show Artifact Paths + run: | + cd ${{ github.workspace }}/.github/workflows/openstack/ubuntu-20.04/terraform/ + mv -v terraform.lock.hcl .terraform.lock.hcl + find ${{ github.workspace }}/.github/workflows/openstack/ubuntu-20.04/ + + - name: Initialize Terraform & Destroy + run: | + cd ${{ github.workspace }}/.github/workflows/openstack/ubuntu-20.04/terraform/ + rm -Rfv .terraform || true + terraform init + terraform destroy -no-color -auto-approve