Skip to content

Added functionality for running CI unit tests on modified modules only #62

Added functionality for running CI unit tests on modified modules only

Added functionality for running CI unit tests on modified modules only #62

Workflow file for this run

name: Track changes between main and new commit
on:
workflow_dispatch: {}
push:
branches:
- main
pull_request:
branches:
- main
jobs:
# ------------------------------------------------------------------------
# Event `pull_request`: Compare the last commit of the main branch or last
# remote commit of the PR branch -> to the current commit of a PR branch.
# ------------------------------------------------------------------------
get_changed_modules:
runs-on: ubuntu-latest
name: Get changed files
outputs:
modified_modules: ${{ steps.output-changes.outputs.modified_modules }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # OR "2" -> To retrieve the preceding commit.
since_last_remote_commit: false
- name: Find changed files inside action folder
id: changed-files-action
uses: tj-actions/changed-files@v42
with:
files: src/action/**
- name: Get changed files inside interfacing folder
id: changed-files-interfacing
uses: tj-actions/changed-files@v42
with:
files: src/interfacing/**
- name: Get changed files inside perception folder
id: changed-files-perception
uses: tj-actions/changed-files@v42
with:
files: src/perception/**
- name: Get changed files inside samples folder
id: changed-files-samples
uses: tj-actions/changed-files@v42
with:
files: src/samples/**
- name: Get changed files inside simulation folder
id: changed-files-simulation
uses: tj-actions/changed-files@v42
with:
files: src/simulation/**
- name: Get changed files inside world_modeling folder
id: changed-files-world-modeling
uses: tj-actions/changed-files@v42
with:
files: src/world_modeling/**
- name: Update CHANGED_MODULES for action
if: steps.changed-files-action.outputs.any_changed == 'true'
run: |
echo "Detected action changes"
echo "CHANGED_MODULES=$CHANGED_MODULES action" >> $GITHUB_ENV
- name: Update CHANGED_MODULES for interfacing
if: steps.changed-files-interfacing.outputs.any_changed == 'true'
run: |
echo "Detected interfacing changes"
echo "CHANGED_MODULES=$CHANGED_MODULES interfacing" >> $GITHUB_ENV
- name: Update CHANGED_MODULES for perception
if: steps.changed-files-perception.outputs.any_changed == 'true'
run: |
echo "Detected perception changes"
echo "CHANGED_MODULES=$CHANGED_MODULES perception" >> $GITHUB_ENV
- name: Update CHANGED_MODULES for samples
if: steps.changed-files-samples.outputs.any_changed == 'true'
run: |
echo "Detected samples changes"
echo "CHANGED_MODULES=$CHANGED_MODULES samples" >> $GITHUB_ENV
- name: Update CHANGED_MODULES for simulations
if: steps.changed-files-simulations.outputs.any_changed == 'true'
run: |
echo "Detected simulations changes"
echo "CHANGED_MODULES=$CHANGED_MODULES simulations" >> $GITHUB_ENV
- name: Update CHANGED_MODULES for world_modeling
if: steps.changed-files-world-modeling.outputs.any_changed == 'true'
run: |
echo "Detected world_modeling changes"
echo "CHANGED_MODULES=$CHANGED_MODULES world_modeling" >> $GITHUB_ENV
- name: List all changed files
id: output-changes
run: |
echo "The changed modules are: $env.CHANGED_MODULES"
echo "modified_modules=$CHANGED_MODULES" >> $GITHUB_OUTPUT
- name: Sanity check
run: |
echo Sanity, changes are in ${{ steps.output-changes.outputs.modified_modules }}
setup-environment:
name: Setup environment
runs-on: ubuntu-latest
needs: get_changed_modules
env:
modified_modules: ${{ needs.get_changed_modules.outputs.modified_modules }}
outputs:
docker_matrix: ${{ steps.docker-environment.outputs.docker_matrix }}
registry: ${{ steps.docker-environment.outputs.registry }}
repository: ${{ steps.docker-environment.outputs.repository }}
source_branch: ${{ steps.github-environment.outputs.source_branch }}
target_branch: ${{ steps.github-environment.outputs.target_branch }}
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Setup Watod Environment
run: ./watod_scripts/watod-setup-env.sh
shell: bash
- name: Check module changes
run: echo "changed is ${{ env.modified_modules }}"
- name: Generate Docker Environment
id: docker-environment
uses: "./.github/templates/docker_context"
with:
modified_modules: ${{ env.modified_modules }}
- name: Generate GitHub Environment
id: github-environment
uses: "./.github/templates/github_context"
build-and-unittest:
name: Build Image and Run Unit Testing Suite
runs-on: ubuntu-latest
needs: setup-environment
env:
DOCKER_REGISTRY: ${{ needs.setup-environment.outputs.registry }}
DOCKER_REPOSITORY: ${{ needs.setup-environment.outputs.repository }}
SOURCE_BRANCH: ${{ needs.setup-environment.outputs.source_branch }}
TARGET_BRANCH: ${{ needs.setup-environment.outputs.target_branch }}
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.setup-environment.outputs.docker_matrix) }}
concurrency:
group: ${{ matrix.service }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Construct Registry URL
id: construct-registry-url
run: |
echo "url=${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_REPOSITORY }}/${{ matrix.module }}/${{ matrix.service }}" \
>> $GITHUB_OUTPUT
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
id: buildx
- name: Docker Login
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ secrets.GHCR_USER }}
password: ${{ secrets.GHCR_PWD }}
- name: Prepare Image Dependencies
if: ${{ matrix.module != 'infrastructure' }}
uses: docker/build-push-action@v5
with:
context: .
file: docker/${{ matrix.module }}/${{ matrix.service }}/${{ matrix.service }}.Dockerfile
push: true
tags: |
${{ steps.construct-registry-url.outputs.url }}:source_${{ env.SOURCE_BRANCH }}
cache-from: |
${{ steps.construct-registry-url.outputs.url }}:source_${{ env.SOURCE_BRANCH }}
${{ steps.construct-registry-url.outputs.url }}:source_${{ env.TARGET_BRANCH }}
cache-to: type=inline
builder: ${{ steps.buildx.outputs.name }}
target: dependencies
- name: Build Image from Source
uses: docker/build-push-action@v5
with:
context: .
file: docker/${{ matrix.module }}/${{ matrix.service }}/${{ matrix.service }}.Dockerfile
push: true
tags: |
${{ steps.construct-registry-url.outputs.url }}:build_${{ env.SOURCE_BRANCH }}
cache-from: |
${{ steps.construct-registry-url.outputs.url }}:source_${{ env.SOURCE_BRANCH }}
${{ steps.construct-registry-url.outputs.url }}:build_${{ env.SOURCE_BRANCH }}
${{ steps.construct-registry-url.outputs.url }}:build_${{ env.TARGET_BRANCH }}
cache-to: type=inline
builder: ${{ steps.buildx.outputs.name }}
target: build
- name: Security Sanitation for Deployment
uses: docker/build-push-action@v5
with:
context: .
file: docker/${{ matrix.module }}/${{ matrix.service }}/${{ matrix.service }}.Dockerfile
push: true
tags: |
${{ steps.construct-registry-url.outputs.url }}:${{ env.SOURCE_BRANCH }}
cache-from: |
${{ steps.construct-registry-url.outputs.url }}:build_${{ env.SOURCE_BRANCH }}
${{ steps.construct-registry-url.outputs.url }}:${{ env.SOURCE_BRANCH }}
${{ steps.construct-registry-url.outputs.url }}:${{ env.TARGET_BRANCH }}
cache-to: type=inline
builder: ${{ steps.buildx.outputs.name }}
target: deploy
- name: Run testing suite
uses: "./.github/templates/test"
env:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
BUILDKIT_INLINE_CACHE: 1
with:
module: ${{ matrix.module }}
service: ${{ matrix.service }}
source_branch: ${{ env.SOURCE_BRANCH }}