Files

227 lines
7.1 KiB
Markdown

This project contains several gradle plugins. These plugins are used by the core project or can be used by other project as some are published on MavenCentral.
# Setup
Kotlin Gradle DSL using detekt plugin:
```kotlin
settings.gradle.kts
pluginManagement {
repositories {
mavenCentral() // for stable release
}
}
```
```kotlin
build.gradle.kts
plugins {
id("me.proton.core.gradle-plugins.detekt") version "plugin-version"
}
```
More info about setup, like groovy variant or legacy setup can be found at https://docs.gradle.org/current/userguide/plugins.html.
# Plugins
## Core plugins
- Plugins can be applied via extension functions (inside the `plugins`
block): `protonAndroidLibrary`, `protonAndroidUiLibrary`, `protonComposeUiLibrary`, `protonDagger`
, `protonKotlinLibrary`
- Not published on MavenCentral.
Use internally in core project to orchestrate dependencies and apply android/kotlin/dagger convention config.
## Coverage plugin
- Plugin id: `me.proton.core.gradle-plugins.coverage`
- Published on MavenCentral.
Apply the plugin to each (non-root) project for which the code coverage is needed.
Additional settings can be configured via `protonCoverage` extension,
e.g. setting custom minimum coverage levels, excluding additional files.
## Global coverage plugin
- Plugin id: `me.proton.core.gradle-plugins.global-coverage`
- Published on MavenCentral.
The plugin is intended to be applied to a separate project, that's only used to
generate a global coverage report or perform coverage percentage verification.
## Common coverage config plugin
- Plugin id: `me.proton.core.gradle-plugins.coverage-config`
- Published on MavenCentral.
Apply the plugin on the root project.
Use the `protonCoverage` extension to configure common coverage settings.
Those settings will be picked up the all the submodules that
use the Coverage plugin (`me.proton.core.gradle-plugins.coverage`).
## Detekt plugin
- Plugin id: `me.proton.core.gradle-plugins.detekt`
- Published on MavenCentral.
This plugin should be applied to the root `build.gradle` file. It adds a `multiModuleDetekt` task which generate GitLab CI compatible report.
You can setup the following stage in your `.gitlab-ci`:
```yaml
detekt analysis:
script:
- ./gradlew multiModuleDetekt
artifacts:
reports:
codequality: config/detekt/reports/mergedReport.json
```
## Jacoco plugin
- Plugin id: `me.proton.core.gradle-plugins.jacoco`
- Published on MavenCentral.
This plugin should be applied to the root `build.gradle` file. It adds a `coberturaCoverageReport` task which generate GitLab CI compatible report.
```yaml
coverage report:
script:
- ./gradlew -Pci --console=plain coberturaCoverageReport # This also runs allTest
coverage: /Total.*?(\d{1,3}\.\d{0,2})%/
artifacts:
expire_in: 1 week
paths:
- ./build/reports/*
reports:
cobertura:
- ./build/reports/cobertura-coverage.xml
```
It also allows for further customization. See the [plugin's README](jacoco/README.md) for more info.
## Include Core Build plugin
- Plugin id: `me.proton.core.gradle-plugins.include-core-build`
- Published on MavenCentral.
Gradle Settings Plugin to automatically checkout the Proton Core Build, if needed.
```kotlin
settings.gradle.kts
plugins {
id("me.proton.core.gradle-plugins.include-core-build") version "plugin-version"
}
```
Git Repo Uri:
- isCI -> "https://$username:$token@$host/proton/mobile/android/proton-libs.git"
- else -> "https://github.com/ProtonMail/protoncore_android.git"
Git Clone/Checkout/IncludeBuild:
- if env CORE_COMMIT_SHA exist -> clone/checkout and include full build from provided commit sha, in parent directory.
- if config has includes (see below) -> clone/checkout and include only included projects from provided branch, tag or commit, in parent directory.
Configuration:
```kotlin
settings.gradle.kts
plugins {
id("me.proton.core.gradle-plugins.include-core-build") version "plugin-version"
}
includeCoreBuild {
// refreshIntervalMillis.set("86400000") // How often the repository should be updated, default 24h.
// branch.set("main")
// tag.set("1.0.0")
// commit.set("commitSha")
}
```
Override include with local:
```
gradle.properties
local.git.proton-libs=../proton-libs
```
**Note: This plugin in based
on [IncludeGit Gradle Plugin](https://melix.github.io/includegit-gradle-plugin).**
## Publish-core-libraries plugin
- Plugin id: `publish-core-libraries`
- Not published on MavenCentral.
Use internally in core project to orchestrate [core libraries publication](../README.md#release).
## Environment configuration plugin
- Plugin id: `me.proton.core.gradle-plugins.environment-config`
- Published on MavenCentral.
This plugin should be applied to either build flavor or application build type android extension
in `build.gradle.kts` file.
Generates `build/generated/source/envConfig/{flavor}/{buildType}/EnvironmentConfigurationDefaults.java`
similarly to `BuildConfig.java`.
Generated class is then added to source directories and can be accessed at runtime
* Automatically obtains and sets proxy token if `useProxy` is set to `true`
* By default (if no configuration provided in build.gradle.kts) generates a default production
config (`api.proton.me`)
## Mock-proxy file puller plugin
- Plugin id: `me.proton.core.gradle-plugins.mock-proxy`
- Published on MavenCentral.
Allows to automatically pull recorded mock files from local mock-proxy server.
In order to use it define below environment variables in your `local.properties` file:
1. `MOCK_PROXY_RECORD_DIR=/path-to-local-mock-roxy-repository`
2. `PROJECT_MOCK_FILES_DIR=/path-to-mock-files-dir-in-android-project`
```kotlin
build.gradle.kts
plugins {
id("me.proton.core.gradle-plugins.environment-config")
}
android {
buildTypes {
debug {
environmentConfig {
useProxy = true // use proxy on all debug builds. Defaults to 'false'
}
}
}
defaultConfig {
environmentConfig {
apiPrefix = "mail-api" // will result in base url https://mail-api.proton.me
}
}
productFlavors.register("dev") {
environmentConfig {
host = "proton.black" // will result in base url https://mail-api.proton.black
}
}
productFlavors.register("atlas") {
environmentConfig {
apiPrefix = "test"
baseUrl = "https://special.url" // will result in base url https://test.special.url
}
}
}
```
## Tests
- Plugin id: `me.proton.core.gradle-plugins.tests`
- Published on MavenCentral.
This plugin should be applied to the root `build.gradle` file. It adds an `allTest` task which run
all unit tests in jvm and Android subprojects.
# Release
Release process is based
on [trunk branch for release process](https://trunkbaseddevelopment.com/branch-for-release/).
Release is done by the CI. To trigger a release for version `X.Y.Z`, just push a branch
named `release/gradle-plugins/X.Y.Z`.
When the release is successfully done, a tag `release/gradle-plugins/X.Y.Z` is created from the
commit used to do the release.
Release implementation is orchestrated by project [publish-core-plugins](publish-core-plugins).