Skip to content

BFD-3524: Create CI-Lambda to enforce unit testing as gate for merges #24

BFD-3524: Create CI-Lambda to enforce unit testing as gate for merges

BFD-3524: Create CI-Lambda to enforce unit testing as gate for merges #24

Workflow file for this run

name: CI - Python
on:
# push:
# branches:
# - master
# - BFD-3524
# paths:
# - '**/*.py'
# - '**/*requirement*.txt'
pull_request:
types: [opened, synchronize, reopened]
paths:
- '**/*.py'
- '**/*requirement*.txt'
merge_group:
branches:
- master
# paths:
# - '**/*.py'
# - '**/*requirement*.txt'
workflow_dispatch:
env:
BASE_COMMIT: ""
GH_TOKEN: ${{ github.token }}
jobs:
python-check:
runs-on: ubuntu-latest
outputs:
jobstatus: ${{ join(steps.*.conclusion) }}
DELTAFLDRSET64: ${{ steps.validate-testworthy-changes.outputs.FOLDERLIST }}
DELTAFLDRCT: ${{ steps.validate-testworthy-changes.outputs.FOLDERLINES }}
steps:
- name: Checkout code
id: code-checkout
uses: actions/checkout@v4
with:
fetch-depth: 2
# - name: Determine changed files for push event
# id: list-push-changes
# if: github.event_name == 'push'
# run: |
# echo "Fetching list of changed files for push event..."
# CHANGEDPUSHFILES=$(git diff --name-only ${{ github.sha }}^ ${{ github.sha }})
# echo "Changed files: $CHANGEDPUSHFILES"
# echo 'CHANGEDPUSHFILES='"${CHANGEDPUSHFILES}" >> $GITHUB_OUTPUT
- name: Determine changed files for pull request event
id: list-pr-changes
if: github.event_name == 'pull_request'
run: |
echo "Fetching list of changed files for pull request event..."
PR_NUMBER=${{ github.event.pull_request.number }}
PR_FILES=$(gh pr diff $PR_NUMBER --name-only)
echo "${PR_FILES}" > ${{ runner.temp }}/PRLIST.txt
echo "CHANGEDPRLIST=${{ runner.temp }}/PRLIST.txt" >> $GITHUB_OUTPUT
- name: Determine changed files for merge_group event
id: list-merge-changes
if: github.event_name == 'merge_group'
run: |
# Get target branch (base branch) name
BASE_BRANCH=$(jq -r '.pull_request.base.ref' < "$GITHUB_EVENT_PATH")
# Fetch base branch
git fetch origin $BASE_BRANCH
# Get merge base commit
BASE_COMMIT=$(git merge-base HEAD origin/$BASE_BRANCH)
echo "BASE_COMMIT=$BASE_COMMIT" >> $GITHUB_ENV
MERGE_FILES=$(git diff --name-only ${{ env.BASE_COMMIT }} HEAD)
echo "${MERGE_FILES}" > ${{ runner.temp }}/MRGLIST.txt
echo "CHANGEDMERGELIST=${{ runner.temp }}/MRGLIST.txt" >> $GITHUB_OUTPUT
- name: Delineate Modified Folders
id: validate-testworthy-changes
run: |
CHANGED_FILES=${{ runner.temp }}/CFLIST.txt
UNIQ_FOLDERS=${{ runner.temp }}/UNIQFLDR.txt
touch ${CHANGED_FILES}
if [ -f "${{ steps.list-merge-changes.outputs.CHANGEDMERGELIST }}" ]
then
echo "MERGE Change List"; cat ${{ steps.list-merge-changes.outputs.CHANGEDMERGELIST }}
cat ${{ steps.list-merge-changes.outputs.CHANGEDMERGELIST }} >> ${CHANGED_FILES}
fi
if [ -f "${{ steps.list-pr-changes.outputs.CHANGEDPRLIST }}" ]
then
echo "PR Change List"; cat ${{ steps.list-pr-changes.outputs.CHANGEDPRLIST }}
cat ${{ steps.list-pr-changes.outputs.CHANGEDPRLIST }} >> ${CHANGED_FILES}
fi
echo 'Changed files:'; cat ${CHANGED_FILES}
# the following sequence reduces CHANGED_FILES to CHANGEDIRS
# thereby avoiding multiple test cycles for a single folder of muliple file changes
cat ${CHANGED_FILES} | while read f
do
if [ -f $f ]
then
dirname $f
fi
done | sort | uniq >> ${UNIQ_FOLDERS}
UNIQ64=$(cat ${UNIQ_FOLDERS}|base64)
echo "FOLDERLIST=${UNIQ64}" >> $GITHUB_OUTPUT
echo "FOLDERLINES=$(cat ${UNIQ_FOLDERS}|wc -l)"
matrix-pytest:
runs-on: ubuntu-latest
needs: python-check
##if: ${{ (!contains(needs.python-check.outputs.jobstatus, 'failure')) && (needs.python-check.outputs.DELTAFLDRCT != 0) }}
env:
DELTAFOLDERS64: ${{ needs.python-check.outputs.DELTAFLDRSET64 }}
DELTAFOLDERCT: ${{ needs.python-check.outputs.DELTAFLDRCT }}
strategy:
matrix:
projects:
[
{
projectName: "sftp-outbound-transfer-lambda",
projectRoot: "ops/terraform/services/eft/lambda_src/sftp_outbound_transfer",
testsRoot: "ops/terraform/services/eft/lambda_src/sftp_outbound_transfer/tests",
pythonVersion: "3.12"
},
{
projectName: "update-pipeline-slis-lambda",
projectRoot: "ops/terraform/services/pipeline/modules/bfd_pipeline_slis/lambda_src",
testsRoot: "ops/terraform/services/pipeline/modules/bfd_pipeline_slis/lambda_src/tests",
pythonVersion: "3.11"
},
]
steps:
- name: Setup Python Tests for affected folders
id: install-pytest-set
uses: actions/[email protected]
with:
python-version: ${{ matrix.projects.pythonVersion }}
- name: Run Python Tests per project
id: run-pytest-set
run: |
FOLDERLIST=${{ runner.temp }}/SRCFOLDERS.txt
echo ${{ env.DELTAFOLDERS64 }} | base64 -d > $FOLDERLIST
cat $FOLDERLIST | while read srcfolder
do
if [[ "${srcfolder}" =~ "${{ matrix.projects.projectRoot }}" ]]
then
echo "Testing ${{ matrix.projects.projectRoot }} as N of ${{env.DELTAFOLDERCT}}"
# create virtual environment for each DIR and execute tests
# python -m venv venv
# source venv/bin/activate
pip install --upgrade pip
pip install -r ${{ matrix.projects.projectRoot }}/requirements.txt
pip install pytest
pytest ${{ matrix.projects.projectRoot }}
fi
done