Skip to content

Merge pull request #190 from modeldrivendevopsai/favicon #193

Merge pull request #190 from modeldrivendevopsai/favicon

Merge pull request #190 from modeldrivendevopsai/favicon #193

Workflow file for this run

name: MDDOAI CI/CD
on:
push:
branches: ["**"]
tags: ["*"]
pull_request:
workflow_call:
inputs:
version:
description: 'Explicit version to use (passed by the Release workflow)'
required: false
type: string
env:
IMAGE_NAME: ghcr.io/${{ github.repository }}/mddoai
jobs:
determine_version:
name: Determine Version
runs-on: ubuntu-latest
outputs:
image_tag: ${{ steps.tag.outputs.IMAGE_TAG }}
version: ${{ steps.tag.outputs.VERSION }}
steps:
- name: Calculate image tag
id: tag
run: |
if [ -n "${{ inputs.version }}" ]; then
VERSION="${{ inputs.version }}"
elif [ "${{ github.ref_type }}" = "tag" ]; then
VERSION="${{ github.ref_name }}"
elif [ "${{ github.ref }}" = "refs/heads/main" ]; then
VERSION="1.0-snapshot"
else
VERSION="1.x-snapshot"
fi
IMAGE_TAG="${{ env.IMAGE_NAME }}:${VERSION}"
echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT
echo "IMAGE_TAG=${IMAGE_TAG}" >> $GITHUB_OUTPUT
gradle_build:
name: Gradle Build
runs-on: ubuntu-latest
container: gradle:8.14.3-jdk21-alpine
defaults:
run:
working-directory: main
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Clean Gradle cache and daemon
run: |
rm -rf ~/.gradle/daemon ~/.gradle/caches
./gradlew --stop || true
- name: Build and install distribution
run: |
chmod +x ./gradlew
./gradlew clean build -x test installDist
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: gradle-build
path: main/build/
docker_build:
name: Docker Build
runs-on: ubuntu-latest
needs: [gradle_build, determine_version]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: gradle-build
path: main/build/
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
run: |
docker build -f main/Dockerfile -t ${{ needs.determine_version.outputs.image_tag }} main
- name: Save Docker image
run: |
docker save ${{ needs.determine_version.outputs.image_tag }} -o main/image.tar
- name: Upload image artifact
uses: actions/upload-artifact@v4
with:
name: docker-image
path: main/image.tar
unit_tests:
name: Unit Tests
runs-on: ubuntu-latest
container: gradle:8.14.3-jdk21-alpine
needs: gradle_build
defaults:
run:
working-directory: main
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: gradle-build
path: main/build/
- run: chmod +x ./gradlew
- run: ./gradlew test
- uses: actions/upload-artifact@v4
with:
name: unit-test-results
path: main/build/test-results/test/
integration_tests:
name: Integration Tests
runs-on: ubuntu-latest
container: gradle:8.14.3-jdk21-alpine
needs: gradle_build
defaults:
run:
working-directory: main
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: gradle-build
path: main/build/
- run: chmod +x ./gradlew
- run: ./gradlew integrationTest
- uses: actions/upload-artifact@v4
with:
name: integration-test-results
path: main/build/test-results/integrationTest/
e2e_tests:
name: E2E Tests
runs-on: ubuntu-latest
container: gradle:8.14.3-jdk21-alpine
needs: gradle_build
defaults:
run:
working-directory: main
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: gradle-build
path: main/build/
- run: chmod +x ./gradlew
- run: ./gradlew e2eTest
- uses: actions/upload-artifact@v4
with:
name: e2e-test-results
path: main/build/test-results/e2eTest/
cli_check:
name: CLI Check (E2E)
runs-on: ubuntu-latest
needs: [docker_build, determine_version]
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: docker-image
path: main/
- name: Load Docker image
run: docker load -i main/image.tar
- name: Run CLI via Docker image
run: |
# Create the directory first so the GitHub runner owns it natively
mkdir -p ${{ github.workspace }}/main/test/generatedCode
docker run --rm \
-v ${{ github.workspace }}/main/src/test/resources/testCases/e2e:/input \
-v ${{ github.workspace }}/main/test/generatedCode:/output \
${{ needs.determine_version.outputs.image_tag }} \
swarch2gitlab /input/input1.swarch /output
# Reclaim ownership of the files generated inside by Docker
sudo chown -R $USER:$USER ${{ github.workspace }}/main/test/generatedCode
- name: Show generated files (Debug)
run: ls -la ${{ github.workspace }}/main/test/generatedCode
- name: Run file existence check
run: chmod +x pipeline_tests/fileExistsTest.sh && ./pipeline_tests/fileExistsTest.sh
- uses: actions/upload-artifact@v4
with:
name: cli-test-output
path: main/test/
coverage_report:
name: Coverage Report
runs-on: ubuntu-latest
container: gradle:8.14.3-jdk21-alpine
needs: [gradle_build, unit_tests, integration_tests, e2e_tests]
defaults:
run:
working-directory: main
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: gradle-build
path: main/build/
- uses: actions/download-artifact@v4
with:
name: unit-test-results
path: main/build/jacoco/
- uses: actions/download-artifact@v4
with:
name: integration-test-results
path: main/build/jacoco/
- uses: actions/download-artifact@v4
with:
name: e2e-test-results
path: main/build/jacoco/
- run: chmod +x ./gradlew
- run: ./gradlew unitJacocoTestReport integrationJacocoTestReport e2eJacocoTestReport jacocoTestReport
- run: ls -R build/reports/jacoco/
- uses: actions/upload-artifact@v4
with:
name: coverage-report
path: main/build/reports/jacoco/**/html/
deploy_pages:
name: Upload Coverage to Pages
runs-on: ubuntu-latest
needs: coverage_report
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
permissions:
contents: read
pages: write
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: coverage-report
path: docs/ # match the GitHub Pages folder
- uses: actions/upload-pages-artifact@v3
with:
path: docs/
deploy:
name: Deploy GitHub Pages
runs-on: ubuntu-latest
needs: deploy_pages
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
environment:
name: github-pages
permissions:
pages: write
id-token: write
steps:
- uses: actions/deploy-pages@v4
push_image:
name: Push Docker Image
runs-on: ubuntu-latest
needs: [docker_build, determine_version, unit_tests, integration_tests, e2e_tests, cli_check, coverage_report]
if: github.event_name == 'push' || github.event_name == 'workflow_call'
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: docker-image
path: main/
- run: docker load -i main/image.tar
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push Docker image
run: |
docker push ${{ needs.determine_version.outputs.image_tag }}