Add a CI pipeline to validate elevate with cloudlinux #252
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: Openstack Test Run | |
on: | |
push: | |
branches: | |
- "main" | |
- '!docs' | |
tags-ignore: | |
- "*" | |
pull_request: | |
workflow_dispatch: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }}-openstack | |
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_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/workflows/openstack/terraform" | |
jobs: | |
testsuite: | |
uses: ./.github/workflows/testsuite.yml | |
terraform_openstack_create: | |
needs: [testsuite] | |
runs-on: self-hosted | |
defaults: | |
run: | |
working-directory: "./.github/workflows/openstack/terraform" | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Terraform fmt | |
id: fmt | |
run: | | |
terraform fmt -check | |
continue-on-error: true | |
- name: DEBUGVAR | |
id: debugvar | |
run: | | |
env | awk 'tolower($0)~/auth|project_name/' | |
- name: Terraform Init | |
id: init | |
run: | | |
terraform init | |
- name: Terraform Plan | |
id: plan | |
run: | | |
terraform plan -no-color | |
- name: Terraform Apply | |
id: apply | |
run: | | |
terraform apply -no-color -auto-approve | |
- 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 JSON Output | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ github.run_id }}-tf.out.json | |
path: ${{ github.workspace }}/ | |
overwrite: true | |
- name: Upload VM Output | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ github.run_id }}-vm_ip | |
path: ${{ github.workspace }}/ | |
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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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/[email protected] | |
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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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 | |
chmod -v +x /scripts/elevate-cpanel | |
/usr/local/cpanel/cpkeyclt | |
/scripts/elevate-cpanel --non-interactive --skip-cpanel-version-check --start & | |
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 | |
with: | |
name: ${{ github.run_id }}-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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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 | |
/scripts/elevate-cpanel --log & | |
sleep 1.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 | |
with: | |
name: ${{ github.run_id }}-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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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 | |
/scripts/elevate-cpanel --log & | |
sleep 1.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 | |
with: | |
name: ${{ github.run_id }}-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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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 | |
/scripts/elevate-cpanel --log & | |
sleep 1.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 | |
with: | |
name: ${{ github.run_id }}-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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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 | |
/scripts/elevate-cpanel --log & | |
sleep 1.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 | |
with: | |
name: ${{ github.run_id }}-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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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 | |
/scripts/elevate-cpanel --log & | |
sleep 1.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 | |
with: | |
name: ${{ github.run_id }}-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 | |
with: | |
name: ${{ github.run_id }}-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/[email protected] | |
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/*.t | |
terraform_openstack_destroy: | |
runs-on: self-hosted | |
needs: verify_upgraded_os | |
defaults: | |
run: | |
working-directory: "./.github/workflows/openstack/terraform" | |
steps: | |
- name: Download Terraform Output JSON | |
uses: actions/download-artifact@v4 | |
with: | |
name: ${{ github.run_id }}-tf.out.json | |
path: ${{ github.workspace }}/tf.out.json | |
- name: Destroy OpenStack VM | |
run: terraform destroy -no-color -auto-approve |