diff --git a/src/Dockerfile b/src/Dockerfile new file mode 100644 index 0000000..47aa5f7 --- /dev/null +++ b/src/Dockerfile @@ -0,0 +1,65 @@ +FROM jenkins/jenkins:2.361.1-jdk11 + +ENV DEBIAN_FRONTEND noninteractive +ENV LANG 'en_US.UTF-8' + +USER root + +RUN dpkg --add-architecture i386 && apt-get update -yqq && apt-get install -y \ + curl \ + expect \ + git \ + make \ + git-core \ + libc6:i386 \ + libgcc1:i386 \ + libncurses5:i386 \ + libstdc++6:i386 \ + zlib1g:i386 \ + openjdk-11-jdk \ + wget \ + unzip \ + vim \ + openssh-client \ + locales \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* \ + && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 + +ENV ANDROID_SDK_ROOT "/sdk" + +RUN mkdir ${ANDROID_SDK_ROOT} +RUN chown -R jenkins ${ANDROID_SDK_ROOT} + +ENV VERSION_SDK_TOOLS "8092744" + +ENV GRADLE_PROFILER "/gradle-profiler/gradle-profiler-0.19.0" + +ENV PATH "${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/emulator:${GRADLE_PROFILER}/bin" + +RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \ + wget https://dl.google.com/android/repository/commandlinetools-linux-${VERSION_SDK_TOOLS}_latest.zip && \ + unzip *tools*linux*.zip -d ${ANDROID_SDK_ROOT} && \ + rm *tools*linux*.zip + +RUN ${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager --update --sdk_root=${ANDROID_SDK_ROOT} + +COPY gradle-profiler-0.19.0.zip gradle-profiler/ + +RUN unzip gradle-profiler/gradle-profiler-0.19.0.zip -d gradle-profiler && rm -v gradle-profiler/gradle-profiler-0.19.0.zip + +RUN yes | ${ANDROID_SDK_ROOT}/cmdline-tools/bin/sdkmanager --licenses --sdk_root=${ANDROID_SDK_ROOT} + +RUN apt-get update && apt-get install -y lsb-release + +RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \ + https://download.docker.com/linux/debian/gpg + +RUN echo "deb [arch=$(dpkg --print-architecture) \ + signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \ + https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list + +RUN apt-get update && apt-get install -y docker-ce-cli + +USER jenkins \ No newline at end of file diff --git a/src/Jenkinsfile b/src/Jenkinsfile new file mode 100644 index 0000000..2b69832 --- /dev/null +++ b/src/Jenkinsfile @@ -0,0 +1,66 @@ +#!groovy +pipeline { + agent { + docker { + image 'infernno/androidimage:1.0.0' + } + } + parameters { + string(name: 'branch', defaultValue: 'development', description: 'Source branh') + } + stages { + stage("Checkout") { + steps { + checkout([ + $class : 'GitSCM', + branches : [[name: "*/${params.branch}"]], + extensions : [], + userRemoteConfigs: [[url: 'https://github.com/Infernno/gamehub.git']] + ]) + } + } + stage('Lint') { + steps { + sh "./gradlew lintDebug" + } + } + stage("Test") { + steps { + script { + if (params.branch.contains('release/')) { + sh "./gradlew testReleaseUnitTest" + } + else { + sh "./gradlew testDebugUnitTest" + } + } + } + } + stage("Build") { + steps { + script { + if (params.branch.contains('release/')) { + sh "./gradlew assembleRelease" + } + else { + sh "./gradlew assembleDebug" + } + } + } + } + stage("Publish") { + steps { + sh "./gradlew publishToMavenLocal" + } + } + } + post { + failure { + script { + if (getContext(hudson.FilePath)) { + archiveArtifacts(artifacts: '**/build/reports/**', allowEmptyArchive: true) + } + } + } + } +} diff --git a/src/JenkinsfileGradleProfiler b/src/JenkinsfileGradleProfiler new file mode 100644 index 0000000..450661d --- /dev/null +++ b/src/JenkinsfileGradleProfiler @@ -0,0 +1,38 @@ +#!groovy +pipeline { + agent { + docker { + image 'infernno/androidimage:1.0.0' + } + } + triggers{ cron('0 22 * * *') } + parameters { + string(name: 'branch', defaultValue: 'development', description: 'Source branch') + } + stages { + stage("Checkout") { + steps { + checkout([ + $class : 'GitSCM', + branches : [[name: "*/${params.branch}"]], + extensions : [], + userRemoteConfigs: [[url: 'https://github.com/Infernno/gamehub.git']] + ]) + } + } + stage("Gradle Profiler") { + steps { + sh "gradle-profiler --benchmark --project-dir ${WORKSPACE} :app:assembleDebug" + } + } + } + post { + failure { + script { + if (getContext(hudson.FilePath)) { + archiveArtifacts(artifacts: '**/build/reports/**', allowEmptyArchive: true) + } + } + } + } +} diff --git a/src/app/build.gradle.kts b/src/app/build.gradle.kts index 1471f07..b3f2b47 100644 --- a/src/app/build.gradle.kts +++ b/src/app/build.gradle.kts @@ -1,3 +1,4 @@ +import io.gamehub.buildlogic.BuildConfig import java.util.* plugins { @@ -12,6 +13,14 @@ if (localProperties.exists() && localProperties.isFile) { } } +val keystoreProps = Properties() +val keystoreProperties = File(rootProject.rootDir, "keystore.properties") +if (keystoreProperties.exists() && keystoreProperties.isFile) { + localProperties.inputStream().use { input -> + keystoreProps.load(input) + } +} + android { namespace = "io.gamehub" @@ -20,9 +29,18 @@ android { versionCode = 1 versionName = "1.0" - val apiKey = checkNotNull(localProps.getProperty("rawg.apiKey")) + val apiKey = checkNotNull(localProps.getProperty("rawg.apiKey") ?: System.getenv()["RAWG_API_KEY"]) buildConfigField("String", "RAWG_API_KEY", "\"$apiKey\"") } + + signingConfigs { + create("release") { + keyAlias = keystoreProps.getProperty("alias") + keyPassword = keystoreProps.getProperty("password") + storeFile = File(rootProject.rootDir, "keystore.jks") + storePassword = keystoreProps.getProperty("password") + } + } } dependencies { diff --git a/src/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/src/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt index 4bfc848..3a1017e 100644 --- a/src/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt +++ b/src/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -35,7 +35,6 @@ class AndroidApplicationConventionPlugin : Plugin { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) - signingConfig = signingConfigs.getByName("debug") } } diff --git a/src/build.gradle.kts b/src/build.gradle.kts index b61d3b8..ebc04b9 100644 --- a/src/build.gradle.kts +++ b/src/build.gradle.kts @@ -1,8 +1,3 @@ -buildscript { - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10") - } -} // Top-level build file where you can add configuration options common to all sub-projects/modules. @Suppress("DSL_SCOPE_VIOLATION") // Intellij Bug plugins { @@ -11,6 +6,7 @@ plugins { alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.dagger.hilt) apply false + alias(libs.plugins.detekt) apply false } tasks.register("clean") { diff --git a/src/gradle/libs.versions.toml b/src/gradle/libs.versions.toml index d024a63..5f7d02d 100644 --- a/src/gradle/libs.versions.toml +++ b/src/gradle/libs.versions.toml @@ -18,6 +18,7 @@ androidxMetrics = "1.0.0-alpha03" googleMaterial = "1.6.1" arrowKt = "1.1.3" room = "2.4.3" +detekt = "1.21.0" # Compose androidxCompose = "1.3.0-rc01" @@ -185,3 +186,4 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } dagger-hilt = { id = "com.google.dagger.hilt.android", version.ref = "dagger2" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } diff --git a/src/keystore.jks b/src/keystore.jks new file mode 100644 index 0000000..ebad229 Binary files /dev/null and b/src/keystore.jks differ diff --git a/src/keystore.properties b/src/keystore.properties new file mode 100644 index 0000000..ae3c3da --- /dev/null +++ b/src/keystore.properties @@ -0,0 +1,2 @@ +alias=gamehub +password=test123