Skip to content
Merged
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
70 changes: 70 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# EditorConfig is awesome: https://EditorConfig.org
# This file defines consistent coding styles for GOSS project
# Supported by VS Code, IntelliJ IDEA, Eclipse, and many other editors

root = true

# All files
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = tab
tab_width = 4

# Java files
[*.java]
indent_style = tab
indent_size = 4
tab_width = 4
max_line_length = 120
continuation_indent_size = 8

# Gradle files
[*.gradle]
indent_style = tab
indent_size = 4
tab_width = 4

# Properties files
[*.{properties,cfg}]
indent_style = space
indent_size = 4

# BND files
[*.{bnd,bndrun}]
indent_style = tab
indent_size = 4
tab_width = 4

# Markdown files
[*.{md,markdown}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = false

# YAML files (GitHub Actions, etc.)
[*.{yml,yaml}]
indent_style = space
indent_size = 2

# JSON files
[*.json]
indent_style = space
indent_size = 2

# XML files
[*.xml]
indent_style = space
indent_size = 2

# Shell scripts
[*.{sh,bash}]
indent_style = space
indent_size = 2

# Travis CI (legacy - keeping for reference)
[.travis.yml]
indent_style = space
indent_size = 2
35 changes: 35 additions & 0 deletions .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: "GOSS CodeQL Configuration"

queries:
- name: security-and-quality
uses: security-and-quality
- name: security-extended
uses: security-extended

# Paths to analyze
paths:
- pnnl.goss.core/src
- pnnl.goss.core.runner/src
- pnnl.goss.core.testutil/src
- pnnl.goss.core.itests/src

# Paths to ignore
paths-ignore:
- "**/generated/**"
- "**/target/**"
- "**/build/**"
- "**/*.log"
- "**/cache/**"
- "**/releaserepo/**"
- "**/test/**/*.java" # Focus on main source code

# Disable queries that may produce too many false positives
disable-default-queries: false

# Additional packs for enhanced security analysis
packs:
- codeql/java-queries:AlertSuppression.ql
- codeql/java-queries:Security/CWE
- codeql/java-queries:Security/CWE/CWE-078.ql # OS Command Injection
- codeql/java-queries:Security/CWE/CWE-089.ql # SQL Injection
- codeql/java-queries:Security/CWE/CWE-798.ql # Hard-coded credentials
205 changes: 205 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
name: CI/CD Pipeline

on:
push:
branches: [ main, master, develop, upstream_develop ]
pull_request:
branches: [ main, master, develop ]
schedule:
# Run tests weekly on Sundays at 2 AM UTC
- cron: '0 2 * * 0'

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: Test Suite
runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
java-version: [21, 22]
include:
- java-version: 21
primary: true

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for better analysis

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

- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
cnf/cache
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'cnf/**/*.bnd') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Make gradlew executable
run: chmod +x gradlew

- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v2

- name: Run unit tests
run: ./gradlew test --continue --no-daemon
env:
GRADLE_OPTS: -Xmx2g -Dorg.gradle.daemon=false

- name: Run integration tests (non-OSGi)
run: ./gradlew check -x :pnnl.goss.core.itests:testOSGi --continue --no-daemon
env:
GRADLE_OPTS: -Xmx2g -Dorg.gradle.daemon=false

- name: Build project
run: ./gradlew build -x :pnnl.goss.core.itests:testOSGi --no-daemon
env:
GRADLE_OPTS: -Xmx2g -Dorg.gradle.daemon=false

- name: Generate test report
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: Test Results (JDK ${{ matrix.java-version }})
path: '**/generated/test-results/test/TEST-*.xml'
reporter: java-junit
fail-on-error: false

- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-jdk${{ matrix.java-version }}
path: |
**/generated/test-results/
**/generated/reports/
retention-days: 30

- name: Upload build artifacts (primary JDK only)
if: matrix.primary && (success() || failure())
uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: |
**/generated/*.jar
cnf/releaserepo/**/*.jar
retention-days: 90

osgi-integration-tests:
name: OSGi Integration Tests
runs-on: ubuntu-latest
needs: test
if: github.event_name != 'schedule' # Skip on scheduled runs

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

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

- name: Make gradlew executable
run: chmod +x gradlew

- name: Run OSGi integration tests
run: ./gradlew :pnnl.goss.core.itests:testOSGi --no-daemon || true
env:
GRADLE_OPTS: -Xmx2g -Dorg.gradle.daemon=false

- name: Upload OSGi test results
if: always()
uses: actions/upload-artifact@v4
with:
name: osgi-test-results
path: |
pnnl.goss.core.itests/generated/test-results/
pnnl.goss.core.itests/generated/reports/
pnnl.goss.core.itests/**/*.log
retention-days: 30

build-runners:
name: Build OSGi Runners
runs-on: ubuntu-latest
needs: test
if: github.event_name != 'schedule'

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

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

- name: Make gradlew executable
run: chmod +x gradlew

- name: Build all GOSS bundles
run: ./gradlew :pnnl.goss.core:jar --no-daemon
env:
GRADLE_OPTS: -Xmx2g -Dorg.gradle.daemon=false

- name: Build OSGi runners using BndRunnerPlugin
run: |
./gradlew buildRunner.goss-core --no-daemon
./gradlew buildRunner.goss-core-ssl --no-daemon
env:
GRADLE_OPTS: -Xmx2g -Dorg.gradle.daemon=false

- name: Verify runner JARs created
run: |
ls -lh pnnl.goss.core.runner/generated/runners/
test -f pnnl.goss.core.runner/generated/runners/goss-core-runner.jar
test -f pnnl.goss.core.runner/generated/runners/goss-core-ssl-runner.jar
echo "✅ All runner JARs built successfully"

- name: Upload runner artifacts
if: success()
uses: actions/upload-artifact@v4
with:
name: osgi-runners
path: pnnl.goss.core.runner/generated/runners/*.jar
retention-days: 30

build-status:
name: Build Status
runs-on: ubuntu-latest
needs: [test, osgi-integration-tests, build-runners]
if: always()

steps:
- name: Check build status
run: |
echo "Test job status: ${{ needs.test.result }}"
echo "OSGi job status: ${{ needs.osgi-integration-tests.result }}"
echo "Build runners job status: ${{ needs.build-runners.result }}"

if [[ "${{ needs.test.result }}" == "success" ]] && [[ "${{ needs.build-runners.result }}" == "success" ]]; then
echo "✅ Core build, tests, and runners passed!"
exit 0
else
echo "❌ Build, tests, or runners failed"
exit 1
fi
Loading