diff --git a/scripts/env-global.sh b/scripts/env-global.sh index 3365d8015162d72f466530c6644bc35dc006a92f..9064c6b27e11c257f57593e460c589ef906a3f7d 100755 --- a/scripts/env-global.sh +++ b/scripts/env-global.sh @@ -25,16 +25,18 @@ NODEJS_VERSION=16 IONIC_CLI_VERSION=6.20.9 ANDROID_NDK_VERSION=21.0.6113669 # Should be compatible with 'cordova-sqlite-storage' plugin -ANDROID_SDK_VERSION=30.0.3 +ANDROID_SDK_VERSION=32.0.0 ANDROID_SDK_CLI_VERSION=8512546 # See https://developer.android.com/studio#command-tools -#ANDROID_HOME="${HOME}/Android" ANDROID_SDK_ROOT="${HOME}/Android/Sdk" ANDROID_ALTERNATIVE_SDK_ROOT=/usr/lib/android-sdk ANDROID_SDK_CLI_ROOT=${ANDROID_SDK_ROOT}/cmdline-tools/${ANDROID_SDK_CLI_VERSION} +ANDROID_BUILD_TOOLS_ROOT="${ANDROID_SDK_ROOT}/build-tools/${ANDROID_SDK_VERSION}" ANDROID_OUTPUT_APK_PREFIX=app ANDROID_OUTPUT_APK=${PROJECT_DIR}/platforms/android/${ANDROID_OUTPUT_APK_PREFIX}/build/outputs/apk ANDROID_OUTPUT_APK_DEBUG=${ANDROID_OUTPUT_APK}/debug ANDROID_OUTPUT_APK_RELEASE=${ANDROID_OUTPUT_APK}/release +ANDROID_OUTPUT_MIN_SDK_VERSION=22 # Used by release-android-sign.sh +ANDROID_OUTPUT_MAX_SDK_VERSION=34 # Used by release-android-sign.sh DIST_WEB=${PROJECT_DIR}/dist/web/build DIST_ANDROID=${PROJECT_DIR}/dist/android @@ -73,7 +75,7 @@ if test -d "${JAVA_HOME}"; then else JAVA_MAJOR_VERSION=$(echo ${JAVA_VERSION} | awk '{split($0, array, ".")} END{print array[1]}') JAVA_MINOR_VERSION=$(echo ${JAVA_VERSION} | awk '{split($0, array, ".")} END{print array[2]}') - if ! test "${JAVA_MAJOR_VERSION}" == "11" || ! test "${JAVA_MINOR_VERSION}" == "0"; then + if ! test "${JAVA_MAJOR_VERSION}" -eq "11" || ! test "${JAVA_MINOR_VERSION}" -eq "0"; then echo "ERROR: Require a Java SDK in version 11, but found ${JAVA_VERSION}. You can override your default JAVA_HOME in '.local/env.sh'." fi fi @@ -118,14 +120,20 @@ else echo "nvm (Node version manager) not found (directory ${NVM_DIR} not found). Please install, and retry" fi +# Checking if some global dependencies are missing +GLOBAL_TOOLS="yarn ionic cordova cordova-res native-run web-ext" +MISSING_GLOBAL_TOOLS= +for GLOBAL_TOOL in ${GLOBAL_TOOLS} +do + GLOBAL_TOOL_PATH=$(which ${GLOBAL_TOOL}) + if test -z "${GLOBAL_TOOL_PATH}"; then + echo "- Missing global dependency: ${GLOBAL_TOOL}" + MISSING_GLOBAL_TOOLS="${GLOBAL_TOOL} ${MISSING_GLOBAL_TOOLS}" + fi +done + # Install global dependencies -YARN_PATH=`which yarn` -IONIC_PATH=`which ionic` -CORDOVA_PATH=`which cordova` -CORDOVA_RES_PATH=`which cordova-res` -NATIVE_RUN_PATH=`which native-run` -WEB_EXT_PATH=`which web-ext` -if test -z "${YARN_PATH}" || test -z "${IONIC_PATH}" || test -z "${CORDOVA_PATH}" || test -z "${CORDOVA_RES_PATH}" || test -z "${NATIVE_RUN_PATH}" || test -z "${WEB_EXT_PATH}"; then +if ! test -z "${MISSING_GLOBAL_TOOLS}"; then echo "Installing global dependencies..." npm install -g yarn cordova cordova-res @ionic/cli@$IONIC_CLI_VERSION web-ext native-run if ! test $? == 0; then @@ -139,15 +147,15 @@ fi # Install project dependencies if ! test -d "${PROJECT_DIR}/node_modules"; then - echo "Installing project dependencies..." - cd "${PROJECT_DIR}" + echo "--- Installing project dependencies..." + cd ${PROJECT_DIR} yarn install fi # Install platform Android if ! test -d "${PROJECT_DIR}/platforms/android"; then - echo "Installing platform Android..." - cd "${PROJECT_DIR}" + echo "-- Installing platform Android..." + cd ${PROJECT_DIR} ionic cordova platform add android if ! test $? == 0; then echo "ERROR: Unable to install Android platform. Will not be able to build Android artifacts!" @@ -156,9 +164,9 @@ if ! test -d "${PROJECT_DIR}/platforms/android"; then fi if ! test -d "${PROJECT_DIR}/dist/desktop"; then - #echo "Installing project submodules..." - #cd "${PROJECT_DIR}" - #git submodule init && git submodule sync && git submodule update --remote --merge + echo "-- Checkout submodules (dist/desktop) ..." + cd "${PROJECT_DIR}" + git submodule init && git submodule sync && git submodule update --remote --merge if ! test $? == 0; then echo "ERROR: Unable to sync git submodule. Will not be able to build desktop artifacts!" #exit 1 diff --git a/scripts/release-android-sign.sh b/scripts/release-android-sign.sh index 06c37ee971965128424fbe2ccf88a7365a8bd1e4..41be37a31a4644ba741c6566c00aa050e86fb86c 100755 --- a/scripts/release-android-sign.sh +++ b/scripts/release-android-sign.sh @@ -13,48 +13,64 @@ KEY_ALIAS=Cesium KEYSTORE_PWD= # Preparing Android environment -source ${PROJECT_DIR}/scripts/env-android.sh +. ${PROJECT_DIR}/scripts/env-android.sh [[ $? -ne 0 ]] && exit 1 -APK_UNSIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/app-release-unsigned.apk -APK_SIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/app-release.apk - +APK_SIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-signed.apk +APK_UNSIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-unsigned.apk +APK_FILE_ALTERNATIVE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release.apk cd ${PROJECT_DIR} -# Sign files -echo "Signing APK file..." -if [[ ! -f "${APK_UNSIGNED_FILE}" ]]; then - echo "APK file not found: ${APK_UNSIGNED_FILE}" - exit 1 -fi +# Checking files +echo "Checking keystore file..." if [[ ! -f "${KEYSTORE_FILE}" ]]; then echo "Keystore file not found: ${KEYSTORE_FILE}" exit 1 fi -# Remove previous version +echo "Checking APK file..." +if [[ ! -f "${APK_UNSIGNED_FILE}" ]]; then + # Check in an alternative path (e.g. Android default signed file) + if [[ ! -f "${APK_FILE_ALTERNATIVE}" ]]; then + echo "APK file not found: ${APK_UNSIGNED_FILE}" + exit 1 + fi + APK_UNSIGNED_FILE=${APK_FILE_ALTERNATIVE} +fi + +# Remove previous version (only if unsigned exists) if [[ -f "${APK_SIGNED_FILE}" ]]; then echo "Delete previous signed APK file: ${APK_SIGNED_FILE}" - rm -f ${APK_SIGNED_FILE} + rm -f ${APK_SIGNED_FILE}* fi -echo "Executing jarsigner..." -jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ${KEYSTORE_FILE} ${APK_UNSIGNED_FILE} Cesium -[[ $? -ne 0 ]] && exit 1 -echo "Executing jarsigner [OK]" +#echo "Executing jarsigner..." +#jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -storepass ${KEYSTORE_PWD} -keystore ${KEYSTORE_FILE} ${APK_UNSIGNED_FILE} ${KEY_ALIAS} +#[[ $? -ne 0 ]] && exit 1 +#echo "Executing jarsigner [OK]" -BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT}/build-tools/${ANDROID_SDK_VERSION}/" -cd ${BUILD_TOOLS_DIR} +cd ${ANDROID_BUILD_TOOLS_ROOT} +[[ $? -ne 0 ]] && exit 1 echo "Executing zipalign..." ./zipalign -v 4 ${APK_UNSIGNED_FILE} ${APK_SIGNED_FILE} [[ $? -ne 0 ]] && exit 1 echo "Executing zipalign [OK]" +echo "Executing apksigner..." +./apksigner sign --ks ${KEYSTORE_FILE} --ks-pass "pass:${KEYSTORE_PWD}" --ks-key-alias ${KEY_ALIAS} \ + --min-sdk-version ${ANDROID_OUTPUT_MIN_SDK_VERSION} \ + --max-sdk-version ${ANDROID_OUTPUT_MAX_SDK_VERSION} \ + ${APK_SIGNED_FILE} + +[[ $? -ne 0 ]] && exit 1 +echo "Executing apksigner [OK]" + echo "Verify APK signature..." -./apksigner verify ${APK_SIGNED_FILE} +./apksigner verify --verbose --print-certs ${APK_SIGNED_FILE} [[ $? -ne 0 ]] && exit 1 echo "Verify APK signature [OK]" echo "Successfully generated signed APK at: ${APK_SIGNED_FILE}" +exit 0 diff --git a/scripts/release-android.sh b/scripts/release-android.sh index 54e72d272afc9b9a05b1fac55f45b3b0c77eaa88..d6ae2c9ca1402c6344383a0b296dda674a2fd68c 100755 --- a/scripts/release-android.sh +++ b/scripts/release-android.sh @@ -16,21 +16,28 @@ KEY_PWD= source ${PROJECT_DIR}/scripts/env-android.sh [[ $? -ne 0 ]] && exit 1 -APK_UNSIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/app-release-unsigned.apk +APK_SIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-signed.apk +APK_UNSIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-unsigned.apk -cd ${PROJECT_DIR} +echo "--- Cleaning previous Android APK ..." +if [[ -f "${APK_SIGNED_FILE}" ]]; then + rm -f ${APK_SIGNED_FILE}* +fi; +if [[ -f "${APK_UNSIGNED_FILE}" ]]; then + rm -f ${APK_UNSIGNED_FILE} +fi; +echo "--- Cleaning previous Android APK [OK]" +echo "" # Run the build -echo "Running cordova build..." -ionic cordova build android --warning-mode=none --color --prod --release +echo "--- Building Cordova App..." +echo "" +yarn run build:android [[ $? -ne 0 ]] && exit 1 - -if [[ ! -f "${APK_UNSIGNED_FILE}" ]]; then - echo "APK file not found at: ${APK_UNSIGNED_FILE}" - exit 1 -fi +echo "--- Building Cordova App [OK]" # Sign APK file -. ./script/release-android-sign.sh +cd ${PROJECT_DIR}/scripts +./release-android-sign.sh [[ $? -ne 0 ]] && exit 1 diff --git a/scripts/release-to-github.sh b/scripts/release-to-github.sh index 16fa1d61f9f4adcee4468bd98fb6a68de0e9d439..ad137cf51d9cf26054419c236f48d073963484f8 100755 --- a/scripts/release-to-github.sh +++ b/scripts/release-to-github.sh @@ -20,21 +20,26 @@ then fi ### Get version to release -current=$(grep -P "version\": \"\d+.\d+.\d+(-?\w*)" package.json | grep -m 1 -oP "\d+.\d+.\d+(-?\w*)") +current=$(grep -m1 -P "version\": \"\d+.\d+.\d+(-\w+[0-9]+)?" package.json | grep -oP "\d+.\d+.\d+(-\w+[0-9]+)?") if [[ "_$current" == "_" ]]; then - echo "Unable to read the current version in 'package.json'. Please check version format is: x.y.z (x and y should be an integer)." - exit 1; + echo " - Make sure the file 'package.json' exists and is readable." + echo " - Check version format is: x.y.z (x and y should be an integer)" + exit 1 fi echo "Sending v$current extension to Github..." ### get auth token -GITHUB_TOKEN=$(cat ~/.config/${PROJECT_NAME}/.github) -if [[ "_$GITHUB_TOKEN" != "_" ]]; then - GITHUT_AUTH="Authorization: token $GITHUB_TOKEN" +if [[ "_${GITHUB_TOKEN}" == "_" ]]; then + # Get it from user config dir + GITHUB_TOKEN=$(cat ~/.config/${PROJECT_NAME}/.github) +fi +if [[ "_${GITHUB_TOKEN}" != "_" ]]; then + GITHUT_AUTH="Authorization: token ${GITHUB_TOKEN}" else echo "ERROR: Unable to find github authentication token file: " echo " - You can create such a token at https://github.com/settings/tokens > 'Generate a new token'." - echo " - Then copy the token and paste it in the file '~/.config/${PROJECT_NAME}/.github' using a valid token." + echo " - [if CI] Add a pipeline variable named 'GITHUB_TOKEN';" + echo " - [else] Or copy/paste the token into the file '~/.config/${PROJECT_NAME}/.github'." exit 1 fi @@ -90,9 +95,10 @@ else echo "Release not exists yet on github." fi -### Create the release -result=$(curl -H ''"$GITHUT_AUTH"'' -s $REPO_API_URL/releases -d '{"tag_name": "v'"$current"'","target_commitish": "master","name": "'"$current"'","body": "'"$description"'","draft": false,"prerelease": '"$prerelease"'}') -#echo "DEBUG - $result" +echo "Creating new release..." +echo " - tag: v$current" +echo " - description: $description" +result=$(curl -X POST -H ''"$GITHUT_AUTH"'' -s $REPO_API_URL/releases -d '{"tag_name": "v'"$current"'","target_commitish": "master","name": "'"$current"'","body": "'"$description"'","draft": false,"prerelease": '"$prerelease"'}') upload_url=$(echo "$result" | grep -P "\"upload_url\": \"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") if [[ "_$upload_url" = "_" ]]; then echo "Failed to create new release for repo $REPO." @@ -101,8 +107,8 @@ if [[ "_$upload_url" = "_" ]]; then exit 1 fi -### Send files -echo "Uploading artifacts to ${upload_url} ..." +### Sending files +echo "Uploading files to ${upload_url} ..." # Upload web file WEB_BASENAME="${PROJECT_NAME}-v$current-web.zip" @@ -111,9 +117,12 @@ if [[ -f "${WEB_FILE}" ]]; then result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: application/zip' -T "${WEB_FILE}" "${upload_url}?name=${WEB_BASENAME}") browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") WEB_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_BASENAME}") - echo " - ${browser_download_url} | Checksum: ${WEB_SHA256}" + echo " - ${browser_download_url} | SHA256 Checksum: ${WEB_SHA256}" + echo "${WEB_SHA256} ${WEB_BASENAME}" > "${WEB_FILE}.sha256" + result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${WEB_FILE}.sha256" "${upload_url}?name=${WEB_BASENAME}.sha256") else - echo " - ERROR: Web artifact (ZIP) not found! Skipping." + echo " - ERROR: Web release (ZIP) not found! Skipping." + missing_file=true fi # Upload web extension (ZIP) file @@ -124,8 +133,11 @@ if [[ -f "${WEB_EXT_ZIP_FILE}" ]]; then browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") WEB_EXT_ZIP_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_EXT_ZIP_BASENAME}") echo " - ${browser_download_url} | Checksum: ${WEB_EXT_ZIP_SHA256}" + echo "${WEB_EXT_ZIP_SHA256} ${WEB_EXT_ZIP_BASENAME}" > "${WEB_EXT_ZIP_FILE}.sha256" + result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${WEB_EXT_ZIP_FILE}.sha256" "${upload_url}?name=${WEB_EXT_ZIP_BASENAME}.sha256") else echo " - ERROR: Web extension artifact (ZIP) not found! Skipping." + missing_file=true fi # Upload web extension (XPI) file @@ -136,8 +148,11 @@ if [[ -f "${WEB_EXT_XPI_FILE}" ]]; then browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") WEB_EXT_XPI_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_EXT_XPI_BASENAME}") echo " - ${browser_download_url} | Checksum: ${WEB_EXT_XPI_SHA256}" + echo "${WEB_EXT_XPI_SHA256} ${WEB_EXT_XPI_BASENAME}" > "${WEB_EXT_XPI_BASENAME}.sha256" + result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${WEB_EXT_XPI_FILE}.sha256" "${upload_url}?name=${WEB_EXT_XPI_BASENAME}.sha256") else echo " - ERROR: Web signed extension artifact (XPI) not found! Skipping." + missing_file=true fi # Upload Android APK file @@ -147,19 +162,22 @@ if [[ -f "${APK_FILE}" ]]; then result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: application/vnd.android.package-archive' -T "${APK_FILE}" "${upload_url}?name=${APK_BASENAME}") browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") APK_SHA256=$(cd ${DIST_ANDROID} && sha256sum "${APK_BASENAME}") - echo " - ${browser_download_url} | Checksum: ${APK_SHA256}" + echo " - ${browser_download_url} | SHA256 Checksum: ${APK_SHA256}" + echo "${APK_SHA256} ${APK_BASENAME}" > "${APK_FILE}.sha256" + result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${APK_FILE}.sha256" "${upload_url}?name=${APK_BASENAME}.sha256") else - echo "- ERROR: Android artifact (APK) not found! Skipping." + echo "- ERROR: Android release (APK) not found! Skipping." + missing_file=true fi -# Upload sha256 file (checksum) -SHA_BASENAME=${PROJECT_NAME}-v$current.sha256 -SHA_FILE=${PROJECT_DIR}/dist/${SHA_BASENAME} -echo "${WEB_SHA256}" > ${SHA_FILE} -echo "${WEB_EXT_ZIP_SHA256}" >> ${SHA_FILE} -echo "${APK_SHA256}" >> ${SHA_FILE} -echo "${WEB_EXT_XPI_SHA256}" >> ${SHA_FILE} -result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${SHA_FILE}" "${upload_url}?name=${SHA_BASENAME}") - -### Success message -echo "Successfully uploaded files to: ${REPO_PUBLIC_URL}/releases/tag/v${current}" +if [[ ${missing_file} == true ]]; then + echo "-------------------------------------------" + echo "ERROR: missing some artifacts (see logs)" + echo " -> Release url: ${REPO_PUBLIC_URL}/releases/tag/${version}" + exit 1 +else + echo "-------------------------------------------" + echo "Successfully uploading files !" + echo " -> Release url: ${REPO_PUBLIC_URL}/releases/tag/${version}" + exit 0 +fi diff --git a/scripts/release.sh b/scripts/release.sh index 4244ae6defbde8e19685713504697526b1951b7e..05d96adf3f947f9759307f075df6fbbce1f2231e 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -92,33 +92,16 @@ rm -rf ${PROJECT_DIR}/dist/*.sha256 echo "----------------------------------" echo "- Building Android artifact..." echo "----------------------------------" -mkdir -p ${DIST_ANDROID} || exit 1 -rm -rf ${DIST_ANDROID}/*.apk || exit 1 -rm -rf ${ANDROID_OUTPUT_APK_RELEASE}/*.apk || exit 1 -. scripts/build-android.sh --release +cd ${PROJECT_DIR} || exit 1 +. scripts/release-android.sh [[ $? -ne 0 ]] && exit 1 -APK_RELEASE_FILE="${ANDROID_OUTPUT_APK_RELEASE}/app-release.apk" -APK_RELEASE_UNSIGNED_FILE="${ANDROID_OUTPUT_APK_RELEASE}/app-release-unsigned.apk" -if [[ ! -f "${APK_RELEASE_FILE}" ]]; then - if [[ ! -f "${APK_RELEASE_UNSIGNED_FILE}" ]]; then - echo "ERROR: Missing android artifact at ${APK_RELEASE_FILE}" - exit 1 - else - . scripts/release-android-sign.sh - [[ $? -ne 0 ]] && exit 1 - fi -fi -mkdir -p ${DIST_ANDROID} || exit 1 -cp ${APK_RELEASE_FILE} "${DIST_ANDROID}/${PROJECT_NAME}-v$2-android.apk" || exit 1 - - echo "----------------------------------" echo "- Building web and extension artifacts..." echo "----------------------------------" -cd ${PROJECT_DIR} || exit 1 -# Gnerate config (only once, to keep same config if web and web-extension artifacts) +# Generate config (only once, to keep same config if web and web-extension artifacts) +cd ${PROJECT_DIR} || exit 1 gulp config --env default # Run web build