Merge pull request #1 from ouchadam/ci

Adding CI pipelines for assembly and testing
This commit is contained in:
Adam Brown 2022-02-27 22:55:42 +00:00
commit e792264b3c
4 changed files with 138 additions and 48 deletions

35
.github/workflows/assemble.yml vendored Normal file
View File

@ -0,0 +1,35 @@
name: Assemble
on:
push:
branches:
- 'main'
pull_request:
jobs:
assemble-debug:
name: Assemble debug variant
runs-on: ubuntu-latest
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '11'
- name: Assemble debug variant
run: ./gradlew assembleDebug --no-daemon

53
.github/workflows/test.yml vendored Normal file
View File

@ -0,0 +1,53 @@
name: Test
on:
push:
branches:
- 'main'
pull_request:
jobs:
unit-tests:
name: Run all unit tests (with coverage)
runs-on: ubuntu-latest
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '11'
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Start synapse server
run: |
pip install matrix-synapse
curl -sL https://raw.githubusercontent.com/matrix-org/synapse/develop/demo/start.sh \
| bash -s -- --no-rate-limit
- name: Run all unit tests
run: ./gradlew clean allCodeCoverageReport --no-daemon
- name: Print coverage size
run: ls -l ./build/reports/jacoco/allCodeCoverageReport/allCodeCoverageReport.xml
- uses: codecov/codecov-action@v2
with:
files: ./build/reports/jacoco/allCodeCoverageReport/allCodeCoverageReport.xml

View File

@ -1,4 +1,4 @@
# SmallTalk [![codecov](https://codecov.io/gh/ouchadam/small-talk/branch/main/graph/badge.svg?token=ETFSLZ9FCI)](https://codecov.io/gh/ouchadam/small-talk) # SmallTalk [![Assemble](https://github.com/ouchadam/small-talk/actions/workflows/assemble.yml/badge.svg)](https://github.com/ouchadam/small-talk/actions/workflows/assemble.yml) [![codecov](https://codecov.io/gh/ouchadam/small-talk/branch/main/graph/badge.svg?token=ETFSLZ9FCI)](https://codecov.io/gh/ouchadam/small-talk)
`SmallTalk` is a minimal, modern, friends and family focused Android messenger. Heavily inspired by Whatsapp and Signal, powered by Matrix. `SmallTalk` is a minimal, modern, friends and family focused Android messenger. Heavily inspired by Whatsapp and Signal, powered by Matrix.

View File

@ -26,68 +26,70 @@ def excludes = [
] ]
def initializeReport(report, projects, classExcludes) { def initializeReport(report, projects, classExcludes) {
report.executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec") projects.each { project -> project.apply plugin: 'jacoco' }
report.executionData { fileTree(rootProject.rootDir.absolutePath).include("**/build/jacoco/*.exec") }
def includeAndroid = { project, type ->
report.sourceDirectories.setFrom(report.sourceDirectories + files(["${project.projectDir}/src/main/kotlin"]))
def androidClasses = project.files([project.fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${type}", excludes: classExcludes)])
report.classDirectories.setFrom(androidClasses + report.classDirectories)
}
projects.each { project ->
project.apply plugin: 'jacoco'
project.afterEvaluate {
switch (project) {
case { it.plugins.hasPlugin("com.android.application") }:
includeAndroid(it, "debug")
break
case { it.plugins.hasPlugin("com.android.library") }:
includeAndroid(it, "release")
break
default:
report.sourceSets it.sourceSets.main
report.classDirectories.setFrom(files(report.classDirectories.files.collect {
fileTree(dir: it, excludes: classExcludes)
}))
}
}
}
report.reports { report.reports {
xml.enabled true xml.enabled true
html.enabled true html.enabled true
csv.enabled false csv.enabled false
} }
gradle.projectsEvaluated {
def androidSourceDirs = []
def androidClassDirs = []
projects.each { project ->
switch (project) {
case { project.plugins.hasPlugin("com.android.application") }:
androidClassDirs.add("${project.buildDir}/tmp/kotlin-classes/debug")
androidSourceDirs.add("${project.projectDir}/src/main/kotlin")
break
case { project.plugins.hasPlugin("com.android.library") }:
androidClassDirs.add("${project.buildDir}/tmp/kotlin-classes/release")
androidSourceDirs.add("${project.projectDir}/src/main/kotlin")
break
default:
report.sourceSets project.sourceSets.main
}
}
report.sourceDirectories.setFrom(report.sourceDirectories + files(androidSourceDirs))
def classFiles = androidClassDirs.collect { files(it).files }.flatten()
report.classDirectories.setFrom(files((report.classDirectories.files + classFiles).collect {
fileTree(dir: it, excludes: classExcludes)
}))
}
} }
def collectProjects(predicate) { def collectProjects(predicate) {
return subprojects.findAll { it.buildFile.isFile() && predicate(it) } return subprojects.findAll { it.buildFile.isFile() && predicate(it) }
} }
task unitCodeCoverageReport(type: JacocoReport) { //task unitCodeCoverageReport(type: JacocoReport) {
rootProject.apply plugin: 'jacoco' // outputs.upToDateWhen { false }
def excludedProjects = [ // rootProject.apply plugin: 'jacoco'
'olm-stub', // def excludedProjects = [
'test-harness' // 'olm-stub',
] // 'test-harness'
def projects = collectProjects { !excludedProjects.contains(it.name) } // ]
dependsOn ":app:assembleDebug" // def projects = collectProjects { !excludedProjects.contains(it.name) }
dependsOn { projects*.test } // dependsOn { ["app:assembleDebug"] + projects*.test }
initializeReport(it, projects, excludes) // initializeReport(it, projects, excludes)
} //}
//
task harnessCodeCoverageReport(type: JacocoReport) { //task harnessCodeCoverageReport(type: JacocoReport) {
rootProject.apply plugin: 'jacoco' // outputs.upToDateWhen { false }
def projects = collectProjects { true } // rootProject.apply plugin: 'jacoco'
dependsOn ":app:assembleDebug" // def projects = collectProjects { true }
dependsOn { project(":test-harness").test } // dependsOn { ["app:assembleDebug", project(":test-harness").test] }
initializeReport(it, projects, excludes) // initializeReport(it, projects, excludes)
} //}
task allCodeCoverageReport(type: JacocoReport) { task allCodeCoverageReport(type: JacocoReport) {
outputs.upToDateWhen { false }
rootProject.apply plugin: 'jacoco' rootProject.apply plugin: 'jacoco'
def projects = collectProjects { true } def projects = collectProjects { true }
dependsOn ":app:assembleDebug" dependsOn { ["app:assembleDebug"] + projects*.test }
dependsOn { projects*.test }
initializeReport(it, projects, excludes) initializeReport(it, projects, excludes)
} }