From aec6c34b6634e5099d30b917f73e84c6b8d735bc Mon Sep 17 00:00:00 2001 From: Justin COLLON <48163201+error7404@users.noreply.github.com> Date: Thu, 30 May 2024 19:00:07 +0200 Subject: [PATCH] Update: Version utils & Github actions (#1072) * github action: - custom apk: - packet name with git commit id - app name with git commit id - cached `npm install` - update actions versions * About page: - Version based on package.json - added git hash to the version if not Stable - RELEASE_DATE, GIT_HASH, BUILD_TYPE created at build time from setEnvFile.cjs - special BUILD_TYPE for github actions - Version modal copy on click - removed versionUtils * expo-clipboard instead of react-native clipboard * buildRelease Release instead of Debug ^^' Gihtub Actions => Github Action --- .github/workflows/build.yml | 62 +++++++++++++++++++++--- android/app/build.gradle | 2 +- android/app/src/main/AndroidManifest.xml | 2 +- env.d.ts | 3 ++ package-lock.json | 10 ++++ package.json | 5 +- scripts/setEnvFile.cjs | 23 +++++++++ src/hooks/common/githubUpdateChecker.ts | 4 +- src/screens/more/About.tsx | 25 ++++++++-- src/services/backup/utils.ts | 4 +- src/utils/versionUtils.ts | 2 - 11 files changed, 122 insertions(+), 20 deletions(-) create mode 100644 scripts/setEnvFile.cjs delete mode 100644 src/utils/versionUtils.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef87730a3..f1c86eb5a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,49 +9,97 @@ jobs: runs-on: ubuntu-latest steps: - name: Clone Repository (Latest) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' + + - name: Cache npm & node modules + uses: actions/cache@v4 + with: + path: | + ~/.npm + node_modules + key: ${{ runner.os }}-cache-npm-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-cache-npm- + - name: Install Dependencies run: | npm install + - name: Create .env run: | cat > .env << EOF MYANIMELIST_CLIENT_ID=${{ vars.MYANIMELIST_CLIENT_ID }} ANILIST_CLIENT_ID=${{ vars.ANILIST_CLIENT_ID }} + GIT_HASH=$(git rev-parse --short HEAD) + RELEASE_DATE=$(date --utc +'%d/%m/%y %I:%M %p %Z') + BUILD_TYPE=Github Action EOF + - name: Cache Gradle Wrapper - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.gradle/wrapper key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties') }} - name: Cache Gradle Dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-caches-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle-caches- + - name: Cache build intermediates + uses: actions/cache@v4 + with: + path: | + android/app/build/generated + android/app/build/intermediates + android/app/build/tmp + android/.gradle + key: ${{ runner.os }}-build-${{ hashFiles('package-lock.json') }} + - name: Make Gradlew Executable run: cd android && chmod +x ./gradlew - name: Build Android Release run: | cd android && ./gradlew assembleRelease --no-daemon + mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/LNReader.apk - name: Set Env run: | set -x echo "COMMIT_COUNT=$(git rev-list --count HEAD)" >> $GITHUB_ENV + echo "COMMIT_ID=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - name: Upload Artifact - uses: actions/upload-artifact@v1 + env: + COMMIT_COUNT: ${{ env.COMMIT_COUNT }} + uses: actions/upload-artifact@v4 with: name: LNReader-r${{ env.COMMIT_COUNT }} - path: android/app/build/outputs/apk/release/app-release.apk + path: android/app/build/outputs/apk/release/LNReader.apk + + - name: Build Custom APK + env: + COMMIT_COUNT: ${{ env.COMMIT_COUNT }} + COMMIT_ID: ${{ env.COMMIT_ID }} + run: | + sed -i 's/LNReader/LNReader-r${{ env.COMMIT_COUNT }}(${{ env.COMMIT_ID }})/g' android/app/src/main/res/values/strings.xml + cd android && ./gradlew assembleRelease --no-daemon -PcustomAppId=com.rajarsheechatterjee.LNReader.commit_${{ env.COMMIT_ID }} + mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/LNReader-r${{ env.COMMIT_COUNT }}\(${{ env.COMMIT_ID }}\)-customID.apk + + - name: Upload Custom APK + env: + COMMIT_COUNT: ${{ env.COMMIT_COUNT }} + COMMIT_ID: ${{ env.COMMIT_ID }} + uses: actions/upload-artifact@v4 + with: + name: LNReader-r${{ env.COMMIT_COUNT }}(${{ env.COMMIT_ID }})-customID + path: android/app/build/outputs/apk/release/LNReader-r${{ env.COMMIT_COUNT }}(${{ env.COMMIT_ID }})-customID.apk diff --git a/android/app/build.gradle b/android/app/build.gradle index cd6a171a8..a3607049f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -80,7 +80,7 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion namespace "com.rajarsheechatterjee.LNReader" defaultConfig { - applicationId 'com.rajarsheechatterjee.LNReader' + applicationId project.hasProperty('customAppId') ? project.getProperty('customAppId') : 'com.rajarsheechatterjee.LNReader' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion // Generated version code. Supports versions up to 1024.1024.2048 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 4d3b34e6a..a1bf218f8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - + diff --git a/env.d.ts b/env.d.ts index 437d23d13..992934aa7 100644 --- a/env.d.ts +++ b/env.d.ts @@ -1,4 +1,7 @@ declare module '@env' { export const MYANIMELIST_CLIENT_ID: string; export const ANILIST_CLIENT_ID: string; + export const GIT_HASH: string; + export const RELEASE_DATE: string; + export const BUILD_TYPE: 'Debug' | 'Release' | 'Beta' | 'Github Action'; } diff --git a/package-lock.json b/package-lock.json index 5cc3c760f..d512a0da7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "2.0.0", "dependencies": { "@gorhom/bottom-sheet": "^4.4.5", + "@react-native-community/clipboard": "^1.5.1", "@react-native-community/slider": "^4.4.2", "@react-native-cookies/cookies": "^6.2.1", "@react-native-google-signin/google-signin": "^11.0.0", @@ -6073,6 +6074,15 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/@react-native-community/clipboard": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz", + "integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==", + "peerDependencies": { + "react": ">=16.0", + "react-native": ">=0.57.0" + } + }, "node_modules/@react-native-community/slider": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/@react-native-community/slider/-/slider-4.5.0.tgz", diff --git a/package.json b/package.json index 2440215af..cd36f35c7 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,13 @@ "version": "2.0.0", "private": true, "scripts": { - "android": "react-native run-android --active-arch-only", + "android": "npm run prestart && react-native run-android --active-arch-only", "ios": "react-native run-ios", + "prestart": "node scripts/setEnvFile.cjs Debug", "start": "react-native start", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "prettier": "prettier --write \"./src/**/*.{js,jsx,ts,tsx}\"", - "buildRelease": "cd android && ./gradlew clean && ./gradlew assembleRelease", + "buildRelease": "node scripts/setEnvFile.cjs Release && cd android && ./gradlew clean && ./gradlew assembleRelease", "open": "open ./android/app/build/outputs/apk/release/", "strings": "node scripts/stringTypes.cjs", "prepare": "husky install" diff --git a/scripts/setEnvFile.cjs b/scripts/setEnvFile.cjs new file mode 100644 index 000000000..bf7213cae --- /dev/null +++ b/scripts/setEnvFile.cjs @@ -0,0 +1,23 @@ +const fs = require('fs'); +const os = require('os'); +const path = require('path'); +const { execSync } = require('child_process'); + +const formattedDate = new Date().getTime(); + +const commitHash = execSync('git rev-parse --short HEAD').toString().trim(); + +const buildType = process.argv[2] || 'Beta'; + +let data = + `BUILD_TYPE=${buildType}` + + os.EOL + + `GIT_HASH=${commitHash}` + + os.EOL + + `RELEASE_DATE=${formattedDate}`; + +fs.writeFile(path.join(__dirname, '..', '.env'), data, 'utf8', err => { + if (err) { + console.log(err); + } +}); diff --git a/src/hooks/common/githubUpdateChecker.ts b/src/hooks/common/githubUpdateChecker.ts index de48e953a..62ecbab8d 100644 --- a/src/hooks/common/githubUpdateChecker.ts +++ b/src/hooks/common/githubUpdateChecker.ts @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { appVersion } from '../../utils/versionUtils'; +import { version } from '../../../package.json'; import { newer } from '@utils/compareVersion'; interface GithubUpdate { @@ -29,7 +29,7 @@ export const useGithubUpdateChecker = (): GithubUpdate => { }; const isNewVersion = (versionTag: string) => { - let currentVersion = `${appVersion}`; + let currentVersion = `${version}`; const regex = /[^\\d.]/; let newVersion = versionTag.replace(regex, ''); diff --git a/src/screens/more/About.tsx b/src/screens/more/About.tsx index 00a78ed6e..52b53d235 100644 --- a/src/screens/more/About.tsx +++ b/src/screens/more/About.tsx @@ -6,14 +6,30 @@ import * as Linking from 'expo-linking'; import { getString } from '@strings/translations'; import { ScreenContainer } from '@components/Common'; import { MoreHeader } from './components/MoreHeader'; -import { appVersion, releaseDate } from '@utils/versionUtils'; import { useTheme } from '@hooks/persisted'; import { List } from '@components'; import { AboutScreenProps } from '@navigators/types'; +import { GIT_HASH, RELEASE_DATE, BUILD_TYPE } from '@env'; +import * as Clipboard from 'expo-clipboard'; +import { version } from '../../../package.json'; const AboutScreen = ({ navigation }: AboutScreenProps) => { const theme = useTheme(); + function getBuildName() { + if (!GIT_HASH || !RELEASE_DATE || !BUILD_TYPE) { + return `Custom build ${version}`; + } else { + const localDateTime = isNaN(Number(RELEASE_DATE)) + ? RELEASE_DATE + : new Date(Number(RELEASE_DATE)).toLocaleString(); + if (BUILD_TYPE === 'Release') { + return `${BUILD_TYPE} ${version} (${localDateTime})`; + } + return `${BUILD_TYPE} ${version} (${localDateTime}) Commit: ${GIT_HASH}`; + } + } + return ( { { + Clipboard.setStringAsync(getBuildName()); + }} /> Linking.openURL( - `https://github.com/LNReader/lnreader/releases/tag/v${appVersion}`, + `https://github.com/LNReader/lnreader/releases/tag/v${version}`, ) } theme={theme} diff --git a/src/services/backup/utils.ts b/src/services/backup/utils.ts index 284fd35a6..149b97a1e 100644 --- a/src/services/backup/utils.ts +++ b/src/services/backup/utils.ts @@ -4,7 +4,7 @@ import { TRACKER } from '@hooks/persisted/useTracker'; import { LAST_UPDATE_TIME } from '@hooks/persisted/useUpdates'; import { BACKGROUND_ACTION } from '@services/constants'; import { MMKVStorage } from '@utils/mmkv/mmkv'; -import { appVersion } from '@utils/versionUtils'; +import { version } from '../../../package.json'; import { _restoreNovelAndChapters, getAllNovels, @@ -64,7 +64,7 @@ export const prepareBackupData = async (cacheDirPath: string) => { // version await TextFile.writeFile( cacheDirPath + '/' + BackupEntryName.VERSION, - JSON.stringify({ version: appVersion }), + JSON.stringify({ version: version }), ); // novels diff --git a/src/utils/versionUtils.ts b/src/utils/versionUtils.ts deleted file mode 100644 index 7a5c5eeff..000000000 --- a/src/utils/versionUtils.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const appVersion = '2.0.0'; -export const releaseDate = '01/02/24 09:00 AM';