diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000..0a39c9c --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,69 @@ +name: Build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + workflow_dispatch: + +jobs: + build: + name: Build + runs-on: ubuntu-latest + + steps: + - name: Check out + uses: actions/checkout@v3 + + - name: Check out Yggdrasil + uses: actions/checkout@v3 + with: + repository: yggdrasil-network/yggdrasil-go + path: yggdrasil-go + ref: develop + fetch-depth: 0 + + - name: Setup Go environment + uses: actions/setup-go@v3.3.1 + + - name: Install gomobile + run: | + go install golang.org/x/mobile/cmd/gomobile@latest + ~/go/bin/gomobile init + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + cache: gradle + + - name: Install NDK + uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: r21e + add-to-path: false + + - name: Build Yggdrasil + run: | + mkdir app/libs + cd yggdrasil-go + PATH=$PATH:~/go/bin/ ./contrib/mobile/build -a + cp {yggdrasil.aar,yggdrasil-sources.jar} ../app/libs + env: + ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} + + - name: Gradle build + run: | + echo "${{ secrets.RELEASE_KEYSTORE }}" > app/gha.keystore.asc + gpg -d --passphrase "${{ secrets.RELEASE_KEYSTORE_PASSWORD }}" --batch app/gha.keystore.asc > app/gha.jks + chmod +x gradlew + ./gradlew assembleYggdrasil + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: yggdrasil-android + path: app/build/outputs/apk/yggdrasil/app-yggdrasil.apk diff --git a/.github/workflows/nightlylink.yml b/.github/workflows/nightlylink.yml new file mode 100644 index 0000000..a90b517 --- /dev/null +++ b/.github/workflows/nightlylink.yml @@ -0,0 +1,62 @@ +name: Comment +on: + workflow_run: + workflows: ['Build'] + types: [completed] +jobs: + pr_comment: + if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + with: + # This snippet is public-domain, taken from + # https://github.com/oprypin/nightly.link/blob/master/.github/workflows/pr-comment.yml + script: | + async function upsertComment(owner, repo, issue_number, purpose, body) { + const {data: comments} = await github.rest.issues.listComments( + {owner, repo, issue_number}); + + const marker = ``; + body = marker + "\n" + body; + + const existing = comments.filter((c) => c.body.includes(marker)); + if (existing.length > 0) { + const last = existing[existing.length - 1]; + core.info(`Updating comment ${last.id}`); + await github.rest.issues.updateComment({ + owner, repo, + body, + comment_id: last.id, + }); + } else { + core.info(`Creating a comment in issue / PR #${issue_number}`); + await github.rest.issues.createComment({issue_number, body, owner, repo}); + } + } + + const {owner, repo} = context.repo; + const run_id = ${{github.event.workflow_run.id}}; + + const pull_requests = ${{ toJSON(github.event.workflow_run.pull_requests) }}; + if (!pull_requests.length) { + return core.error("This workflow doesn't match any pull requests!"); + } + + const artifacts = await github.paginate( + github.rest.actions.listWorkflowRunArtifacts, {owner, repo, run_id}); + if (!artifacts.length) { + return core.error(`No artifacts found`); + } + let body = `Download the artifacts for this pull request:\n`; + for (const art of artifacts) { + body += `\n* [${art.name}.zip](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; + } + + core.info("Review thread message body:", body); + + for (const pr of pull_requests) { + await upsertComment(owner, repo, pr.number, + "nightly-link", body); + } + diff --git a/.gitignore b/.gitignore index 52ead0e..2595523 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ local.properties /app/libs/yggdrasil.aar /app/libs/yggdrasil-sources.jar +/app/release/* +/app/release diff --git a/app/build.gradle b/app/build.gradle index ba47604..52a4d45 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,11 +17,27 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + signingConfigs { + create("yggdrasil") { + // You need to specify either an absolute path or include the + // keystore file in the same directory as the build.gradle file. + storeFile = file("gha.jks") + storePassword = "g1thub4ct10n34yggdr4s1l4ndr01d" + keyAlias = "yggdrasil-android" + keyPassword = "g1thub4ct10n34yggdr4s1l4ndr01d" + } + } + buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } + yggdrasil { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig = signingConfigs.getByName("yggdrasil") + } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -43,4 +59,4 @@ dependencies { testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' -} \ No newline at end of file +} diff --git a/app/release/app-release.apk b/app/release/app-release.apk deleted file mode 100644 index 308acc1..0000000 Binary files a/app/release/app-release.apk and /dev/null differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json deleted file mode 100644 index 03e0490..0000000 --- a/app/release/output-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "APK", - "kind": "Directory" - }, - "applicationId": "eu.neilalexander.yggdrasil", - "variantName": "release", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "versionCode": 1, - "versionName": "1.0", - "outputFile": "app-release.apk" - } - ] -} \ No newline at end of file diff --git a/readme.md b/readme.md index b5b8a53..69fe52e 100644 --- a/readme.md +++ b/readme.md @@ -26,7 +26,7 @@ cp /tmp/yggdrasil-go/yggdrasil.aar /tmp/yggdrasil-android/app/libs/ ``` cd /tmp/yggdrasil-android -./gradlew assemble +./gradlew assembleRelease ``` note: you will need to use jdk-11 as jdk-16 `"doesn't work" ™`