From 63d1cb765575bc6e4082ed1bdddb2d34922bb332 Mon Sep 17 00:00:00 2001 From: Infernno <7915327+Infernno@users.noreply.github.com> Date: Sat, 15 Oct 2022 22:37:09 +0700 Subject: [PATCH 1/3] Remove buildscript --- src/build.gradle.kts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/build.gradle.kts b/src/build.gradle.kts index b61d3b8..89aaa70 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 { From 545ae11c34ec9ab12b013ad2fba8e92b7ff7d4f9 Mon Sep 17 00:00:00 2001 From: Infernno <7915327+Infernno@users.noreply.github.com> Date: Sat, 15 Oct 2022 17:39:39 +0700 Subject: [PATCH 2/3] Add detekt --- src/gradle/libs.versions.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gradle/libs.versions.toml b/src/gradle/libs.versions.toml index d024a63..f63c481 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" From b8670c2a04a8bf2cce75adeaf2a929cdbc268b70 Mon Sep 17 00:00:00 2001 From: Infernno <7915327+Infernno@users.noreply.github.com> Date: Sat, 15 Oct 2022 22:52:25 +0700 Subject: [PATCH 3/3] Add jenkins & dockerfiles --- src/Dockerfile | 65 +++++++++++++++++ src/Jenkinsfile | 66 ++++++++++++++++++ src/JenkinsfileGradleProfiler | 38 ++++++++++ src/app/build.gradle.kts | 20 +++++- .../AndroidApplicationConventionPlugin.kt | 1 - src/build.gradle.kts | 1 + src/gradle/libs.versions.toml | 1 + src/keystore.jks | Bin 0 -> 2539 bytes src/keystore.properties | 2 + 9 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 src/Dockerfile create mode 100644 src/Jenkinsfile create mode 100644 src/JenkinsfileGradleProfiler create mode 100644 src/keystore.jks create mode 100644 src/keystore.properties 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 89aaa70..ebc04b9 100644 --- a/src/build.gradle.kts +++ b/src/build.gradle.kts @@ -6,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 f63c481..5f7d02d 100644 --- a/src/gradle/libs.versions.toml +++ b/src/gradle/libs.versions.toml @@ -186,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 0000000000000000000000000000000000000000..ebad229d6fea3e914acb1f6d4562a922fc86024f GIT binary patch literal 2539 zcma)+X*d*$8pmgEhOwj>LbhyK8?u!-)~p@tpdm>ZvP>N`gbIV~23d2)nX!h%Semh> z$rdR~IQH$xaulNMx!vcU=bYz$y7$BTywCglzwi6;han@DKtM2tjG(~~@{dd(?Qj84 z0BK}I8ib5U{(<8$WN7t&MNm3~45j|Sxj!ls#`)J3k^=~$k)e7&AQt2K_XU&-9qgxD#QQqCLJ1xwVjG*Xt_- zeD;GpAjZ*hv=W)29jWayE`g#+f*p`YzV40RDprBJE;^MWdeo-g_to!bDHdoMS!A#J zu-z`*w+(U7o%XSIXhiaM%EE)0-r-Pt2~*W5|9KP1&@~amWQ}v0s{3me4~X=#Dwmj7 zzo$l5ntgaZt~lCt8+C_oPk3hpgwS2Y1%vrEUq30MsrQDy`fjXLh(k~DT^=H4o>}s} zxSUm3V`msX9l22^@|LQHBL_}=w8nWRzL#uH=sX)j8Q$()F7N+yk}J|rEWaeRUM3@r z&wYf-Btkw`y@nxAlzQMn24w^Qw)2Mk8 zoh@o(fJiFoV@_f(?NK}4Hkgs4uVs*XgE@g-q}q3Xj^*ePo?ZMZy)sC3sd%|a$+ar; zTa_|xDiDf4tu4ssobn;Id2k!sjJ&gRqU5f?j4Q)Bb!O5vy?sMCmKT)=@oBBk31iZk zbyAn!FXZ{GD>c8&UGm~+HsJ87P67-19M@5g6s{N%C;Db>l}3-7!@cQfNbJEWIQhI9 zpw`K^iNlfd{Bct2w@*>U`&EcEI4XzzyF1)!RA^iFd` zeFQdV*u9M}3jXWc%nZR*gD&XR{HMWauM7Q8ew!Mh+FWbvs6|R8EZ`45=j*^J-c3WwO2-iIRo6%(dh&g%kB9TLJHi*%*|f-Tm=VX~2v8j(Ra6@JQ{KpPV?(8-^wDI0?Yj@dLoY-#ZNIPuu;% zsPH4J82np$e@PXAQsEWl26zE(0*C+t;1+-caKlLa6Qfm75I#F^B0*e5LqlCl9iyVI zg;CSOkii3gFP(tV$YAyl)CvLuel+Gk3Gjc3dSmXa0=Hs^HkO6 zy6deDwU&9#zw_)q%I%q^N07mK-xoLs?$iqX(h3*PKgYp+_u8a3tVCB0m$2mq<6sSb zNZtw^Su`!OqWhhTKZ*a&gBa|>S*#U1R_T6K*sR@}_RItuuV1-hTAy?~Oam0bej}w4 zqc}*-?3(LIX1%z6tf^Fc`yy>x>JX@B;-(5DqKs`~3Qh_!tZmuIc)(1_m*lg%;p=k! zr0<*QkwcSl)xrtfja-+*?r^5BO;jqi96nS?vzm26DrD`<_?9b{g?f2K23(np*V!nI zW_`!BmQ-kj42KesQ~FBnF)lJHl_xKR%0p@qv9c=IvZb5EL^>L;Kw?ccAL4Lb^^NHo~A`nlK7-^HSnp- zDbXxb!&bUz5Rfo?j`gsS# zf&uAqQ-_lL)!Iuqduyb!+q8iM>@DF4=X9pq^@ELNg(hI$6k)YlXFGY8E6{U72(-1Y z^E0W&MZi>CQzC>}F@;ZVKsAQdRnTNk4OMH-e|(Y}6)+}A?8#rvVBFYr!oB`xUdp;5 zan+>=?