From 5e6bbb83710d0a37f32843abc1e027e7d0722334 Mon Sep 17 00:00:00 2001 From: Will Passidomo Date: Wed, 11 May 2022 11:36:43 -0400 Subject: [PATCH] ci: add github workflows (#2) * chore: Upgrade AGP, Kotlin, Gradle, migrate to kts * ci: add github workflows --- .github/workflows/pull-request.yml | 69 ++++++++++ .github/workflows/release.yml | 82 ++++++++++++ .github/workflows/reusable-workflows.yml | 15 +++ .gitignore | 1 + .scripts/maven.gradle | 119 ++++++++++++++++++ .scripts/release.sh | 11 ++ build.gradle | 23 ---- build.gradle.kts | 16 +++ gradle.properties | 6 +- gradle/wrapper/gradle-wrapper.properties | 2 +- media/build.gradle.kts | 31 +++-- media/settings.gradle | 1 - .../java/com/mparticle/media/MediaSession.kt | 1 + .../com/mparticle/media/events/MediaAd.kt | 6 + .../com/mparticle/media/events/MediaError.kt | 4 + .../com/mparticle/MediaEventToCustomEvent.kt | 3 + release.config.js | 100 +++++++++++++++ scripts/maven.gradle | 87 ------------- scripts/release.sh | 20 --- settings.gradle | 1 - settings.gradle.kts | 15 +++ 21 files changed, 462 insertions(+), 151 deletions(-) create mode 100644 .github/workflows/pull-request.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/reusable-workflows.yml create mode 100644 .scripts/maven.gradle create mode 100755 .scripts/release.sh delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 media/settings.gradle create mode 100644 media/src/main/java/com/mparticle/media/events/MediaError.kt create mode 100644 release.config.js delete mode 100644 scripts/maven.gradle delete mode 100755 scripts/release.sh delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 0000000..aef6d90 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,69 @@ +name: "Build and Test" +on: [push, pull_request] +jobs: + unit-tests: + name: "Unit Tests" + timeout-minutes: 15 + runs-on: ubuntu-18.04 + steps: + - name: "Checkout Branch" + uses: actions/checkout@v2 + with: + repository: ${{github.event.pull_request.head.repo.full_name}} + ref: ${{github.head_ref}} + - name: "Install JDK 11" + uses: actions/setup-java@v2 + with: + distribution: "zulu" + java-version: "11" + - name: "Run Unit Tests" + run: ./gradlew test + - name: "Print Android Unit Tests Report" + uses: asadmansr/android-test-report-action@v1.2.0 + if: ${{ always() }} + - name: "Archive Unit Test Results" + uses: actions/upload-artifact@v2 + if: ${{ always() }} + with: + name: "unit-tests-results" + path: ./**/build/reports/** +# lint-checks: +# name: "Lint Checks" +# timeout-minutes: 15 +# runs-on: macos-latest +# steps: +# - name: "Checkout Branch" +# uses: actions/checkout@v2 +# - name: "Install JDK 11" +# uses: actions/setup-java@v2 +# with: +# distribution: "zulu" +# java-version: "11" +# - name: "Run Android Core SDK Lint" +# run: ./gradlew lint +# - name: "Archive Lint Test Results" +# uses: actions/upload-artifact@v2 +# if: ${{ always() }} +# with: +# name: "lint-results" +# path: ./**/build/reports/** + kotlin-lint-checks: + name: "Kotlin Lint Checks" + timeout-minutes: 15 + runs-on: macos-latest + steps: + - name: "Checkout Branch" + uses: actions/checkout@v2 + - name: "Install JDK 11" + uses: actions/setup-java@v2 + with: + distribution: "zulu" + java-version: "11" + - name: "Run Android Core SDK Kotlin Lint" + run: ./gradlew ktlintCheck + - name: "Archive Kotlin Lint Test Results" + uses: actions/upload-artifact@v2 + if: ${{ always() }} + with: + name: "kotlin-lint-results" + path: ./**/build/reports/** \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f71db2a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,82 @@ +name: "Release" +on: + workflow_dispatch: + inputs: + dryRun: + description: "Do a dry run to preview instead of a real release [true/false]" + required: true + default: "false" + +jobs: + semantic-release: + name: "Semantic Release" + runs-on: macos-latest + env: + GITHUB_TOKEN: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }} + GIT_AUTHOR_NAME: mparticle-bot + GIT_AUTHOR_EMAIL: developers@mparticle.com + GIT_COMMITTER_NAME: mparticle-bot + GIT_COMMITTER_EMAIL: developers@mparticle.com + steps: + - name: "Checkout public main branch" + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: main + - name: "Import GPG Key" + uses: crazy-max/ghaction-import-gpg@v4 + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} + git_user_signingkey: true + git_commit_gpgsign: true + - name: "Semantic Release --dry-run" + if: ${{ github.event.inputs.dryRun == 'true' }} + run: | + npx \ + -p lodash \ + -p semantic-release@17 \ + -p @semantic-release/changelog@5 \ + -p @semantic-release/git@9 \ + -p @semantic-release/exec@5 \ + -p conventional-changelog-conventionalcommits \ + semantic-release --dry-run + - name: "Semantic Release" + if: ${{ github.event.inputs.dryRun == 'false' }} + run: | + npx \ + -p lodash \ + -p semantic-release@17 \ + -p @semantic-release/changelog@5 \ + -p @semantic-release/git@9 \ + -p @semantic-release/exec@5 \ + -p conventional-changelog-conventionalcommits \ + semantic-release + - name: "Push automated release commits to release branch" + if: ${{ github.event.inputs.dryRun == 'false' }} + run: | + git push origin main + + sonatype-release: + name: "Sonatype Release" + needs: semantic-release + runs-on: macos-latest + if: ${{ github.event.inputs.dryRun == 'false' }} + env: + sonatypeUsername: ${{ secrets.SONATYPE_NEXUS_USERNAME }} + sonatypePassword: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} + mavenSigningKeyId: ${{ secrets.MAVEN_CENTRAL_SIGNING_KEY }} + mavenSigningKeyPassword: ${{ secrets.MAVEN_CENTRAL_SIGNING_KEY_PASSWORD }} + steps: + - name: "Checkout" + uses: actions/checkout@v2 + with: + ref: main + - name: "Install JDK 11" + uses: actions/setup-java@v2 + with: + distribution: "zulu" + java-version: "11" + - name: "Publish Android To Sonatype" + run: | + ./gradlew -PisRelease=true publishReleasePublicationToMavenRepository --stacktrace diff --git a/.github/workflows/reusable-workflows.yml b/.github/workflows/reusable-workflows.yml new file mode 100644 index 0000000..ce8a3cf --- /dev/null +++ b/.github/workflows/reusable-workflows.yml @@ -0,0 +1,15 @@ +name: "PR Reusable Checks" + +on: + pull_request: + +jobs: + pr-branch-check-name: + name: "Check PR for semantic branch name" + uses: mParticle/mparticle-workflows/.github/workflows/pr-branch-check-name.yml@stable + pr-title-check: + name: "Check PR for semantic title" + uses: mParticle/mparticle-workflows/.github/workflows/pr-title-check.yml@stable + pr-branch-target-gitflow: + name: "Check PR for semantic target branch" + uses: mParticle/mparticle-workflows/.github/workflows/pr-branch-target-continuous.yml@stable diff --git a/.gitignore b/.gitignore index adba6e5..9dc03f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # built application files *.apk *.ap_ +*.bak # files for the dex VM *.dex diff --git a/.scripts/maven.gradle b/.scripts/maven.gradle new file mode 100644 index 0000000..e51e1f7 --- /dev/null +++ b/.scripts/maven.gradle @@ -0,0 +1,119 @@ +apply plugin: 'maven-publish' +apply plugin: 'signing' + +allprojects { + ext."signing.keyId" = System.getenv("mavenSigningKeyId") + ext."signing.secretKeyRingFile" = System.getenv("mavenSigningKeyRingFile") + ext."signing.password" = System.getenv("mavenSigningKeyPassword") +} + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + groupId = "com.mparticle" + artifactId = project.name + version = project.version + if (project.plugins.findPlugin("com.android.library")) { + from components.release + } else { + from components.java + } + + if (project.tasks.findByName('generateJavadocsJar')) { + artifact project.tasks.getByName('mediaSdkJavadoc') + } + if (project.tasks.findByName('generateSourcesJar')) { + artifact project.tasks.getByName('generateSourcesJar') + } + + pom { + name = project.ext.kitDescription + description = project.ext.kitDescription + url = "https://github.com/mParticle/mparticle-android-media-sdk" + licenses { + license { + name = 'The Apache Software License, Version 2.0' + url = 'https://www.apache.org/license/LICENSE-2.0.txt' + } + } + developers { + developer { + id = 'mParticle' + name = 'mParticle Inc.' + email = 'developers@mparticle.com' + } + } + scm { + url = 'https://github.com/mparticle/mparticle-android-media-sdk' + connection = 'scm:git:https://github.com/mparticle/mparticle-android-media-sdk' + developerConnection = 'scm:git:git@github.com:mparticle/mparticle-android-media-sdk.git' + } + } + } + debug(MavenPublication) { + groupId = "com.mparticle" + artifactId = "android-media" + version = project.version + if (project.plugins.findPlugin("com.android.library")) { + from components.debug + } else { + from components.java + } + + if (project.tasks.findByName('generateJavadocsJar')) { + artifact project.tasks.getByName('generateJavadocsJar') + } + + if (project.tasks.findByName('generateSourcesJar')) { + artifact project.tasks.getByName('generateSourcesJar') + } + + pom { + name = project.ext.kitDescription + description = project.ext.kitDescription + url = 'https://github.com/mparticle/mparticle-sdk-android' + licenses { + license { + name = 'The Apache Software License, Version 2.0' + url = 'https://www.apache.org/license/LICENSE-2.0.txt' + } + } + developers { + developer { + id = 'mParticle' + name = 'mParticle Inc.' + email = 'developers@mparticle.com' + } + } + scm { + url = 'https://github.com/mparticle/mparticle-android-sdk' + connection = 'scm:git:https://github.com/mparticle/mparticle-android-sdk' + developerConnection = 'scm:git:git@github.com:mparticle/mparticle-android-sdk.git' + } + } + } + } + repositories { + maven { + credentials { + username System.getenv('sonatypeUsername') + password System.getenv('sonatypePassword') + } + url = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + } + } + } + + def signingKey = System.getenv("mavenSigningKeyId") + def signingPassword = System.getenv("mavenSigningKeyPassword") + signing { + required { gradle.taskGraph.hasTask("publishReleasePublicationToMavenRepository") } + useInMemoryPgpKeys(signingKey, signingPassword) + sign publishing.publications.release + } +} + +//Publishing task aliases for simpler local development +task publishLocal { dependsOn "publishDebugPublicationToMavenLocal" } +task publishReleaseLocal { dependsOn "publishReleasePublicationToMavenLocal" } diff --git a/.scripts/release.sh b/.scripts/release.sh new file mode 100755 index 0000000..130b99f --- /dev/null +++ b/.scripts/release.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +: ${1?"Version missing - usage: $0 x.y.z"} + +#update build.gradle.kts +sed -i '.bak' "s/version=.*/version=$1/g" gradle.properties + +#update README.md +sed -i '.bak' "s/'com.mparticle:android-media:.*'/'com.mparticle:android-media:$1'/g" README.md + +#commit the version bump, tag, and push to private and public +git add gradle.properties diff --git a/build.gradle b/build.gradle deleted file mode 100644 index a65c480..0000000 --- a/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -buildscript { - ext { - kotlin_version = '1.4.10' - } - - repositories { - jcenter() - google() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - group = 'com.mparticle' - version = '1.3.1-SNAPSHOT' - if (project.hasProperty('isRelease') && project.isRelease) { - version = version.toString().replace("-SNAPSHOT", "") - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..f323cf1 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("org.sonarqube") apply true + id("org.jlleitschuh.gradle.ktlint") apply true +} + +allprojects { + group = project.properties["group"].toString() + version = project.properties["version"].toString() + if (project.hasProperty("isRelease")) { + version = version.toString().replace("-SNAPSHOT", "") + } + repositories { + google() + mavenCentral() + } +} diff --git a/gradle.properties b/gradle.properties index 07673db..89d6163 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,6 @@ kotlin.code.style=official -android.useAndroidX=true \ No newline at end of file +android.useAndroidX=true +android.nonTransitiveRClass=true + +group=com.mparticle +version=1.3.1 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index faaa8e0..c9f014a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-all.zip diff --git a/media/build.gradle.kts b/media/build.gradle.kts index f94e5aa..084150f 100644 --- a/media/build.gradle.kts +++ b/media/build.gradle.kts @@ -1,44 +1,41 @@ -import org.sonarqube.gradle.SonarQubeExtension - plugins { id("com.android.library") kotlin("android") - kotlin("android.extensions") - id("org.sonarqube").version("2.7") - } ext["kitDescription"] = "Media Api to supplement core SDK" -apply(from= "../scripts/maven.gradle") +apply(from= "../.scripts/maven.gradle") android { + compileSdk = 31 defaultConfig { - minSdkVersion(16) - compileSdkVersion(28) + minSdk = 16 + targetSdk = 31 + } + lint { + abortOnError = false } } repositories { - jcenter() - mavenLocal() + mavenCentral() google() } - dependencies { - testImplementation(files("libs/test-utils.aar")) - testImplementation(files("libs/java-json.jar")) - testImplementation("junit:junit:4.12") - implementation("org.jetbrains.kotlin:kotlin-stdlib-common") implementation("com.mparticle:android-core:[5.11.3,)") + testImplementation(files("libs/test-utils.aar")) + testImplementation(files("libs/java-json.jar")) + testImplementation("junit:junit:4.12") } -configure { + +configure { properties { property("sonar.projectName", "Android") - property("sonar.prjectKey", "Android") + property("sonar.projectKey", "Android") } } diff --git a/media/settings.gradle b/media/settings.gradle deleted file mode 100644 index 6d1cc50..0000000 --- a/media/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':shared' \ No newline at end of file diff --git a/media/src/main/java/com/mparticle/media/MediaSession.kt b/media/src/main/java/com/mparticle/media/MediaSession.kt index 77ea8d2..6c99f25 100644 --- a/media/src/main/java/com/mparticle/media/MediaSession.kt +++ b/media/src/main/java/com/mparticle/media/MediaSession.kt @@ -1,5 +1,6 @@ package com.mparticle.media +import android.annotation.SuppressLint import com.mparticle.MPEvent import com.mparticle.MParticle import com.mparticle.media.events.* diff --git a/media/src/main/java/com/mparticle/media/events/MediaAd.kt b/media/src/main/java/com/mparticle/media/events/MediaAd.kt index 13057a5..72a12eb 100644 --- a/media/src/main/java/com/mparticle/media/events/MediaAd.kt +++ b/media/src/main/java/com/mparticle/media/events/MediaAd.kt @@ -1,5 +1,11 @@ package com.mparticle.media.events +import android.app.Application +import com.mparticle.MParticle +import com.mparticle.MParticleOptions +import com.mparticle.identity.BaseIdentityTask + + class MediaAd( var title: String? = null, var duration: Long? = null, diff --git a/media/src/main/java/com/mparticle/media/events/MediaError.kt b/media/src/main/java/com/mparticle/media/events/MediaError.kt new file mode 100644 index 0000000..2575b31 --- /dev/null +++ b/media/src/main/java/com/mparticle/media/events/MediaError.kt @@ -0,0 +1,4 @@ +package com.mparticle.media.events + +class MediaError { +} \ No newline at end of file diff --git a/media/src/test/java/com/mparticle/MediaEventToCustomEvent.kt b/media/src/test/java/com/mparticle/MediaEventToCustomEvent.kt index d85c91e..85036e3 100644 --- a/media/src/test/java/com/mparticle/MediaEventToCustomEvent.kt +++ b/media/src/test/java/com/mparticle/MediaEventToCustomEvent.kt @@ -1,5 +1,7 @@ package com.mparticle +import android.app.Application +import com.mparticle.identity.BaseIdentityTask import com.mparticle.media.MediaSession import com.mparticle.media.events.* import com.mparticle.testutils.RandomUtils @@ -8,6 +10,7 @@ import junit.framework.Assert.assertNotNull import org.junit.Test import java.util.* + class MediaEventToCustomEvent { val random = Random() val randomUtils = RandomUtils() diff --git a/release.config.js b/release.config.js new file mode 100644 index 0000000..f0ca2aa --- /dev/null +++ b/release.config.js @@ -0,0 +1,100 @@ +module.exports = { + branches: ["main"], + tagFormat: "v${version}", + plugins: [ + [ + "@semantic-release/commit-analyzer", + { + preset: "angular", + releaseRules: [ + {type: 'feat', release: 'minor'}, + {type: 'ci', release: 'patch'}, + {type: 'fix', release: 'patch'}, + {type: 'docs', release: 'patch'}, + {type: 'test', release: 'patch'}, + {type: 'refactor', release: 'patch'}, + {type: 'style', release: 'patch'}, + {type: 'build', release: 'patch'}, + {type: 'chore', release: 'patch'}, + {type: 'revert', release: 'patch'} + ] + } + ], + [ + "@semantic-release/release-notes-generator", + { + preset: "conventionalcommits", + presetConfig: { + types: [ + { + "type": "feat", + "section": "Features", + "hidden": false + }, + { + "type": "fix", + "section": "Bug Fixes", + "hidden": false + }, + { + "type": "docs", + "section": "Documentation", + "hidden": false + }, + { + "type": "style", + "section": "Updates & Maintenance", + "hidden": false + }, + { + "type": "refactor", + "section": "Updates & Maintenance", + "hidden": false + }, + { + "type": "perf", + "section": "Updates & Maintenance", + "hidden": false + }, + { + "type": "test", + "section": "Updates & Maintenance", + "hidden": false + }, + { + "type": "ci", + "section": "Updates & Maintenance", + "hidden": false + }, + { + "type": "chore", + "section": "Updates & Maintenance", + "hidden": false + } + ] + } + } + ], + [ + "@semantic-release/changelog", + { + changelogFile: "CHANGELOG.md", + }, + ], + [ + "@semantic-release/exec", + { + prepareCmd: "sh ./.scripts/release.sh ${nextRelease.version}", + }, + ], + ["@semantic-release/github"], + [ + "@semantic-release/git", + { + assets: ["CHANGELOG.md", "build.gradle", "README.md"], + message: + "chore(release): ${nextRelease.version} \n\n${nextRelease.notes}", + }, + ], + ], +}; diff --git a/scripts/maven.gradle b/scripts/maven.gradle deleted file mode 100644 index 1ebf40e..0000000 --- a/scripts/maven.gradle +++ /dev/null @@ -1,87 +0,0 @@ -apply plugin: 'maven' - -allprojects { - ext."signing.keyId" = System.getenv("mavenSigningKeyId") - ext."signing.secretKeyRingFile" = System.getenv("mavenSigningKeyRingFile") - ext."signing.password" = System.getenv("mavenSigningKeyPassword") -} - -configurations { - deployerJars -} - -dependencies { - deployerJars "org.kuali.maven.wagons:maven-s3-wagon:1.2.1" -} - -def target_maven_repo -if (project.hasProperty('target_maven_repo')) { - target_maven_repo = project.property('target_maven_repo') -} - -if (target_maven_repo in ['sonatype', 'sonatype-snapshot']) { - apply plugin: 'signing' - signing { - required { gradle.taskGraph.hasTask("uploadArchives") } - sign configurations.archives - } -} - - - -uploadArchives{ - repositories { - mavenDeployer { - if (target_maven_repo == 'sonatype') { - beforeDeployment { - MavenDeployment deployment -> signing.signPom(deployment) - } - repository(url: 'https://oss.sonatype.org/service/local/staging/deploy/maven2/') { - authentication(userName: System.getenv('sonatypeUsername'), password: System.getenv('sonatypePassword')) - } - } else if (target_maven_repo == 'sonatype-snapshot') { - beforeDeployment { - MavenDeployment deployment -> signing.signPom(deployment) - } - repository(url: 'https://oss.sonatype.org/content/repositories/snapshots/') { - authentication(userName: System.getenv('sonatypeUsername'), password: System.getenv('sonatypePassword')) - } - } else if (target_maven_repo == 's3') { - configuration = configurations.deployerJars - repository(url: 's3://maven.mparticle.com') - } else { - repository(url: 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath) - } - - pom.project { - version project.version - artifactId 'android-media' - packaging 'aar' - name project.ext.kitDescription - description project.ext.kitDescription - url 'https://github.com/mParticle/mparticle-android-media-sdk' - - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/license/LICENSE-2.0.txt' - } - } - - scm { - url 'https://github.com/mParticle/mparticle-android-media-sdk' - connection 'scm:git@github.com:mParticle/mparticle-android-media-sdk.git' - developerConnection 'scm:git@github.com:mParticle/mparticle-android-media-sdk.git' - } - - developers { - developer { - id 'mParticle' - name 'mParticle Inc.' - email 'developers@mparticle.com' - } - } - } - } - } -} diff --git a/scripts/release.sh b/scripts/release.sh deleted file mode 100755 index 558fb4f..0000000 --- a/scripts/release.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -: ${1?"Version missing - usage: $0 x.y.z"} - -#update build.gradle -sed -i '.bak' "s/version = '.*-SNAPSHOT/version = '$1-SNAPSHOT/g" build.gradle - -#update README.md -sed -i '.bak' "s/'com.mparticle:android-media:.*'/'com.mparticle:android-media:$1'/g" README.md - -#commit the version bump, tag, and push to private and public -git add build.gradle -git add README.md -git commit -m "Update version to $1" -git tag "v$1" -git push origin "v$1" -git remote add public git@github.com:mParticle/mparticle-android-media.git -git push public "v$1" -git push origin HEAD:development -git push origin HEAD:master -git push public HEAD:master \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index e90ab86..0000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':media' \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..00ab6d2 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,15 @@ +include("media") +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + plugins { + id("com.android.library") version "7.1.3" + id("org.jlleitschuh.gradle.ktlint") version "10.2.1" + kotlin("android") version "1.6.20" + id("org.sonarqube") version "3.3" + id("org.jlleitschuh.gradle.ktlint") version "10.2.1" + } +}