# This is a basic workflow to help you get started with Actions name: Build and deploy # Controls when the action will run. on: # Triggers the workflow on push or pull request events but only for the master branch push: tags: - '*' # This doesn't mean that it HAS to have a tag, only that the workflow triggers when we push a tag branches: [ master ] pull_request: branches: [ master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" build: # On push events only, if it's a "Update X" commit, it's probably something done through the UI - # so an .md or yaml change, and not something we need to rebuild over # We can't simply put !startsWith - see https://github.community/t/expression-syntax-for-not-startswith/17040 if: github.event_name != 'push' || startsWith(github.event.commits[0].message, 'Update ') != true runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - uses: actions/setup-java@v3 with: distribution: 'temurin' java-version: '11' - name: Setup Gradle uses: gradle/gradle-build-action@v2.3.3 - name: Compile kotlin and build classes run: ./gradlew classes - name: Run code checks run: ./gradlew check - name: Run unit tests run: ./gradlew --no-build-cache cleanTest test tests:test # RELEASE - name: Get release tag # We can then get the tag using ${{steps.tag.outputs.tag}} as below if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') id: tag uses: dawidd6/action-get-tag@v1 - name: Read release.md and use it as a body of new release. This will fail for patch releases, since they have no readme. continue-on-error: true if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') id: read_release shell: bash run: | ## To test this in Windows PS: cat .\changelog.md | wsl grep -Pzo --color '\\#{2}.3.15.7[^\\#]*?\\#{2}' | wsl head -n -2 r=$(grep -Pzo '\#{2}.${{steps.tag.outputs.tag}}[^\#]*\#' changelog.md) # grep to get only our release r=$(echo "$r" | head -n -2 | tail -n +3) ## See https://trstringer.com/github-actions-multiline-strings/ echo "--- Set variable manually in github env ---" echo "RELEASE_BODY<> $GITHUB_ENV echo "$r" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV ## ANDROID - name: Prepare .aab (for Google Play) and .apk (for Github) files continue-on-error: true if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') shell: bash run: | mkdir whatsNewDirectory echo "${{ env.RELEASE_BODY }}" > whatsNewDirectory/whatsnew-en-US ./gradlew :android:bundleRelease ./gradlew :android:assembleRelease - name: Sign AAB for Google Play upload uses: r0adkll/sign-android-release@v1 if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') with: releaseDirectory: android/build/outputs/bundle/release signingKeyBase64: ${{ secrets.BUNDLE_SIGNING_KEY_BASE64 }} alias: ${{ secrets.BUNDLE_SIGNING_KEY_ALIAS }} keyStorePassword: ${{ secrets.BUNDLE_SIGNING_KEYSTORE_PASSWORD }} keyPassword: ${{ secrets.BUNDLE_SIGNING_KEY_PASSWORD }} - name: Upload AAB to google play if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') continue-on-error: true uses: r0adkll/upload-google-play@v1.0.15 with: serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }} packageName: com.unciv.app releaseFiles: android/build/outputs/bundle/release/Unciv-release.aab track: production userFraction: 0.1 whatsNewDirectory: whatsNewDirectory - name: Sign APK for Github upload uses: r0adkll/sign-android-release@v1 continue-on-error: true if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') with: releaseDirectory: android/build/outputs/apk/release signingKeyBase64: ${{ secrets.BUNDLE_SIGNING_KEY_BASE64 }} alias: ${{ secrets.BUNDLE_SIGNING_KEY_ALIAS }} keyStorePassword: ${{ secrets.BUNDLE_SIGNING_KEYSTORE_PASSWORD }} keyPassword: ${{ secrets.BUNDLE_SIGNING_KEY_PASSWORD }} - name: Move APK to deploy folder continue-on-error: true if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') shell: bash run: | mkdir deploy ls android/build/outputs/apk/release mv android/build/outputs/apk/release/Unciv-release-unsigned-signed.apk deploy/Unciv-signed.apk ## DESKTOP - name: Upload to itch.io continue-on-error: true if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') env: BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }} run: | wget -q -O butler.zip https://broth.itch.ovh/butler/linux-amd64/LATEST/archive/default unzip butler.zip chmod +x butler wget -q -O packr-all-4.0.0.jar https://github.com/libgdx/packr/releases/download/4.0.0/packr-all-4.0.0.jar wget -q -O jre-linux-64.tar.gz https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_x64_linux_hotspot_11.0.11_9.tar.gz ./gradlew desktop:packrLinux64 ./butler push deploy/Unciv-Linux64.zip yairm210/unciv:Linux64 --userversion ${{steps.tag.outputs.tag}} ./gradlew desktop:zipLinuxFilesForJar # MacOS bundles correctly but does not run as intended, see https://github.com/yairm210/Unciv/issues/4970 # Disabled until this can be checked by sommeone who actually has a Mac computer # wget -q -O jre-macOS.tar.gz https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.11%2B9/OpenJDK11U-jre_x64_mac_hotspot_11.0.11_9.tar.gz # ./gradlew desktop:packrMacOS # ./butler push deploy/Unciv-MacOS.zip yairm210/unciv:MacOS --userversion ${{steps.tag.outputs.tag}} wget -q -O jdk-windows-64.zip https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-1.8.0.232-1.b09/java-1.8.0-openjdk-1.8.0.232-1.b09.ojdkbuild.windows.x86_64.zip ./gradlew desktop:packrWindows64 ./butler push deploy/Unciv-Windows64.zip yairm210/unciv:Windows64 --userversion ${{steps.tag.outputs.tag}} mv desktop/build/libs/Unciv.jar deploy/Unciv.jar # Unzip zips for steam deployment mkdir steam unzip deploy/Unciv-Windows64.zip -d steam/Unciv-Windows64 unzip deploy/Unciv-Linux64.zip -d steam/Unciv-Linux64 - name: Steam deploy continue-on-error: true if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') uses: game-ci/steam-deploy@v1 with: username: ${{ secrets.STEAM_USERNAME }} password: ${{ secrets.STEAM_PASSWORD }} configVdf: ${{ secrets.STEAM_CONFIG_VDF}} ssfnFileName: ${{ secrets.STEAM_SSFN_FILE_NAME }} ssfnFileContents: ${{ secrets.STEAM_SSFN_FILE_CONTENTS }} appId: 2118950 buildDescription: ${{steps.tag.outputs.tag}} rootPath: steam depot1Path: Unciv-Windows64 depot2Path: Unciv-Linux64 releaseBranch: release ## Server - name: Build UncivServer.jar continue-on-error: true if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') run: | ./gradlew server:dist mv server/build/libs/UncivServer.jar deploy/UncivServer.jar ## Finalize - name: Upload binaries to Github release if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') continue-on-error: true uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: deploy/* tag: ${{ github.ref }} overwrite: true file_glob: true # <--- Use environment variables that was created earlier - see https://github.com/svenstaro/upload-release-action # Single-quotes do not solve the multiline problem. body: | ## ${{steps.tag.outputs.tag}} ${{ env.RELEASE_BODY }} - name: Get AUR PKGBUILD if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') continue-on-error: true run: | curl --silent --output PKGBUILD 'https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=unciv-bin' sed -E -e "s#(_pkgver=).*#\1${{steps.tag.outputs.tag}}#" -e "s#(pkgrel=).*#\10#" -i PKGBUILD - name: Publish AUR package if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') continue-on-error: true uses: Thyrum/github-actions-deploy-aur@master with: pkgname: unciv-bin pkgbuild: ./PKGBUILD commit_username: ${{ secrets.AUR_COMMIT_USERNAME }} commit_email: ${{ secrets.AUR_COMMIT_EMAIL }} ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }} commit_message: | Update to ${{steps.tag.outputs.tag}} ${{ env.RELEASE_BODY }} ssh_keyscan_types: rsa,dsa,ecdsa,ed25519 updpkgsums: true allow_empty_commits: false - name: Post announcement on Discord continue-on-error: true ## On patch releases, don't notify Discord if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') && env.RELEASE_BODY != '' env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} uses: Ilshidur/action-discord@0.3.2 with: args: | # See https://discordjs.guide/miscellaneous/parsing-mention-arguments.html#how-discord-mentions-work <@&663705024265715743> *${{steps.tag.outputs.tag}} rolling out!* ${{ env.RELEASE_BODY }}