diff --git a/.github/actions/create-release-apk/action.yml b/.github/actions/create-release-apk/action.yml new file mode 100644 index 00000000..0cfff92d --- /dev/null +++ b/.github/actions/create-release-apk/action.yml @@ -0,0 +1,38 @@ +name: Release apk +description: Decodes any provided Keystore and creates a signed .apk with this. + +inputs: + keystore: + description: "Keystore Base64 encoded" + required: true + key_alias: + description: "Keystore alias" + required: true + key_password: + description: "Keystore password" + required: true + store_password: + description: "Store password" + required: true + gradle_task: + description: "Gradle Task to execute" + required: false + default: assembleRelease + +runs: + using: "composite" + steps: + - name: Decode Keystore + uses: timheuer/base64-to-file@v1 + with: + fileName: 'keystore.jks' + encodedString: ${{ inputs.keystore }} + + - name: Create .apk file + env: + SIGNING_KEY_ALIAS: ${{ inputs.key_alias }} + SIGNING_KEY_PASSWORD: ${{ inputs.key_password }} + SIGNING_STORE_PASSWORD: ${{ inputs.store_password }} + KEYSTORE_PATH: ${{ runner.temp }}/keystore.jks + shell: bash + run: ./gradlew ${{ inputs.gradle_task }} diff --git a/.github/actions/setup-project/action.yaml b/.github/actions/setup-project/action.yaml new file mode 100644 index 00000000..6eae6c99 --- /dev/null +++ b/.github/actions/setup-project/action.yaml @@ -0,0 +1,13 @@ +name: Setup project +description: Setups the gradle and java environment + +runs: + using: "composite" + steps: + - uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 diff --git a/.github/workflows/build-main.yaml b/.github/workflows/build-main.yaml new file mode 100755 index 00000000..684111ce --- /dev/null +++ b/.github/workflows/build-main.yaml @@ -0,0 +1,46 @@ +name: Build Main + +on: + push: + branches: + - main + +jobs: + build-project: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Project + uses: ./.github/actions/setup-project + + - name: Update Version + run: npm run bump-release # Updates the semantic version depending on the last commits e.g. feature / bugfix + + - name: Set Snapshot Version + run: ./gradlew setSnapshotVersion # Do not chain this command because it writes into a file which needs to be re-read inside the next gradle command + + - name: Build SDK TestApp + uses: ./.github/actions/create-release-apk + with: + keystore: ${{ secrets.KEYSTORE_DEBUG }} + key_alias: ${{ secrets.SIGNING_KEY_ALIAS }} + key_password: ${{ secrets.SIGNING_KEY_PASSWORD }} + store_password: ${{ secrets.SIGNING_STORE_PASSWORD }} + gradle_task: app:assembleRelease + + - name: Archive .apk file + uses: actions/upload-artifact@v3 + with: + name: kuksa_sdk_testapp.apk + path: app/build/outputs/apk/release/app-release.apk + if-no-files-found: error + retention-days: 14 + + - name: Archive changelog + uses: actions/upload-artifact@v3 + with: + name: CHANGELOG.md + path: CHANGELOG.md + retention-days: 14 diff --git a/.github/workflows/build.yaml b/.github/workflows/build-pull-request.yaml similarity index 80% rename from .github/workflows/build.yaml rename to .github/workflows/build-pull-request.yaml index 3b2f9429..907f2019 100755 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build-pull-request.yaml @@ -1,4 +1,4 @@ -name: build +name: Validate Pull Request on: pull_request @@ -7,23 +7,17 @@ jobs: build-project: runs-on: ubuntu-latest steps: - - name: Checkout code uses: actions/checkout@v3 - name: "Run Docker Container of Databroker in detached mode" run: docker run --pull=always --rm --publish 55556:55556/tcp --detach --name databroker ghcr.io/eclipse/kuksa.val/databroker:master --port 55556 --insecure - - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Setup Project + uses: ./.github/actions/setup-project - - name: Run 'assemble' with Gradle Wrapper - run: ./gradlew assemble + - name: Run 'assembleDebug' with Gradle Wrapper + run: ./gradlew assembleDebug - name: Run 'lint' with Gradle Wrapper run: ./gradlew ktlintCheck detekt diff --git a/.github/workflows/check_license.yaml b/.github/workflows/check-license.yaml similarity index 96% rename from .github/workflows/check_license.yaml rename to .github/workflows/check-license.yaml index f400b608..1c73a27f 100755 --- a/.github/workflows/check_license.yaml +++ b/.github/workflows/check-license.yaml @@ -1,4 +1,4 @@ -name: spdx +name: SPDX License Check on: pull_request @@ -7,7 +7,6 @@ jobs: check-spdx-headers: runs-on: ubuntu-latest steps: - - name: Checkout code uses: actions/checkout@v3 with: diff --git a/.github/workflows/commitlint.yaml b/.github/workflows/commitlint.yaml index ad770fd3..ed49d02a 100644 --- a/.github/workflows/commitlint.yaml +++ b/.github/workflows/commitlint.yaml @@ -1,4 +1,4 @@ -name: commitlint +name: Commitlint on: pull_request @@ -7,7 +7,6 @@ jobs: commitlint: runs-on: ubuntu-latest steps: - - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/dash.yaml b/.github/workflows/dash.yaml index a74fb554..50ab90d2 100644 --- a/.github/workflows/dash.yaml +++ b/.github/workflows/dash.yaml @@ -1,4 +1,4 @@ -name: dash +name: Dash License Check on: pull_request @@ -7,17 +7,11 @@ jobs: check-dash: runs-on: ubuntu-latest steps: - - name: Checkout code uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Setup Project + uses: ./.github/actions/setup-project - name: Create Dash Dependency Report run: ./gradlew mergeDashFiles diff --git a/.github/workflows/deploy-release.yaml b/.github/workflows/deploy-release.yaml index 55ac14bc..67b65a0a 100644 --- a/.github/workflows/deploy-release.yaml +++ b/.github/workflows/deploy-release.yaml @@ -1,4 +1,4 @@ -name: deploy-release +name: Deploy Release SDK concurrency: production @@ -15,13 +15,8 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Setup Project + uses: ./.github/actions/setup-project - name: Set Release Version run: ./gradlew setReleaseVersion # Do not chain this command because it writes into a file which needs to be re-read inside the next gradle command diff --git a/.github/workflows/deploy-snapshot.yaml b/.github/workflows/deploy-snapshot.yaml index 3a22f627..cc180e07 100644 --- a/.github/workflows/deploy-snapshot.yaml +++ b/.github/workflows/deploy-snapshot.yaml @@ -1,6 +1,6 @@ -name: deploy-snapshot +name: Deploy Snapshot SDK -concurrency: production +concurrency: snapshot on: push: @@ -15,13 +15,8 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Setup Project + uses: ./.github/actions/setup-project - name: Update Version run: npm run bump-release # Updates the semantic version depending on the last commits e.g. feature / bugfix @@ -36,4 +31,4 @@ jobs: ORG_GPG_PRIVATE_KEY: ${{ secrets.ORG_GPG_PRIVATE_KEY }} ORG_OSSRH_PASSWORD: ${{ secrets.ORG_OSSRH_PASSWORD }} ORG_OSSRH_USERNAME: ${{ secrets.ORG_OSSRH_USERNAME }} - run: ./gradlew --stacktrace publishAllPublicationsToOSSRHSnapshotRepository + run: ./gradlew publishAllPublicationsToOSSRHSnapshotRepository diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 902f0a52..1889a5b8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import org.eclipse.kuksa.property.PropertiesLoader + /* * Copyright (c) 2023 Contributors to the Eclipse Foundation * @@ -59,6 +61,24 @@ android { useSupportLibrary = true } } + signingConfigs { + create("release") { + val propertiesLoader = PropertiesLoader() + val localProperties = propertiesLoader.load("$rootDir/local.properties") + + val keystorePath = System.getenv("KEYSTORE_PATH") ?: localProperties?.getProperty("release.keystore.path") + println("Defined keystore path: $keystorePath") + if (keystorePath == null) return@create + + storeFile = File(keystorePath) + keyAlias = System.getenv("SIGNING_KEY_ALIAS") + ?: localProperties?.getProperty("release.keystore.key.alias") + keyPassword = System.getenv("SIGNING_KEY_PASSWORD") + ?: localProperties?.getProperty("release.keystore.key.password") + storePassword = System.getenv("SIGNING_STORE_PASSWORD") + ?: localProperties?.getProperty("release.keystore.store.password") + } + } buildTypes { // for local builds, used to find shrinking issues val isMinify = project.hasProperty("minify") @@ -75,6 +95,10 @@ android { ) } } + + release { + signingConfig = signingConfigs.getByName("release") + } } namespace = "org.eclipse.kuksa.testapp" lint { diff --git a/buildSrc/src/main/kotlin/org/eclipse/kuksa/property/PropertiesLoader.kt b/buildSrc/src/main/kotlin/org/eclipse/kuksa/property/PropertiesLoader.kt new file mode 100644 index 00000000..2977c84f --- /dev/null +++ b/buildSrc/src/main/kotlin/org/eclipse/kuksa/property/PropertiesLoader.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.eclipse.kuksa.property + +import java.io.File +import java.util.Properties + +class PropertiesLoader { + fun load(path: String): Properties? { + val properties = File(path) + if (!properties.exists()) return null + + properties.reader().use { reader -> + return Properties().apply { + load(reader) + } + } + } +}