Skip to content

CI/CD Pipeline

CI/CD Pipeline #41

Workflow file for this run

name: CI/CD Pipeline
on:
pull_request:
branches:
- main
push:
branches:
- main
workflow_dispatch: ~ # Allows manual triggering of the workflow
permissions:
contents: read
concurrency:
group: vm-ci-cd
cancel-in-progress: false
jobs:
setup:
name: Setup
runs-on: ubuntu-latest
outputs:
vm_started: ${{ steps.vm-status.outputs.vm_started }}
steps:
- name: Checkout Code on Runner # Just to get required actions in .github/. The actual code checkout is done on the VM
uses: actions/checkout@v4
- name: Access Azure VM
id: vm-status
uses: azure/CLI@v2
with:
azcliversion: 2.62.0
inlineScript: |
echo "Logging into Azure..."
az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
if [ $? -eq 0 ]; then
echo "Logged in successfully"
else
echo "Failed to login"
exit 1
fi
echo "Setting Azure subscription..."
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
if [ $? -eq 0 ]; then
echo "Subscription set successfully"
else
echo "Failed to set subscription"
exit 1
fi
echo "Checking if VM is running..."
VM_STATUS=$(az vm get-instance-view --resource-group ${{ secrets.AZURE_RESOURCE_GROUP }} --name ${{ secrets.AZURE_VM_NAME }} --query instanceView.statuses[1].displayStatus --output tsv)
if [ "$VM_STATUS" != "VM running" ]; then
echo "Starting VM..."
az vm start --resource-group ${{ secrets.AZURE_RESOURCE_GROUP }} --name ${{ secrets.AZURE_VM_NAME }}
echo "vm_started=true" >> $GITHUB_OUTPUT
else
echo "VM is already running"
echo "vm_started=false" >> $GITHUB_OUTPUT
fi
- name: Common SSH and Azure CLI Setup
uses: ./.github/actions/common-steps
with:
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Checkout Code on VM
run: |
ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
cd ~/aperi-mech
echo "Fetching git branches..."
git fetch origin +refs/pull/*:refs/remotes/origin/pr/*
echo "Checking out appropriate branch..."
if [ "${{ github.event_name }}" = "pull_request" ]; then
git checkout ${{ github.sha }}
elif [ "${{ github.event_name }}" = "push" ] && [ "${{ github.ref }}" = "refs/heads/main" ]; then
git checkout main
git pull origin main
else
git checkout ${{ github.ref }}
fi
git lfs pull # Pull LFS files
rm -rf build # Remove build directory, this prevents some false positives in tests
EOF
build-release:
name: Build Release
runs-on: ubuntu-latest
needs: setup
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
steps:
- name: Checkout Code on Runner # Just to get required actions in .github/. The actual code checkout is done on the VM
uses: actions/checkout@v4
- name: Build Release
uses: ./.github/actions/build-action
with:
build-type: Release
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: false
build-debug:
name: Build Debug
runs-on: ubuntu-latest
needs: setup
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
steps:
- name: Checkout code # Just to get required actions in .github/
uses: actions/checkout@v4
- name: Build Debug
uses: ./.github/actions/build-action
with:
build-type: Debug
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: false
build-release-gpu:
name: Build Release, GPU
runs-on: ubuntu-latest
needs: [setup, build-release, test-release]
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
steps:
- name: Checkout code # Just to get required actions in .github/
uses: actions/checkout@v4
- name: Build Release, GPU
uses: ./.github/actions/build-action
with:
build-type: Release
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: true
build-debug-gpu:
name: Build Debug, GPU
runs-on: ubuntu-latest
needs: [setup, build-debug, test-debug]
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
steps:
- name: Checkout code # Just to get required actions in .github/
uses: actions/checkout@v4
- name: Build Debug, GPU
uses: ./.github/actions/build-action
with:
build-type: Debug
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: true
test-release:
name: Test Release
runs-on: ubuntu-latest
needs: [setup, build-release]
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
env:
BUILD_TYPE: Release
GPU: false
steps:
- name: Checkout Code on Runner # Just to get required actions in .github/. The actual code checkout is done on the VM
uses: actions/checkout@v4
- name: Common SSH and Azure CLI Setup
uses: ./.github/actions/common-steps
with:
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Run unit tests
uses: ./.github/actions/run-unit-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
num-processes: 1
- name: Run unit tests, parallel
uses: ./.github/actions/run-unit-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
num-processes: 3
- name: Run material tests
uses: ./.github/actions/run-material-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
- name: Run utils modules tests
uses: ./.github/actions/run-utils-modules-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
test-debug:
name: Test Debug
runs-on: ubuntu-latest
needs: [setup, build-debug]
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
env:
BUILD_TYPE: Debug
GPU: false
steps:
- name: Checkout Code on Runner # Just to get required actions in .github/. The actual code checkout is done on the VM
uses: actions/checkout@v4
- name: Common SSH and Azure CLI Setup
uses: ./.github/actions/common-steps
with:
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Run unit tests
uses: ./.github/actions/run-unit-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
num-processes: 1
- name: Run unit tests, parallel
uses: ./.github/actions/run-unit-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
num-processes: 3
- name: Run material tests
uses: ./.github/actions/run-material-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
- name: Run utils modules tests
uses: ./.github/actions/run-utils-modules-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
test-release-gpu:
name: Test Release, GPU
runs-on: ubuntu-latest
needs: [setup, build-release-gpu]
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
env:
BUILD_TYPE: Release
GPU: true
steps:
- name: Checkout Code on Runner # Just to get required actions in .github/. The actual code checkout is done on the VM
uses: actions/checkout@v4
- name: Common SSH and Azure CLI Setup
uses: ./.github/actions/common-steps
with:
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Run unit tests
uses: ./.github/actions/run-unit-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
num-processes: 1
- name: Run material tests
uses: ./.github/actions/run-material-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
- name: Run utils modules tests
uses: ./.github/actions/run-utils-modules-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
test-debug-gpu:
name: Test Debug, GPU
runs-on: ubuntu-latest
needs: [setup, build-debug-gpu]
concurrency:
group: build-and-test-vm-ci-cd
cancel-in-progress: false
env:
BUILD_TYPE: Debug
GPU: true
steps:
- name: Checkout Code on Runner # Just to get required actions in .github/. The actual code checkout is done on the VM
uses: actions/checkout@v4
- name: Common SSH and Azure CLI Setup
uses: ./.github/actions/common-steps
with:
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Run unit tests
uses: ./.github/actions/run-unit-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
num-processes: 1
- name: Run material tests
uses: ./.github/actions/run-material-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
- name: Run utils modules tests
uses: ./.github/actions/run-utils-modules-tests
with:
build-type: ${{ env.BUILD_TYPE }}
VM_IP: ${{ secrets.VM_IP }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
VM_USERNAME: ${{ secrets.VM_USERNAME }}
gpu: ${{ env.GPU }}
teardown:
runs-on: ubuntu-latest
name: Teardown
needs: [
setup,
build-release,
test-release,
build-debug,
test-debug,
build-release-gpu,
test-release-gpu,
build-debug-gpu,
test-debug-gpu,
]
steps:
# For debugging purposes
- name: Print VM status
if: always()
run: |
echo "VM started: ${{ needs.setup.outputs.vm_started }}"
- name: Stop Azure VM
if: always() && needs.setup.outputs.vm_started == 'true'
uses: azure/CLI@v2
with:
azcliversion: 2.62.0
inlineScript: |
echo "Logging into Azure..."
az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
if [ $? -eq 0 ]; then
echo "Logged in successfully"
else
echo "Failed to login"
exit 1
fi
echo "Setting Azure subscription..."
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
if [ $? -eq 0 ]; then
echo "Subscription set successfully"
else
echo "Failed to set subscription"
exit 1
fi
echo "Deallocating VM..."
az vm deallocate --resource-group ${{ secrets.AZURE_RESOURCE_GROUP }} --name ${{ secrets.AZURE_VM_NAME }}
if [ $? -eq 0 ]; then
echo "VM deallocated successfully"
else
echo "Failed to deallocate VM"
exit 1
fi