Skip to content

Integration Test

Integration Test #82

name: Integration Test On Custom Infra
on:
workflow_dispatch:
inputs:
baseFolderPath:
description: 'Base folder path for diffs'
required: true
default: 'diffs'
dynamicCoordinates:
description: 'Array of booleans for dynamic coordinates (e.g., [true, false])'
required: true
default: '[true, false]'
location:
description: 'Azure Region'
required: true
default: 'eastus'
vm_name:
description: 'VM Name'
required: true
default: 'integration-test-vm'
repo_refs:
description: 'Repo refs in format "clearlydefined/service:master,clearlydefined/crawler:master"'
required: true
default: 'clearlydefined/docker_dev_env_experiment:main,clearlydefined/service:master,clearlydefined/crawler:master,clearlydefined/website:master'
permissions:
contents: read
env:
REPOS: |
clearlydefined/service
clearlydefined/crawler
clearlydefined/website
COMPOSE_REPO: "clearlydefined/docker_dev_env_experiment"
jobs:
deploy-and-run:
runs-on: ubuntu-latest
# Add permissions for the GitHub token
permissions:
contents: read
packages: read
outputs:
vm_ip: ${{ steps.create_vm.outputs.publicIpAddress }}
steps:
- name: Azure Login
uses: azure/[email protected]
with:
creds: ${{ secrets.VM_INT_AZURE_CREDENTIALS }}
- name: Cleanup VM and Resources
uses: azure/[email protected]
with:
inlineScript: az group list --query "[].name"
- name: Create VM with NSG
id: create_vm
uses: azure/arm-deploy@v2
with:
scope: resourcegroup
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
resourceGroupName: integration-test-vm
template: |
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {
"vmName": "${{ github.event.inputs.vm_name }}",
"nsgName": "${{ github.event.inputs.vm_name }}-nsg"
},
"resources": [
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2021-02-01",
"name": "[variables('nsgName')]",
"location": "[resourceGroup().location]",
"properties": {
"securityRules": [
{
"name": "allow-ssh",
"properties": {
"priority": 1000,
"protocol": "Tcp",
"access": "Allow",
"direction": "Inbound",
"sourceAddressPrefix": "*",
"sourcePortRange": "*",
"destinationAddressPrefix": "*",
"destinationPortRange": "22"
}
},
{
"name": "allow-4000",
"properties": {
"priority": 1010,
"protocol": "Tcp",
"access": "Allow",
"direction": "Inbound",
"sourceAddressPrefix": "*",
"sourcePortRange": "*",
"destinationAddressPrefix": "*",
"destinationPortRange": "4000"
}
}
]
}
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2021-03-01",
"name": "[variables('vmName')]",
"location": "[resourceGroup().location]",
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', variables('nsgName'))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "Standard_D16_v5"
},
"osProfile": {
"computerName": "[variables('vmName')]",
"adminUsername": "azureuser",
"linuxConfiguration": {
"disablePasswordAuthentication": true,
"ssh": {
"publicKeys": [
{
"path": "/home/azureuser/.ssh/authorized_keys",
"keyData": "${{ secrets.SSH_PUBLIC_KEY }}"
}
]
}
}
},
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "0001-com-ubuntu-server-jammy",
"sku": "22_04-lts",
"version": "latest"
}
},
"networkProfile": {
"networkInterfaces": [
{
"properties": {
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('nsgName'))]"
}
}
}
]
}
}
}
],
"outputs": {
"publicIpAddress": {
"type": "string",
"value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', concat(variables('vmName'), '-ip'))).ipAddress]"
}
}
}
- name: Install Docker
uses: appleboy/ssh-action@master
with:
host: ${{ steps.create_vm.outputs.publicIpAddress }}
username: azureuser
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- name: Clone Repos and Setup Environment
uses: appleboy/ssh-action@master
env:
GITHUB_TOKEN: ${{ github.token }}
REPO_REFS: ${{ inputs.repo_refs }}
with:
host: ${{ steps.create_vm.outputs.publicIpAddress }}
username: azureuser
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: GITHUB_TOKEN,REPO_REFS
script: |
# Function to get ref for a repo
get_ref() {
echo "$REPO_REFS" | tr ',' '\n' | grep "^$1:" | cut -d':' -f2 || echo "master"
}
# First clone the compose repo
COMPOSE_REPO="${{ env.COMPOSE_REPO }}"
COMPOSE_REF=$(get_ref "$COMPOSE_REPO")
echo "Cloning compose repo https://github.com/${COMPOSE_REPO}.git branch/ref: ${COMPOSE_REF}"
git clone "https://github.com/${COMPOSE_REPO}.git" -b "$COMPOSE_REF"
# Navigate to compose repo
REPO_NAME=$(echo ${COMPOSE_REPO} | cut -d'/' -f2)
cd $REPO_NAME
# Clone other repositories inside the compose repo directory
echo "${{ env.REPOS }}" | while read repo; do
if [ ! -z "$repo" ] && [ "$repo" != "$COMPOSE_REPO" ]; then
REF=$(get_ref "$repo")
echo "Cloning https://github.com/${repo}.git branch/ref: ${REF}"
git clone "https://github.com/${repo}.git" -b "$REF"
fi
done
# Copy sample_env to .env and replace tokens
cp sample_env .env
# Replace both GitHub tokens with the provided token
sed -i "s/^CRAWLER_GITHUB_TOKEN=.*/CRAWLER_GITHUB_TOKEN=${GITHUB_TOKEN}/" .env
sed -i "s/^CURATION_GITHUB_TOKEN=.*/CURATION_GITHUB_TOKEN=${GITHUB_TOKEN}/" .env
# Start containers
sudo docker-compose up -d
test:
runs-on: ubuntu-latest
needs: deploy-and-run
env:
DEV_API_BASE_URL: http://${{ needs.deploy-and-run.outputs.vm_ip }}:4000
strategy:
max-parallel: 1
matrix:
dynamicCoordinates: ${{ fromJson(github.event.inputs.dynamicCoordinates) }}
defaults:
run:
working-directory: ./tools/integration
steps:
- uses: actions/[email protected]
- uses: actions/[email protected]
with:
node-version: 18
cache: 'npm'
cache-dependency-path: './tools/integration/'
- name: Install dependencies
run: npm ci
- name: Run tests on tools
run: npm test
- name: Trigger harvest and verify completion
run: DEV_API_BASE_URL=${{ env.DEV_API_BASE_URL }} DYNAMIC_COORDINATES=${{ matrix.dynamicCoordinates }} npm run e2e-test-harvest
- name: Verify service functions
id: verify-service-functions
continue-on-error: true
run: DEV_API_BASE_URL=${{ env.DEV_API_BASE_URL }} DYNAMIC_COORDINATES=${{ matrix.dynamicCoordinates }} npm run e2e-test-service
- name: Generate structured diffs
run: DEV_API_BASE_URL=${{ env.DEV_API_BASE_URL }} DYNAMIC_COORDINATES=${{ matrix.dynamicCoordinates }} npm run definitions-diff ${{ github.event.inputs.baseFolderPath }}
- name: Upload diffs artifact
uses: actions/upload-artifact@v4
with:
name: diffs-${{ matrix.dynamicCoordinates == 'true' && 'dynamic' || 'static' }}
path: ./tools/integration/${{ github.event.inputs.baseFolderPath }}
- name: Mark build status
if: steps.verify-service-functions.outcome == 'failure'
run: exit 1