Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CI and CD #2

Merged
merged 18 commits into from
Jul 28, 2023
Merged
7 changes: 7 additions & 0 deletions .github/codecov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
codecov:
max_report_age: off
coverage:
status:
project:
default:
threshold: 2%
139 changes: 139 additions & 0 deletions .github/workflows/build_and_test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
name: Build and test

on:
pull_request:
push:
branches:
- 'main'

jobs:
build_and_test_with_code_coverage:
name: Build and test
runs-on: ${{ matrix.os }}
strategy:
# We need multiple builds to run even if the 1st one is failing, because
# test failures may be OS-specific (or the tests themselves flaky).
fail-fast: false
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]

# A possible workaround for <https://github.com/dorny/test-reporter/issues/168>.
permissions:
checks: write
contents: write
pull-requests: write
statuses: write

steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: 11
distribution: temurin
- name: Retrieve Kotlin version
shell: bash
run: |
kv=$(cat gradle/libs.versions.toml | grep '^kotlin =' | awk -F'[=]' '{print $2}' | tr -d '" ')
echo KOTLIN_VERSION=$kv >> $GITHUB_ENV
- name: Cache konan
uses: actions/cache@v3
with:
# [@actions/glob](https://github.com/actions/toolkit/tree/main/packages/glob) is used to match paths
# It should correctly expand `~` on every OS.
path: ~/.konan
key: ${{ runner.os }}-gradle-konan-${{ env.KOTLIN_VERSION }}
- uses: gradle/gradle-build-action@v2
with:
gradle-version: wrapper
# The `--continue` flag is necessary so that Gradle keeps going after the 1st test failure.
# By default, when test for all MPP targets are executed, Kotlin Gradle Plugin generates a single aggregated HTML report.
# Property `kotlin.tests.individualTaskReports` enables individual Junit-style XML reports.
# See org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport.
arguments: |
build
--continue
-x detekt
-Pkotlin.tests.individualTaskReports=true
-Porg.gradle.caching=true
-Pdetekt.multiplatform.disabled=true
-PdisableRedundantTargets=true
-PenabledExecutables=debug
-PgprUser=${{ github.actor }}
-PgprKey=${{ secrets.GITHUB_TOKEN }}

# This step needs a Git repository, so it's impossible to extract it
# into a separate job (or, otherwise, we'd need to upload the content
# of the whole `.git` folder as an artifact).
- name: JUnit Tests (dorny/test-reporter@v1)
uses: dorny/test-reporter@v1
if: ${{ always() }}
with:
name: JUnit Tests (${{ runner.os }}, dorny/test-reporter@v1)
# Comma-separated values.
path: "**/build/test-results/*/TEST-*.xml"
reporter: java-junit
# Ignore the "Resource not accessible by integration" error when a PR
# originates from a non-collaborator. This is
# <https://github.com/dorny/test-reporter/issues/168> which may be
# potentially fixed with <https://github.com/dorny/test-reporter/pull/174>.
continue-on-error: true

- name: Upload test results
uses: actions/upload-artifact@v3
if: ${{ always() }}
with:
name: xml-test-reports-${{ runner.os }}
path: |
**/build/test-results/*/TEST-*.xml
retention-days: 1

- name: Upload gradle reports
if: ${{ always() }}
uses: actions/upload-artifact@v3
with:
name: gradle-reports-${{ matrix.os }}
path: '**/build/reports/'
- name: Code coverage report
if: ${{ runner.os == 'Linux' }}
uses: codecov/codecov-action@v3
with:
flags: unittests
fail_ci_if_error: false # optional (default = false)

report:
name: Publish JUnit test results
if: ${{ always() }}
needs: build_and_test_with_code_coverage
runs-on: ${{ matrix.os }}

strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]

permissions:
checks: write
pull-requests: write

steps:
- uses: actions/download-artifact@v3
if: ${{ always() }}
with:
name: xml-test-reports-${{ runner.os }}

# Uses Docker, that's why Linux-only.
- name: JUnit Tests (EnricoMi/publish-unit-test-result-action@v1, Linux)
uses: EnricoMi/publish-unit-test-result-action@v1
if: ${{ runner.os == 'Linux' }}
with:
check_name: JUnit Tests (${{ runner.os }}, EnricoMi/publish-unit-test-result-action@v1)
files: |
**/build/test-results/*/TEST-*.xml

- name: JUnit Tests (EnricoMi/publish-unit-test-result-action@v1, Windows or Mac OS X)
uses: EnricoMi/publish-unit-test-result-action/composite@v1
if: ${{ runner.os == 'Windows' || runner.os == 'macOS' }}
with:
check_name: JUnit Tests (${{ runner.os }}, EnricoMi/publish-unit-test-result-action@v1)
files: |
**/build/test-results/*/TEST-*.xml
25 changes: 25 additions & 0 deletions .github/workflows/detekt.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Run deteKT

on:
push:
branches: [ main ]
pull_request:

jobs:
detekt_check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: 11
distribution: temurin
- uses: gradle/gradle-build-action@v2
with:
gradle-version: wrapper
arguments: |
detektAll
--build-cache
-PgprUser=${{ github.actor }}
-PgprKey=${{ secrets.GITHUB_TOKEN }}
31 changes: 31 additions & 0 deletions .github/workflows/diktat.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Run diKTat

on:
push:
branches: [ main ]
pull_request:

jobs:
diktat_check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: 11
distribution: temurin
- uses: gradle/gradle-build-action@v2
with:
gradle-version: wrapper
arguments: |
diktatCheck
mergeDiktatReports
-Pdetekt.multiplatform.disabled=true
-Pdiktat.githubActions=true
--continue
- name: Upload SARIF report to Github
if: always()
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: build/reports/diktat/diktat-merged.sarif
33 changes: 28 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import com.saveourtool.osv4k.buildutils.configureDiktat
Fixed Show fixed Hide fixed
import com.saveourtool.osv4k.buildutils.createDetektTask

plugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.kotlin.plugin.serialization)
// alias(libs.plugins.kotlin.multiplatform)
// alias(libs.plugins.kotlin.plugin.serialization)
id("com.saveourtool.osv4k.buildutils.kotlin-library")
}

group = "com.saveourtool.osv4k"
Expand All @@ -9,13 +13,19 @@ repositories {
mavenCentral()
}

// version generation
// configureVersioning()
// checks and validations

configureDiktat()
createDetektTask()

kotlin {
jvmToolchain(11)
jvm {
withJava()
compilations.all {
kotlinOptions.run {
jvmTarget = "1.8"
}
kotlinOptions.jvmTarget = "1.8"
}
}
linuxX64()
Expand Down Expand Up @@ -52,5 +62,18 @@ kotlin {
api(libs.jackson.databind)
}
}
val jvmTest by getting {
dependsOn(commonTest)
dependencies {
implementation(kotlin("test-junit5"))
}
}
}
}

setOf("compileJava", "compileTestJava").forEach { taskName ->
tasks.named<JavaCompile>(taskName) {
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
}
}
22 changes: 22 additions & 0 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
plugins {
`kotlin-dsl`
}

repositories {
mavenCentral()
gradlePluginPortal()
}

dependencies {
// workaround https://github.com/gradle/gradle/issues/15383
implementation(files(project.libs.javaClass.superclass.protectionDomain.codeSource.location))
implementation(libs.kotlin.gradle.plugin) {
because("Add plugin on plugin classpath here to automatically set its version for the whole build")
}
implementation(libs.diktat.gradle.plugin)
implementation(libs.detekt.gradle.plugin)
implementation(libs.kotlin.plugin.serialization)
// implementation("io.github.gradle-nexus:publish-plugin:1.3.0")
implementation("org.ajoberstar.reckon:reckon-gradle:0.13.2")
// implementation("org.ajoberstar.reckon:reckon-gradle:0.18.0")
}
7 changes: 7 additions & 0 deletions buildSrc/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* Configuration for detekt static analysis
*/

package com.saveourtool.osv4k.buildutils

import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.DetektPlugin
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.withType

/**
* Configure Detekt for a single project
*/
fun Project.configureDetekt() {
apply<DetektPlugin>()
configure<DetektExtension> {
config = rootProject.files("detekt.yml")
buildUponDefaultConfig = true
}
}

/**
* Register a unified detekt task
*/
fun Project.createDetektTask() {
tasks.register("detektAll") {
allprojects {
this@register.dependsOn(tasks.withType<Detekt>())
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
* Configuration for diktat static analysis
*/

package com.saveourtool.osv4k.buildutils

import org.cqfn.diktat.plugin.gradle.DiktatExtension
import org.cqfn.diktat.plugin.gradle.DiktatGradlePlugin
import org.cqfn.diktat.plugin.gradle.DiktatJavaExecTaskBase
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.withType

/**
* Applies diktat gradle plugin and configures diktat for [this] project
*/
fun Project.configureDiktat() {
apply<DiktatGradlePlugin>()
configure<DiktatExtension> {
diktatConfigFile = rootProject.file("diktat-analysis.yml")
githubActions = findProperty("diktat.githubActions")?.toString()?.toBoolean() ?: false
inputs {
include(
"buildSrc/src/**/*.kt",
"buildSrc/**/*.kts",
"*.kts",
"src/**/*.kt",
"src/**/*.kts",
)
exclude("build", "buildSrc/build")
}
}
fixDiktatTask()
}

private fun Project.fixDiktatTask() {
tasks.withType<DiktatJavaExecTaskBase>().configureEach {
// https://github.com/saveourtool/diktat/issues/1269
systemProperty("user.home", rootDir.toString())
}
}
Loading
Loading