diff --git a/.github/runner-files/ci-gradle.properties b/.github/runner-files/ci-gradle.properties index 5f70cbccf..76174ea4e 100644 --- a/.github/runner-files/ci-gradle.properties +++ b/.github/runner-files/ci-gradle.properties @@ -1,6 +1,7 @@ org.gradle.daemon=false org.gradle.jvmargs=-Xmx5120m org.gradle.workers.max=2 +org.gradle.parallel=true kotlin.incremental=false kotlin.compiler.execution.strategy=in-process diff --git a/.github/scripts/commit-repo.sh b/.github/scripts/commit-repo.sh new file mode 100755 index 000000000..ab6163b83 --- /dev/null +++ b/.github/scripts/commit-repo.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +rsync -a --delete --exclude .git --exclude .gitignore ../master/repo/ . +git config --global user.email "github-actions[bot]@users.noreply.github.com" +git config --global user.name "github-actions[bot]" +git status +if [ -n "$(git status --porcelain)" ]; then + git add . + git commit -m "Update extensions repo" + git push +else + echo "No changes to commit" +fi diff --git a/.travis/create-repo.sh b/.github/scripts/create-repo.sh similarity index 98% rename from .travis/create-repo.sh rename to .github/scripts/create-repo.sh index f84c735e5..c97d22be0 100755 --- a/.travis/create-repo.sh +++ b/.github/scripts/create-repo.sh @@ -10,7 +10,7 @@ cp -f apk/* repo/apk cd repo -APKS=( ../apk/*".apk"* ) +APKS=( ../apk/*".apk" ) for APK in ${APKS[@]}; do FILENAME=$(basename ${APK}) diff --git a/.github/scripts/sign-apks.sh b/.github/scripts/sign-apks.sh new file mode 100755 index 000000000..af7ec544e --- /dev/null +++ b/.github/scripts/sign-apks.sh @@ -0,0 +1,35 @@ +#!/bin/bash +set -e + +TOOLS="$(ls -d ${ANDROID_HOME}/build-tools/* | tail -1)" + +shopt -s globstar nullglob extglob +APKS=( **/*".apk" ) + +# Take base64 encoded key input and put it into a file +STORE_PATH=$PWD/signingkey.jks +rm -f $STORE_PATH && touch $STORE_PATH +echo $1 | base64 -d > $STORE_PATH + +STORE_ALIAS=$2 +export KEY_STORE_PASSWORD=$3 +export KEY_PASSWORD=$4 + +DEST=$PWD/apk +rm -rf $DEST && mkdir -p $DEST + +# Sign all of the APKs +for APK in ${APKS[@]}; do + BASENAME=$(basename $APK) + APKNAME="${BASENAME%%+(-release*)}.apk" + APKDEST="$DEST/$APKNAME" + + ${TOOLS}/zipalign -c -v -p 4 $APK + + cp $APK $APKDEST + ${TOOLS}/apksigner sign --ks $STORE_PATH --ks-key-alias $STORE_ALIAS --ks-pass env:KEY_STORE_PASSWORD --key-pass env:KEY_PASSWORD $APKDEST +done + +rm $STORE_PATH +unset KEY_STORE_PASSWORD +unset KEY_PASSWORD diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..f5ddfe666 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,87 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + +jobs: + check_wrapper: + name: Validate Gradle Wrapper + runs-on: ubuntu-latest + + steps: + - name: Clone repo + uses: actions/checkout@v2 + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + build: + name: Build extension repo + needs: check_wrapper + if: "!startsWith(github.event.head_commit.message, '[SKIP CI]')" + runs-on: ubuntu-latest + + steps: + - name: Cancel previous runs + uses: styfle/cancel-workflow-action@0.5.0 + with: + access_token: ${{ github.token }} + + - name: Checkout master branch + uses: actions/checkout@v2 + with: + ref: master + path: master + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Copy CI gradle.properties + run: | + cd master + mkdir -p ~/.gradle + cp .github/runner-files/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Build extensions + uses: eskatos/gradle-command-action@v1 + with: + build-root-directory: master + wrapper-directory: master + arguments: assembleRelease + wrapper-cache-enabled: true + dependencies-cache-enabled: true + configuration-cache-enabled: true + + - name: Sign APKs + if: github.event_name == 'push' && github.repository == 'inorichi/tachiyomi-extensions' + run: | + cd master + ./.github/scripts/sign-apks.sh \ + ${{ secrets.SIGNING_KEY }} \ + ${{ secrets.ALIAS }} \ + ${{ secrets.KEY_STORE_PASSWORD }} \ + ${{ secrets.KEY_PASSWORD }} + + - name: Create repo artifacts + if: github.event_name == 'push' && github.repository == 'inorichi/tachiyomi-extensions' + run: | + cd master + ./.github/scripts/create-repo.sh + + - name: Checkout repo branch + if: github.event_name == 'push' && github.repository == 'inorichi/tachiyomi-extensions' + uses: actions/checkout@v2 + with: + ref: repo + path: repo + + - name: Deploy repo + if: github.event_name == 'push' && github.repository == 'inorichi/tachiyomi-extensions' + run: | + cd repo + ../master/.github/scripts/commit-repo.sh diff --git a/.github/workflows/pr_build_check.yml b/.github/workflows/pr_build_check.yml deleted file mode 100644 index cc3c628d5..000000000 --- a/.github/workflows/pr_build_check.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Pull request build check - -on: - pull_request: - branches: [master] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Clone repo - uses: actions/checkout@v2 - - - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v1 - - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - - name: Copy CI gradle.properties - run: | - mkdir -p ~/.gradle - cp .github/runner-files/ci-gradle.properties ~/.gradle/gradle.properties - - - name: Build project - uses: eskatos/gradle-command-action@v1 - with: - arguments: assembleDebug - wrapper-cache-enabled: true - dependencies-cache-enabled: true - configuration-cache-enabled: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1f1c53dea..000000000 --- a/.travis.yml +++ /dev/null @@ -1,48 +0,0 @@ -dist: trusty -language: android -android: - components: - - build-tools-29.0.3 - - android-29 - - extra-android-m2repository - - extra-google-m2repository - - extra-android-support - licenses: - - android-sdk-license-.+ -before_install: -- yes | sdkmanager "platforms;android-29" # workaround for accepting the license -- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then - openssl aes-256-cbc -K $encrypted_5ba4ee4c096f_key -iv $encrypted_5ba4ee4c096f_iv -in "$PWD/.travis/secrets.tar.enc" -out secrets.tar -d; - tar xf secrets.tar; - fi -- mkdir "$ANDROID_HOME/licenses" || true -- echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" -- echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license" -script: - - .travis/build.sh && .travis/create-repo.sh -before_cache: -- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock -- rm -fr $HOME/.gradle/caches/*/plugin-resolution/ -cache: - directories: - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ - - $HOME/.android/build-cache - - repo -deploy: -- provider: pages - local-dir: repo - target-branch: repo - skip-cleanup: true - keep-history: true - github-token: - secure: "SCzQyavQM/bfOjEF+eKp9l0DxiAgsB3v64hYQNb2s/sql4WiL8Mjv9HEAyxBWDfGwUg1cNELWR7s2Y1j/8lCLFaZ5doy7222ZSaRP48MGhpGJQi22jGOqavMNCIcS5EZCjo3OJ9+VWLcx67OIJUQK3KHmnxgeM00luPjzC0a3FiED7/7joU4y9fkQhizfnV6AEZjEma0wUH4+wQxUC+5H71nNDZuz77BO3slZ4TX2YKg9O+QIr5jIjv4GT7dqh+UDQUoMvPXVtORUTI3yOzziwEawc64uMUr+0NtSr9ww+9lg4fs7IeVwkTlDEDbVDFdwvLYAvKlZCqboKygG7NX5Pi11grLYYCrqynXXIsyyBtEyV/fkGt2UcQrMOJRxxI6RkZFuUwozP/DVVO9XiebEfoKKZaQ/ehljveu8+B5S+qsKTO/sFMQJhvi2muhXkUvXeduSjHfqgAxEzrnh6sTR4laI05ICVJVw5j38iUfqOEo4rF+cX11ywgHFzp9RJjYCYhndvobv5vtwk77hrndzVcLlKKlKO4tJDfwg+czRRD7oSX9pT0NeL7tRyD86sNryPMG5pBAfJ4D7knnM9+YmRNJmnsmnu/FGeYlBygUK5IiG05LQ7TfkXiF0wQt7nvlixAiB3ULrso18lqP9U2bGHdjLNaRip3dVxHbrCmP9xY=" - on: - branch: master - repo: inorichi/tachiyomi-extensions -env: - global: - - secure: "VvCw9E2eOPoExCKjs4jbGEUJ8hYS6Hw8YzJ4VPqtLa0YJSMKhdwNAcW2ldy47tJklTYKv6djehjh7oivTMFOR4m5jhG5MNrAbCprPtTeiK7KU3o8vCK8CyCYgRS/+LfmryNdXTB4N5B8VQzx26jl3+aJE8g5uJacSOYnv1bc+i89ZLAVW9Xwy4EGKZqQW/cZrDS6NDAPyU05Hell/PZMcHIqkNhcb4AJdGfjXJ3zOrv02F7PxYL8cAsapfUgaFME/2rNokuUTYAWN9lHx3VH51bxEM36lVlPKme0O9Op7hVE4GWvcjab7u54oOlOTFk1L4f2gYC75f1rsweRLwxpQ/XgZgwMAQHkGdYsp1jagVJkbXZE0p+jFN12KOQK/+9ahLuSJwxk4rCsIvR1XlIU2Taw0/v3OWM5u2A00WQkRHW7A3LfHGDFg2JgKCxPnBlzUFliFEubuU5WyWK/BllqZPpSUhinQrymVQEdSFM1eJEfJNVxN6lj4DmcWUmcMiRQIjol5tqopDbL/Htf3sRMacL+X9acPSuUQGnJdQWJ+6VIXmzyrjQl1IXCll4MHvAAnHkn/v4wFHjgKMESYlVtk6q8yiWVgoGkR1lq13TYnjXLTPqmFgBzFd/IqmNYn+33QwRi9s3Njuawm61eDspqmJ8OXxM+QStDW8DckRQCEts=" - - secure: "GkIGZB+A0N+NMhWlX1d9bLpz98qwHu6nWO525MzdQ5y+tC+OtuEJURxzd9kvy0Q3Q0jrEU50Y8vB7xTgP1YptVZpdhNjVp3WgYloQNkRO/xUQWxDBE2wArJ+mKHYmbgqCYdQ8szsjUw/JIBzlpMU7wniU9oDWZx8r1NirdtRzP7osV3jVa6zg9uXHZMc65mOR7mf8LJWT9FBSqwOVvFYrgIS/XIQ32T55NgAt19Bmndf+0JLE5ZdQ/6ZRGuzyfAlOpXSxaQxKVDHcs7FJhLMH9liTj1trSLj3tETyAsnwjiJV7PNuv43mRJKIc0oBCBqRu7TtJVo8BNGyoiCP49FvNLq03nPIPIPWULa8wZVg4FruWvEY5iERqodaIwDPS7mawbXloc2+htDlAzLGKfd0IOiAsTrQqE5F6g90XCW8DmyJLMrLixsXGWmUf/qsFGJJTEmpNsy5p15Pm7BypvoFJ/QB6quEe5or2J6J7NzqLxe1AGplHjkIStApVNm6tRHsxBDOCPo1oCPQTc5H77Fh6odWOf0A/6wC7+HYKJptycmpL8qUzwLSZbOC05WCMrEQQKYNJYWkZgEt0G+8jpaeri66146LRjYuFeKtj/IRlHNY31pL9tZCkgV9wVFLd2s0Z+YfaTW3+Nxls8z4llUaGdgQjjNqNr8P6PKoEQ+9bI=" - - secure: "iZlQiZiOt5YKOJR6I5aRkhF09G/SFd712CnHHbVu6070MIAQ4WGyqMw4DuiqbgCW2153ol1nQhtb9PIDSyys3g+N0/OEXwxoE0frvf48AlUd7I2l/6f8rVwrCJ55ZtWVhKTR+fz+Kqxj1SOwcBshapUCB4V7CdPg0i+XjHrSf3MKIGFyOLyl38hQHhrNqWttc9b6g1728HPu1XB2w0sqYJ3IfV8VGjURZkjAYoA3p5dklcUUa6bdIT9bhQp854ROUWrAn/oudkOe0JvDJhYnF31qmoTkYePdvnycC7/yKH6sXf89F5HKUB6NwvDWWwVySHV3Eu4C/KppAZtRVGwJ1liX/AH9c5zfYYuUpGRIwk6R/xUffk8DJFdKvI3mK0mEzuESBwH9Y1FI2VvcifVL0ELPGJO6zXl8A/dP5v8Wtwa0Ipv/bpqZwE7unZU1PxF0f4xd4QmCfjZ98oi1TLV5uY+z+2kuWaXcKF1ETNof9oYgkUKg++ezYLhyLp1NxFtEpgAFgWSTHG838PfvCX0768Ept0XifICz+SjD5jnSZ7Vi9D77czSmKGQO2tnT3+tqf3A2ldZjzEY9oLnYbxpEwBC6PYzthn0rox5KmE3ffIQnt299Em9yxbXH3jqOQo2pFvthuiEzZ9G+dZ6bNRqfT25T7HwzqtDlNLypEvi8/UA=" - - secure: "XiY+CQZqCSfo4DMUWuA+7YAuDSZxphTODAhENwsTV/jPKm/CV4i4bw3mdS7EtMLVyixFuvV1RdNd96MEF+kjpFG1qN3xO8+6VP6GVz7ycBP73NVGwseLvCaSG+xiW/iiwpINRCMdLS+9YGcj9rGKvPYkLrLQMox9zFoHFEXvRxGCe72sOgRaqf5AQICn4KTyaDBFsCrVtWI9obPNGDel4Y7ZpSRiz5JPxPQVBFC4FX5CdH5MuHQVHuiAHcwKIzzienwhAAkzK0pPINTpNdQB6Qa1R8B8/vNE12iHPMCGF5eQFWe5yy07lOwrt5Np3gVbg8cLocv9L+dUKuG+qXnLS8UlEtiFj01MImG/1qS+TNY323S1sPD/zmQrKCRj77qtxwC2mmZ3PONpkqEwx/wlyk4up93F9jDZWrHPDxw7kbvIP5AiNPR5ZQG7U++ClcFzAxhKNMGFaJV2W3XKFjOwZbMy7bwIKOHXxQQrQsb8kdFnZ1G4Y+WersYolf4/1PItHmhCM1KaXL8qu5JuwQCiOUsRrip+a3AB3T2+yfYY3m0xH73X4SoMUWWAgBJqTSghgCxtxTqMaeI1psMq2k1IWq42wPYlDlEqRNoyR1q4Hh3CW4Q6Sz3k5lktLoUUsQREJ5/5d/mNOr76gOUDO4C+QJKYBLojZnfHiY66RjHIqjs=" diff --git a/.travis/build.sh b/.travis/build.sh deleted file mode 100755 index 54eed1a07..000000000 --- a/.travis/build.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -set -e - -./gradlew --no-daemon clean assembleRelease -x lintKotlinMain - -TOOLS="$(ls -d ${ANDROID_HOME}/build-tools/* | tail -1)" - -shopt -s globstar nullglob extglob -APKS=( **/*"-unsigned.apk"* ) - -DEST=$PWD/apk - -rm -rf $DEST && mkdir -p $DEST - -for APK in ${APKS[@]}; do - BASENAME=$(basename $APK) - APKNAME="${BASENAME%%+(-release*)}.apk" - APKDEST="$DEST/$APKNAME" - - ${TOOLS}/zipalign -c -v -p 4 $APK - cp $APK $APKDEST - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then - ${TOOLS}/apksigner sign --ks $STORE_PATH --ks-key-alias $STORE_ALIAS --ks-pass env:STORE_PASS --key-pass env:KEY_PASS $APKDEST - fi -done diff --git a/.travis/secrets.tar.enc b/.travis/secrets.tar.enc deleted file mode 100644 index 5af16e093..000000000 Binary files a/.travis/secrets.tar.enc and /dev/null differ diff --git a/README.md b/README.md index 3f680e97a..2f1d2439d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -[![Travis](https://img.shields.io/travis/inorichi/tachiyomi-extensions.svg)](https://travis-ci.org/inorichi/tachiyomi-extensions) -[![fdroid dev](https://img.shields.io/badge/stable-wiki-blue.svg)](https://github.com/inorichi/tachiyomi/wiki/FDroid-for-dev-versions) +![CI](https://github.com/inorichi/tachiyomi-extensions/workflows/CI/badge.svg?event=push) This repository contains the available extension catalogues for the [Tachiyomi](https://github.com/inorichi/tachiyomi) app.