Skip to content

CI/CD Pipeline

CI/CD Pipeline #23

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 # 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
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
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
uses: actions/checkout@v4
- name: Build Release
uses: ./.github/actions/build-action
with:
build-type: Release
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
steps:
- name: Checkout code # Just to get required actions in .github/
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
run: |
ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
cd ~/aperi-mech
docker-compose -f docker-compose.yml run --rm aperi-mech-development /bin/bash -c '
cd ~/aperi-mech/build/Release
./unit_tests
' || { echo "Unit tests step failed"; exit 1; }
EOF
- name: Run material tests
run: |
ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
cd ~/aperi-mech
docker-compose -f docker-compose.yml run --rm aperi-mech-development /bin/bash -c '
cd ~/aperi-mech/build/Release
make run_material_tests
' || { echo "Material tests step failed"; exit 1; }
EOF
- name: Run utils modules tests
run: |
ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
cd ~/aperi-mech
docker-compose -f docker-compose.yml run --rm aperi-mech-development /bin/bash -c '
# Activate Spack environment
. ~/spack/share/spack/setup-env.sh
spack env activate aperi-mech
# Add aperi-mech build directory to PATH
export PATH=$PATH:~/aperi-mech/build/Release
# Run utils modules tests
cd ~/aperi-mech/build/Release
make run_utils_modules_tests
' || { echo "Utils modules tests step failed"; exit 1; }
EOF
- name: Run unit tests in parallel
run: |
ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
cd ~/aperi-mech
docker-compose -f docker-compose.yml run --rm aperi-mech-development /bin/bash -c '
cd ~/aperi-mech/build/Release
. ~/spack/share/spack/setup-env.sh
spack env activate aperi-mech
mpirun -np 3 ./unit_tests
' || { echo "Unit tests in parallel step failed"; exit 1; }
EOF
# 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: 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: Build project, Debug
# run: |
# ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
# cd ~/aperi-mech
# docker-compose -f docker-compose.yml run --rm aperi-mech-development /bin/bash -c '
# cd ~/aperi-mech
# echo "Setting up Spack environment..."
# . ~/spack/share/spack/setup-env.sh
# echo "Configuring project..."
# ./do_configure --build-type Debug
# echo "Building project..."
# cd build/Debug
# make clean
# make -j 4
# ' || { echo "Build project step failed"; exit 1; }
# EOF
# 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
# steps:
# - name: Checkout code # Just to get required actions in .github/
# 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, Debug
# run: |
# ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
# cd ~/aperi-mech
# docker-compose -f docker-compose.yml run --rm aperi-mech-development /bin/bash -c '
# cd ~/aperi-mech/build/Debug
# make run_all_unit_tests
# ' || { echo "Unit tests step failed"; exit 1; }
# EOF
# - name: Run unit tests in parallel, Debug
# run: |
# ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
# cd ~/aperi-mech
# docker-compose -f docker-compose.yml run --rm aperi-mech-development /bin/bash -c '
# cd ~/aperi-mech/build/Debug
# . ~/spack/share/spack/setup-env.sh
# spack env activate aperi-mech
# mpirun -np 3 ./unit_tests
# ' || { echo "Unit tests in parallel step failed"; exit 1; }
# EOF
# 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: 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: Build project
# run: |
# ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
# cd ~/aperi-mech
# docker-compose -f docker-compose_nvidia_t4_gpu.yml run --rm aperi-mech-gpu-development /bin/bash -c '
# cd ~/aperi-mech
# echo "Setting up Spack environment..."
# . ~/spack/share/spack/setup-env.sh
# echo "Configuring project..."
# ./do_configure --gpu --spack-env aperi-mech
# echo activate aperi-mech
# spack env activate aperi-mech
# echo "Building project..."
# cd build/Release_gpu
# make clean
# make -j 4
# ' || { echo "Build project step failed"; exit 1; }
# EOF
# 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
# steps:
# - name: Checkout code # Just to get required actions in .github/
# 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, GPU
# run: |
# ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
# cd ~/aperi-mech
# docker-compose -f docker-compose_nvidia_t4_gpu.yml run --rm aperi-mech-gpu-development /bin/bash -c '
# cd ~/aperi-mech/build/Release_gpu
# make run_all_unit_tests
# ' || { echo "Unit tests step failed"; exit 1; }
# EOF
# 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: 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: Build project, Debug, GPU
# run: |
# ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
# cd ~/aperi-mech
# docker-compose -f docker-compose_nvidia_t4_gpu.yml run --rm aperi-mech-gpu-development /bin/bash -c '
# cd ~/aperi-mech
# echo "Setting up Spack environment..."
# . ~/spack/share/spack/setup-env.sh
# echo "Configuring project..."
# ./do_configure --gpu --spack-env aperi-mech --build-type Debug
# echo activate aperi-mech
# spack env activate aperi-mech
# echo "Building project..."
# cd build/Debug_gpu
# make clean
# make -j 4
# ' || { echo "Build project step failed"; exit 1; }
# EOF
# 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
# steps:
# - name: Checkout code # Just to get required actions in .github/
# 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, Debug, GPU
# run: |
# ssh -T -o ConnectTimeout=10 ${{ secrets.VM_USERNAME }}@${{ secrets.VM_IP }} << 'EOF'
# cd ~/aperi-mech
# docker-compose -f docker-compose_nvidia_t4_gpu.yml run --rm aperi-mech-gpu-development /bin/bash -c '
# cd ~/aperi-mech/build/Debug_gpu
# make run_all_unit_tests
# ' || { echo "Unit tests step failed"; exit 1; }
# EOF
teardown:
runs-on: ubuntu-latest
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