Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: CI Build and Test

on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]

jobs:
build:
name: Build and Test
runs-on: ubuntu-latest

strategy:
matrix:
java-version: [ 17, 21 ]

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java-version }}
distribution: 'temurin'
cache: 'maven'

- name: Cache Maven packages
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2

- name: Build with Maven
run: mvn clean install -B -V

- name: Run tests
run: mvn test -B

- name: Generate test report
if: always()
run: mvn surefire-report:report

- name: Upload test results
if: always()
uses: actions/upload-artifact@v3
with:
name: test-results-java-${{ matrix.java-version }}
path: |
**/target/surefire-reports/
**/target/site/

- name: Check code style
run: mvn checkstyle:check || true
continue-on-error: true

code-quality:
name: Code Quality Analysis
runs-on: ubuntu-latest
needs: build

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for better analysis

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'
cache: 'maven'

- name: Compile project
run: mvn clean compile -B

docker-build:
name: Docker Build Test
runs-on: ubuntu-latest
needs: build

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Check if Dockerfile exists
id: check_dockerfile
run: |
if [ -f "Dockerfile" ]; then
echo "dockerfile_exists=true" >> $GITHUB_OUTPUT
else
echo "dockerfile_exists=false" >> $GITHUB_OUTPUT
fi

- name: Build Docker image
if: steps.check_dockerfile.outputs.dockerfile_exists == 'true'
run: docker build -t kidcode:test .

- name: Test Docker image
if: steps.check_dockerfile.outputs.dockerfile_exists == 'true'
run: docker images | grep kidcode
92 changes: 92 additions & 0 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Pull Request Checks

on:
pull_request:
types: [opened, synchronize, reopened]

jobs:
pr-validation:
name: PR Validation
runs-on: ubuntu-latest

steps:
- name: Checkout PR
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'
cache: 'maven'

- name: Build and Test
run: |
mvn clean install -B
mvn test -B

- name: Check for merge conflicts
run: |
git fetch origin ${{ github.base_ref }}
if git merge-tree $(git merge-base HEAD origin/${{ github.base_ref }}) HEAD origin/${{ github.base_ref }} | grep -q '<<<<<<<'; then
echo "::error::Merge conflicts detected"
exit 1
fi

- name: Comment test results
if: always()
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const testResults = 'Build and test completed';
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `## Test Results\n\n✅ ${testResults}`
});

code-coverage:
name: Code Coverage
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'
cache: 'maven'

- name: Run tests with coverage
run: mvn test jacoco:report || true
continue-on-error: true

- name: Upload coverage reports
uses: actions/upload-artifact@v3
if: always()
with:
name: coverage-report
path: '**/target/site/jacoco/'

label-pr:
name: Auto Label PR
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: read

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Label based on files changed
uses: actions/labeler@v5
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
103 changes: 103 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
name: Release Build

on:
push:
tags:
- 'v*.*.*'
workflow_dispatch:

jobs:
build-release:
name: Build Release Artifacts
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'
cache: 'maven'

- name: Extract version from tag
id: get_version
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/v}
echo "version=$VERSION" >> $GITHUB_OUTPUT
else
echo "version=snapshot" >> $GITHUB_OUTPUT
fi

- name: Build release
run: |
mvn clean package -DskipTests -B
mvn install -DskipTests -B

- name: Create distribution archives
run: |
mkdir -p release
cd kidcode-desktop/target
if [ -f kidcode-desktop-*.jar ]; then
cp kidcode-desktop-*.jar ../../release/
fi
cd ../../kidcode-web/target
if [ -f kidcode-web-*.jar ]; then
cp kidcode-web-*.jar ../../release/
fi
cd ../../

- name: Upload release artifacts
uses: actions/upload-artifact@v3
with:
name: kidcode-release-${{ steps.get_version.outputs.version }}
path: release/

- name: Create GitHub Release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v1
with:
files: release/*
generate_release_notes: true
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

build-docker:
name: Build and Push Docker Image
runs-on: ubuntu-latest
needs: build-release
if: startsWith(github.ref, 'refs/tags/')

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Extract version
id: get_version
run: echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT

- name: Build Docker image
if: hashFiles('Dockerfile') != ''
run: |
docker build -t kidcode:${{ steps.get_version.outputs.version }} .
docker tag kidcode:${{ steps.get_version.outputs.version }} kidcode:latest

- name: Save Docker image
if: hashFiles('Dockerfile') != ''
run: |
docker save kidcode:${{ steps.get_version.outputs.version }} | gzip > kidcode-docker-${{ steps.get_version.outputs.version }}.tar.gz

- name: Upload Docker image artifact
if: hashFiles('Dockerfile') != ''
uses: actions/upload-artifact@v3
with:
name: docker-image
path: kidcode-docker-*.tar.gz