CI/CD Pipeline #16
Workflow file for this run
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: 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_LFS_SKIP_SMUDGE=1 is to avoid downloading large files with git lfs | |
GIT_LFS_SKIP_SMUDGE=1 git fetch origin +refs/pull/*:refs/remotes/origin/pr/* | |
echo "Checking out appropriate branch..." | |
if [ "${{ github.event_name }}" = "pull_request" ]; then | |
GIT_LFS_SKIP_SMUDGE=1 git checkout ${{ github.sha }} | |
elif [ "${{ github.event_name }}" = "push" ] && [ "${{ github.ref }}" = "refs/heads/main" ]; then | |
GIT_LFS_SKIP_SMUDGE=1 git checkout main | |
GIT_LFS_SKIP_SMUDGE=1 git pull origin main | |
else | |
GIT_LFS_SKIP_SMUDGE=1 git checkout ${{ github.ref }} | |
fi | |
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 # 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.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 | |
echo "Building project..." | |
cd build/Release | |
make clean | |
make -j 4 | |
' || { echo "Build project step failed"; exit 1; } | |
EOF | |
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 ' | |
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 |