Add support for RedHat 9 #139
Workflow file for this run
This file contains hidden or 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: Docker Pipeline | |
# To run all containers (one after another): | |
# ./run_all_containers.sh | |
# Or to run individual containers: | |
# sudo act --bind --workflows .github/workflows/docker.yml --job build-22-04 --secret-file .env | |
# or | |
# sudo act --bind --workflows .github/workflows/docker.yml --job build-24-04 --secret-file .env | |
# or | |
# sudo act --bind --workflows .github/workflows/docker.yml --job build-d12-10 --secret-file .env | |
# or | |
# sudo act --bind --workflows .github/workflows/docker.yml --job build-rhel9 --secret-file .env | |
on: | |
workflow_dispatch: | |
inputs: | |
azure_region: | |
description: 'Azure region to deploy resources' | |
required: true | |
default: 'centralus' | |
type: choice | |
options: | |
- centralus | |
- eastus | |
- eastus2 | |
- westus | |
- westus2 | |
- westus3 | |
- northcentralus | |
- southcentralus | |
- canadacentral | |
- canadaeast | |
- uksouth | |
- ukwest | |
- northeurope | |
- westeurope | |
pull_request: | |
branches: | |
- '*' | |
jobs: | |
build-22-04: | |
runs-on: self-hosted | |
env: | |
UNIQUE_ID: ${{ github.run_number }}_ubuntu2204_${{ github.run_id }} | |
BRANCH_NAME: ${{ github.head_ref || github.ref_name }} | |
CONTAINER_TYPE: "22.04" | |
AZURE_IP: "" | |
IP_ADDRESS: "" | |
steps: | |
- name: Generate random number | |
shell: bash | |
run: | | |
RANDOM_NUM=$(shuf -i 1000000000-9999999999 -n 1) | |
echo "UNIQUE_ID=${RANDOM_NUM}_ubuntu2204_${{ github.run_number }}" >> $GITHUB_ENV | |
- name: Checkout repository | |
uses: actions/[email protected] | |
- name: Get branch name | |
shell: bash | |
run: | | |
if [ "${{ github.event_name }}" == "pull_request" ]; then | |
echo "BRANCH_NAME=${{ github.head_ref }}" >> $GITHUB_ENV | |
else | |
echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV | |
fi | |
- name: Set the environment for docker compose | |
run: | | |
cd testing/v2/development | |
echo "HOST_UID=$(id -u)" > .env | |
echo "HOST_GID=$(id -g)" >> .env | |
echo "HOST_IP=10.1.0.5" >> .env | |
PUBLIC_IP=$(curl -s https://api.ipify.org) | |
echo "IP_ADDRESS=$PUBLIC_IP" >> $GITHUB_ENV | |
- name: Start pipeline container | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} up -d pipeline | |
- name: Install Python requirements | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers/azure && \ | |
pip install -r requirements.txt | |
" | |
- name: Build an Azure instance | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T \ | |
-e AZURE_CLIENT_ID \ | |
-e AZURE_CLIENT_SECRET \ | |
-e AZURE_TENANT_ID \ | |
-e AZURE_SUBSCRIPTION_ID \ | |
pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
python3 ./azure/build_azure_linux_network.py \ | |
-g pipe-${{ env.UNIQUE_ID }} \ | |
-s 0.0.0.0/0 \ | |
-vs Standard_B4s_v2 \ | |
-l ${{ inputs.azure_region || 'centralus' }} \ | |
-ast 23:00 \ | |
-y | |
" | |
#-s ${{ env.IP_ADDRESS }}/32 \ | |
- name: Retrieve Azure IP | |
run: | | |
cd testing/v2/development | |
AZURE_IP=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.ip.txt") | |
echo "AZURE_IP=$AZURE_IP" >> $GITHUB_ENV | |
echo "Azure IP: $AZURE_IP" | |
echo "Azure IP retrieved successfully" | |
- name: Retrieve Azure Password | |
run: | | |
cd testing/v2/development | |
AZURE_PASS=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt") | |
echo "AZURE_PASS=$AZURE_PASS" >> $GITHUB_ENV | |
echo "Azure Password retrieved successfully" | |
# wait for the azure instance to be ready | |
- name: Wait for Azure instance to be ready | |
run: | | |
sleep 30 | |
- name: Copy SSH Key to Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
./lib/copy_ssh_key.sh lme-user ${{ env.AZURE_IP }} /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt | |
" | |
- name: Clone repository on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
if [ ! -d LME ]; then | |
git clone https://github.com/cisagov/LME.git; | |
fi | |
cd LME | |
if [ \"${{ env.BRANCH_NAME }}\" != \"main\" ]; then | |
git fetch | |
git checkout ${{ env.BRANCH_NAME }} | |
fi | |
' | |
" | |
- name: Install Docker on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS 'chmod +x ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo usermod -aG docker \$USER && \ | |
sudo systemctl enable docker && \ | |
sudo systemctl start docker' | |
" | |
- name: Install test prerequisites on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd LME/testing/tests && \ | |
sudo apt-get update && \ | |
sudo apt-get install -y python3.10-venv && \ | |
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \ | |
sudo apt install -y ./google-chrome-stable_current_amd64.deb && \ | |
python3 -m venv venv && \ | |
source venv/bin/activate && \ | |
pip install -r requirements.txt | |
' | |
" | |
- name: Test Docker container | |
run: | | |
cd testing/v2/development | |
# Set environment | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
echo \"HOST_IP=10.1.0.5\" > .env | |
' | |
" | |
# Build container | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose up -d | |
' | |
" | |
# Deploy LME | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose exec -T lme bash -c \"NON_INTERACTIVE=true AUTO_CREATE_ENV=true /root/LME/install.sh -i 10.1.0.5 -d\" | |
' | |
" | |
# Extract passwords | |
ES_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^elastic=\" | cut -d= -f2- | |
' | |
") | |
KIBANA_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^kibana_system=\" | cut -d= -f2- | |
' | |
") | |
# Run tests | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
sleep 360 | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/testing/tests | |
echo \"Container: ${{ env.CONTAINER_TYPE }}\" > .env | |
echo \"ELASTIC_PASSWORD=$ES_PASSWORD\" >> .env | |
echo \"KIBANA_PASSWORD=$KIBANA_PASSWORD\" >> .env | |
echo \"elastic=$ES_PASSWORD\" >> .env | |
source venv/bin/activate | |
echo \"Running tests for container ${{ env.CONTAINER_TYPE }}\" | |
pytest -v api_tests/linux_only/ selenium_tests/linux_only/ | |
' | |
" | |
- name: Cleanup Azure resources | |
if: always() | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_SECRET --tenant $AZURE_TENANT | |
az group delete --name pipe-${{ env.UNIQUE_ID }} --yes --no-wait | |
" | |
- name: Stop and remove containers | |
if: always() | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} down | |
docker system prune -af | |
build-24-04: | |
runs-on: self-hosted | |
env: | |
UNIQUE_ID: ${{ github.run_number }}_ubuntu2404_${{ github.run_id }} | |
BRANCH_NAME: ${{ github.head_ref || github.ref_name }} | |
CONTAINER_TYPE: "24.04" | |
AZURE_IP: "" | |
IP_ADDRESS: "" | |
steps: | |
- name: Generate random number | |
shell: bash | |
run: | | |
RANDOM_NUM=$(shuf -i 1000000000-9999999999 -n 1) | |
echo "UNIQUE_ID=${RANDOM_NUM}_ubuntu2404_${{ github.run_number }}" >> $GITHUB_ENV | |
- name: Checkout repository | |
uses: actions/[email protected] | |
- name: Get branch name | |
shell: bash | |
run: | | |
if [ "${{ github.event_name }}" == "pull_request" ]; then | |
echo "BRANCH_NAME=${{ github.head_ref }}" >> $GITHUB_ENV | |
else | |
echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV | |
fi | |
- name: Set the environment for docker compose | |
run: | | |
cd testing/v2/development | |
echo "HOST_UID=$(id -u)" > .env | |
echo "HOST_GID=$(id -g)" >> .env | |
echo "HOST_IP=10.1.0.5" >> .env | |
PUBLIC_IP=$(curl -s https://api.ipify.org) | |
echo "IP_ADDRESS=$PUBLIC_IP" >> $GITHUB_ENV | |
- name: Start pipeline container | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} up -d pipeline | |
- name: Install Python requirements | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers/azure && \ | |
pip install -r requirements.txt | |
" | |
- name: Build an Azure instance | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T \ | |
-e AZURE_CLIENT_ID \ | |
-e AZURE_CLIENT_SECRET \ | |
-e AZURE_TENANT_ID \ | |
-e AZURE_SUBSCRIPTION_ID \ | |
pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
python3 ./azure/build_azure_linux_network.py \ | |
-g pipe-${{ env.UNIQUE_ID }} \ | |
-s 0.0.0.0/0 \ | |
-vs Standard_B4s_v2 \ | |
-l ${{ inputs.azure_region || 'centralus' }} \ | |
-ast 23:00 \ | |
-y | |
" | |
#-s ${{ env.IP_ADDRESS }}/32 \ | |
- name: Retrieve Azure IP | |
run: | | |
cd testing/v2/development | |
AZURE_IP=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.ip.txt") | |
echo "AZURE_IP=$AZURE_IP" >> $GITHUB_ENV | |
echo "Azure IP: $AZURE_IP" | |
echo "Azure IP retrieved successfully" | |
- name: Retrieve Azure Password | |
run: | | |
cd testing/v2/development | |
AZURE_PASS=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt") | |
echo "AZURE_PASS=$AZURE_PASS" >> $GITHUB_ENV | |
echo "Azure Password retrieved successfully" | |
# wait for the azure instance to be ready | |
- name: Wait for Azure instance to be ready | |
run: | | |
sleep 30 | |
- name: Copy SSH Key to Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
./lib/copy_ssh_key.sh lme-user ${{ env.AZURE_IP }} /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt | |
" | |
- name: Clone repository on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
if [ ! -d LME ]; then | |
git clone https://github.com/cisagov/LME.git; | |
fi | |
cd LME | |
if [ \"${{ env.BRANCH_NAME }}\" != \"main\" ]; then | |
git fetch | |
git checkout ${{ env.BRANCH_NAME }} | |
fi | |
' | |
" | |
- name: Install Docker on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS 'chmod +x ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo usermod -aG docker \$USER && \ | |
sudo systemctl enable docker && \ | |
sudo systemctl start docker' | |
" | |
- name: Install test prerequisites on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd LME/testing/tests && \ | |
sudo apt-get update && \ | |
sudo apt-get install -y python3.10-venv && \ | |
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \ | |
sudo apt install -y ./google-chrome-stable_current_amd64.deb && \ | |
python3 -m venv venv && \ | |
source venv/bin/activate && \ | |
pip install -r requirements.txt | |
' | |
" | |
- name: Test Docker container | |
run: | | |
cd testing/v2/development | |
# Set environment | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
echo \"HOST_IP=10.1.0.5\" > .env | |
' | |
" | |
# Build container | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose up -d | |
' | |
" | |
# Deploy LME | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose exec -T lme bash -c \"NON_INTERACTIVE=true AUTO_CREATE_ENV=true /root/LME/install.sh -i 10.1.0.5 -d\" | |
' | |
" | |
# Extract passwords | |
ES_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^elastic=\" | cut -d= -f2- | |
' | |
") | |
KIBANA_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^kibana_system=\" | cut -d= -f2- | |
' | |
") | |
# Run tests | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
sleep 360 | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/testing/tests | |
echo \"Container: ${{ env.CONTAINER_TYPE }}\" > .env | |
echo \"ELASTIC_PASSWORD=$ES_PASSWORD\" >> .env | |
echo \"KIBANA_PASSWORD=$KIBANA_PASSWORD\" >> .env | |
echo \"elastic=$ES_PASSWORD\" >> .env | |
source venv/bin/activate | |
echo \"Running tests for container ${{ env.CONTAINER_TYPE }}\" | |
pytest -v api_tests/linux_only/ selenium_tests/linux_only/ | |
' | |
" | |
- name: Cleanup Azure resources | |
if: always() | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_SECRET --tenant $AZURE_TENANT | |
az group delete --name pipe-${{ env.UNIQUE_ID }} --yes --no-wait | |
" | |
- name: Stop and remove containers | |
if: always() | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} down | |
docker system prune -af | |
build-d12-10: | |
runs-on: self-hosted | |
env: | |
UNIQUE_ID: ${{ github.run_number }}_debian1210_${{ github.run_id }} | |
BRANCH_NAME: ${{ github.head_ref || github.ref_name }} | |
CONTAINER_TYPE: "d12.10" | |
AZURE_IP: "" | |
IP_ADDRESS: "" | |
steps: | |
- name: Generate random number | |
shell: bash | |
run: | | |
RANDOM_NUM=$(shuf -i 1000000000-9999999999 -n 1) | |
echo "UNIQUE_ID=${RANDOM_NUM}_debian1210_${{ github.run_number }}" >> $GITHUB_ENV | |
- name: Checkout repository | |
uses: actions/[email protected] | |
- name: Get branch name | |
shell: bash | |
run: | | |
if [ "${{ github.event_name }}" == "pull_request" ]; then | |
echo "BRANCH_NAME=${{ github.head_ref }}" >> $GITHUB_ENV | |
else | |
echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV | |
fi | |
- name: Set the environment for docker compose | |
run: | | |
cd testing/v2/development | |
echo "HOST_UID=$(id -u)" > .env | |
echo "HOST_GID=$(id -g)" >> .env | |
echo "HOST_IP=10.1.0.5" >> .env | |
PUBLIC_IP=$(curl -s https://api.ipify.org) | |
echo "IP_ADDRESS=$PUBLIC_IP" >> $GITHUB_ENV | |
- name: Start pipeline container | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} up -d pipeline | |
- name: Install Python requirements | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers/azure && \ | |
pip install -r requirements.txt | |
" | |
- name: Build an Azure instance | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T \ | |
-e AZURE_CLIENT_ID \ | |
-e AZURE_CLIENT_SECRET \ | |
-e AZURE_TENANT_ID \ | |
-e AZURE_SUBSCRIPTION_ID \ | |
pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
python3 ./azure/build_azure_linux_network.py \ | |
-g pipe-${{ env.UNIQUE_ID }} \ | |
-s 0.0.0.0/0 \ | |
-vs Standard_B4s_v2 \ | |
-l ${{ inputs.azure_region || 'centralus' }} \ | |
-ast 23:00 \ | |
-y | |
" | |
#-s ${{ env.IP_ADDRESS }}/32 \ | |
- name: Retrieve Azure IP | |
run: | | |
cd testing/v2/development | |
AZURE_IP=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.ip.txt") | |
echo "AZURE_IP=$AZURE_IP" >> $GITHUB_ENV | |
echo "Azure IP: $AZURE_IP" | |
echo "Azure IP retrieved successfully" | |
- name: Retrieve Azure Password | |
run: | | |
cd testing/v2/development | |
AZURE_PASS=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt") | |
echo "AZURE_PASS=$AZURE_PASS" >> $GITHUB_ENV | |
echo "Azure Password retrieved successfully" | |
# wait for the azure instance to be ready | |
- name: Wait for Azure instance to be ready | |
run: | | |
sleep 30 | |
- name: Copy SSH Key to Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
./lib/copy_ssh_key.sh lme-user ${{ env.AZURE_IP }} /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt | |
" | |
- name: Clone repository on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
if [ ! -d LME ]; then | |
git clone https://github.com/cisagov/LME.git; | |
fi | |
cd LME | |
if [ \"${{ env.BRANCH_NAME }}\" != \"main\" ]; then | |
git fetch | |
git checkout ${{ env.BRANCH_NAME }} | |
fi | |
' | |
" | |
- name: Install Docker on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS 'chmod +x ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo usermod -aG docker \$USER && \ | |
sudo systemctl enable docker && \ | |
sudo systemctl start docker' | |
" | |
- name: Install test prerequisites on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd LME/testing/tests && \ | |
sudo apt-get update && \ | |
sudo apt-get install -y python3.10-venv && \ | |
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \ | |
sudo apt install -y ./google-chrome-stable_current_amd64.deb && \ | |
python3 -m venv venv && \ | |
source venv/bin/activate && \ | |
pip install -r requirements.txt | |
' | |
" | |
- name: Test Docker container | |
run: | | |
cd testing/v2/development | |
# Set environment | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
echo \"HOST_IP=10.1.0.5\" > .env | |
' | |
" | |
# Build container | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose up -d | |
' | |
" | |
# Deploy LME | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose exec -T lme bash -c \"NON_INTERACTIVE=true AUTO_CREATE_ENV=true /root/LME/install.sh -i 10.1.0.5 -d\" | |
' | |
" | |
# Extract passwords | |
ES_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^elastic=\" | cut -d= -f2- | |
' | |
") | |
KIBANA_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^kibana_system=\" | cut -d= -f2- | |
' | |
") | |
# Run tests | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
sleep 360 | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/testing/tests | |
echo \"Container: ${{ env.CONTAINER_TYPE }}\" > .env | |
echo \"ELASTIC_PASSWORD=$ES_PASSWORD\" >> .env | |
echo \"KIBANA_PASSWORD=$KIBANA_PASSWORD\" >> .env | |
echo \"elastic=$ES_PASSWORD\" >> .env | |
source venv/bin/activate | |
echo \"Running tests for container ${{ env.CONTAINER_TYPE }}\" | |
pytest -v api_tests/linux_only/ selenium_tests/linux_only/ | |
' | |
" | |
- name: Cleanup Azure resources | |
if: always() | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_SECRET --tenant $AZURE_TENANT | |
az group delete --name pipe-${{ env.UNIQUE_ID }} --yes --no-wait | |
" | |
- name: Stop and remove containers | |
if: always() | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} down | |
docker system prune -af | |
build-rhel9: | |
runs-on: self-hosted | |
env: | |
UNIQUE_ID: ${{ github.run_number }}_rhel9_${{ github.run_id }} | |
BRANCH_NAME: ${{ github.head_ref || github.ref_name }} | |
CONTAINER_TYPE: "rhel9" | |
AZURE_IP: "" | |
IP_ADDRESS: "" | |
steps: | |
- name: Generate random number | |
shell: bash | |
run: | | |
RANDOM_NUM=$(shuf -i 1000000000-9999999999 -n 1) | |
echo "UNIQUE_ID=${RANDOM_NUM}_rhel9_${{ github.run_number }}" >> $GITHUB_ENV | |
- name: Checkout repository | |
uses: actions/[email protected] | |
- name: Get branch name | |
shell: bash | |
run: | | |
if [ "${{ github.event_name }}" == "pull_request" ]; then | |
echo "BRANCH_NAME=${{ github.head_ref }}" >> $GITHUB_ENV | |
else | |
echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV | |
fi | |
- name: Set the environment for docker compose | |
run: | | |
cd testing/v2/development | |
echo "HOST_UID=$(id -u)" > .env | |
echo "HOST_GID=$(id -g)" >> .env | |
echo "HOST_IP=10.1.0.5" >> .env | |
PUBLIC_IP=$(curl -s https://api.ipify.org) | |
echo "IP_ADDRESS=$PUBLIC_IP" >> $GITHUB_ENV | |
- name: Start pipeline container | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} up -d pipeline | |
- name: Install Python requirements | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers/azure && \ | |
pip install -r requirements.txt | |
" | |
- name: Build an Azure instance | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T \ | |
-e AZURE_CLIENT_ID \ | |
-e AZURE_CLIENT_SECRET \ | |
-e AZURE_TENANT_ID \ | |
-e AZURE_SUBSCRIPTION_ID \ | |
pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
python3 ./azure/build_azure_linux_network.py \ | |
-g pipe-${{ env.UNIQUE_ID }} \ | |
-s 0.0.0.0/0 \ | |
-vs Standard_B4s_v2 \ | |
-l ${{ inputs.azure_region || 'centralus' }} \ | |
-ast 23:00 \ | |
-y | |
" | |
#-s ${{ env.IP_ADDRESS }}/32 \ | |
- name: Retrieve Azure IP | |
run: | | |
cd testing/v2/development | |
AZURE_IP=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.ip.txt") | |
echo "AZURE_IP=$AZURE_IP" >> $GITHUB_ENV | |
echo "Azure IP: $AZURE_IP" | |
echo "Azure IP retrieved successfully" | |
- name: Retrieve Azure Password | |
run: | | |
cd testing/v2/development | |
AZURE_PASS=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c "cat /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt") | |
echo "AZURE_PASS=$AZURE_PASS" >> $GITHUB_ENV | |
echo "Azure Password retrieved successfully" | |
# wait for the azure instance to be ready | |
- name: Wait for Azure instance to be ready | |
run: | | |
sleep 30 | |
- name: Copy SSH Key to Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
./lib/copy_ssh_key.sh lme-user ${{ env.AZURE_IP }} /home/lme-user/LME/testing/v2/installers/pipe-${{ env.UNIQUE_ID }}.password.txt | |
" | |
- name: Clone repository on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
if [ ! -d LME ]; then | |
git clone https://github.com/cisagov/LME.git; | |
fi | |
cd LME | |
if [ \"${{ env.BRANCH_NAME }}\" != \"main\" ]; then | |
git fetch | |
git checkout ${{ env.BRANCH_NAME }} | |
fi | |
' | |
" | |
- name: Install Docker on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS 'chmod +x ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo ~/LME/docker/install_latest_docker_in_ubuntu.sh && \ | |
sudo usermod -aG docker \$USER && \ | |
sudo systemctl enable docker && \ | |
sudo systemctl start docker' | |
" | |
- name: Install test prerequisites on Azure instance | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd LME/testing/tests && \ | |
sudo apt-get update && \ | |
sudo apt-get install -y python3.10-venv && \ | |
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \ | |
sudo apt install -y ./google-chrome-stable_current_amd64.deb && \ | |
python3 -m venv venv && \ | |
source venv/bin/activate && \ | |
pip install -r requirements.txt | |
' | |
" | |
- name: Test Docker container | |
run: | | |
cd testing/v2/development | |
# Set environment | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
echo \"HOST_IP=10.1.0.5\" > .env | |
' | |
" | |
# Build container | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose up -d | |
' | |
" | |
# Deploy LME | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
sudo docker compose exec -T lme bash -c \"NON_INTERACTIVE=true AUTO_CREATE_ENV=true /root/LME/install.sh -i 10.1.0.5 -d\" | |
' | |
" | |
# Extract passwords | |
ES_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^elastic=\" | cut -d= -f2- | |
' | |
") | |
KIBANA_PASSWORD=$(docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/docker/${{ env.CONTAINER_TYPE }} | |
SECRETS=\$(sudo docker compose exec -T lme bash -c \". ~/LME/scripts/extract_secrets.sh -p\") | |
echo \"\$SECRETS\" | grep \"^kibana_system=\" | cut -d= -f2- | |
' | |
") | |
# Run tests | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
sleep 360 | |
cd /home/lme-user/LME/testing/v2/installers && \ | |
IP_ADDRESS=\$(cat pipe-${{ env.UNIQUE_ID }}.ip.txt) && \ | |
ssh lme-user@\$IP_ADDRESS ' | |
cd ~/LME/testing/tests | |
echo \"Container: ${{ env.CONTAINER_TYPE }}\" > .env | |
echo \"ELASTIC_PASSWORD=$ES_PASSWORD\" >> .env | |
echo \"KIBANA_PASSWORD=$KIBANA_PASSWORD\" >> .env | |
echo \"elastic=$ES_PASSWORD\" >> .env | |
source venv/bin/activate | |
echo \"Running tests for container ${{ env.CONTAINER_TYPE }}\" | |
pytest -v api_tests/linux_only/ selenium_tests/linux_only/ | |
' | |
" | |
- name: Cleanup Azure resources | |
if: always() | |
env: | |
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} | |
AZURE_SECRET: ${{ secrets.AZURE_SECRET }} | |
AZURE_TENANT: ${{ secrets.AZURE_TENANT }} | |
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} exec -T pipeline bash -c " | |
az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_SECRET --tenant $AZURE_TENANT | |
az group delete --name pipe-${{ env.UNIQUE_ID }} --yes --no-wait | |
" | |
- name: Stop and remove containers | |
if: always() | |
run: | | |
cd testing/v2/development | |
docker compose -p ${{ env.UNIQUE_ID }} down | |
docker system prune -af |