diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a4e175ef..286c5c66 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -175,8 +175,6 @@ build-geckoview: - BUILD_VARIANT: ["arm64", "arm", "x86_64"] variables: RUNNER_SCRIPT_TIMEOUT: 1h 50m - IRONFOX_JOB_ARTIFACT_NAME: "build-geckoview-$BUILD_VARIANT" - IRONFOX_ARTIFACT_INCLUDES: "aar;logs" <<: *build_variables script: - set -euo pipefail @@ -186,7 +184,17 @@ build-geckoview: - echo "CI - Building GeckoView (${BUILD_VARIANT})..." - bash -x scripts/ci-build.sh "${BUILD_VARIANT}" 'geckoview' - echo "CI - Built GeckoView (${BUILD_VARIANT})." - <<: *compressed_artifact_output + - echo 'CI - Uploading artifact...' + - bash scripts/ci-upload-artifacts.sh geckoview "${BUILD_VARIANT}" + - echo 'CI - Uploaded artifact.' + artifacts: + untracked: false + when: always + when: always + access: all + expire_in: "30 days" + paths: + - $CI_PROJECT_DIR/artifacts/logs/**/* rules: - if: $CI_PROJECT_NAMESPACE != "ironfox-oss" when: never @@ -206,7 +214,7 @@ build-fenix: - job: "build-docker" optional: true - job: "build-geckoview" - artifacts: true + artifacts: false optional: false tags: - saas-linux-2xlarge-amd64 @@ -214,8 +222,6 @@ build-fenix: BUILD_VARIANT: "bundle" BUILD_VARIANT_PRETTY: "Bundle" RUNNER_SCRIPT_TIMEOUT: 2h 50m - IRONFOX_JOB_ARTIFACT_NAME: "build-fenix-$BUILD_VARIANT" - IRONFOX_ARTIFACT_INCLUDES: "apk;apks;logs" <<: *build_variables script: - set -euo pipefail @@ -226,8 +232,17 @@ build-fenix: - echo "CI - Building Fenix (${BUILD_VARIANT_PRETTY})..." - bash -x scripts/ci-build.sh "${BUILD_VARIANT}" 'fenix' - echo "CI - Built Fenix (${BUILD_VARIANT_PRETTY})." - - <<: *compressed_artifact_output + - echo 'CI - Uploading artifact...' + - bash scripts/ci-upload-artifacts.sh fenix "${BUILD_VARIANT}" + - echo 'CI - Uploaded artifact.' + artifacts: + untracked: false + when: always + when: always + access: all + expire_in: "30 days" + paths: + - $CI_PROJECT_DIR/artifacts/logs/**/* rules: - if: $CI_PROJECT_NAMESPACE != "ironfox-oss" when: never @@ -247,10 +262,10 @@ prepare-release: - job: "build-docker" optional: true - job: "build-geckoview" - artifacts: true + artifacts: false optional: true - job: "build-fenix" - artifacts: true + artifacts: false optional: true rules: - if: $CI_COMMIT_TAG @@ -268,13 +283,20 @@ prepare-release: script: - set -euo pipefail - echo 'CI - Preparing secrets...' - - bash scripts/ci-prep.sh s3 + - bash scripts/ci-prep.sh s3-releases - echo 'CI - Prepared secrets.' - echo 'CI - Downloading dependencies...' - bash -x scripts/get_sources.sh python - bash -x scripts/get_sources.sh uv - bash -x scripts/get_sources.sh s3cmd - echo 'CI - Downloaded dependencies.' + - echo 'CI - Downloading artifacts...' + - bash -x scripts/ci-download-artifacts.sh fenix arm64 + - bash -x scripts/ci-download-artifacts.sh fenix arm + - bash -x scripts/ci-download-artifacts.sh fenix x86_64 + - bash -x scripts/ci-download-artifacts.sh fenix universal + - bash -x scripts/ci-download-artifacts.sh fenix bundle + - echo 'CI - Downloaded artifacts.' - echo 'CI - Publishing packages...' - bash scripts/ci-publish-packages.sh - echo 'CI - Published packages.' diff --git a/scripts/ci-build-if.sh b/scripts/ci-build-if.sh index fea26d74..4b089b22 100755 --- a/scripts/ci-build-if.sh +++ b/scripts/ci-build-if.sh @@ -55,17 +55,6 @@ if [[ "${ci_build_project}" == 'fenix' ]]; then fi fi -if [[ "${ci_build_arch}" == 'bundle' ]]; then - # Extract our GeckoView AAR artifacts - mkdir -vp "${IRONFOX_GECKOVIEW_AAR_ARM64_DIR}" - mkdir -vp "${IRONFOX_GECKOVIEW_AAR_ARM_DIR}" - mkdir -vp "${IRONFOX_GECKOVIEW_AAR_X86_64_DIR}" - - "${IRONFOX_TAR}" xvJf "${IRONFOX_ARTIFACTS}/build-geckoview-arm64.tar.xz" -C "${IRONFOX_GECKOVIEW_AAR_ARM64_DIR}" - "${IRONFOX_TAR}" xvJf "${IRONFOX_ARTIFACTS}/build-geckoview-arm.tar.xz" -C "${IRONFOX_GECKOVIEW_AAR_ARM_DIR}" - "${IRONFOX_TAR}" xvJf "${IRONFOX_ARTIFACTS}/build-geckoview-x86_64.tar.xz" -C "${IRONFOX_GECKOVIEW_AAR_X86_64_DIR}" -fi - # Get sources if [[ "${ci_build_project}" == 'geckoview' ]]; then # If we're only building GeckoView, we don't need to download all sources @@ -93,6 +82,13 @@ if [[ "${ci_build_project}" == 'geckoview' ]]; then bash -x "${IRONFOX_SCRIPTS}/get_sources.sh" 'wasi' else bash -x "${IRONFOX_SCRIPTS}/get_sources.sh" + + # If we're building a Fenix bundle, we also need to download our GeckoView artifacts + if [[ "${ci_build_arch}" == 'bundle' ]]; then + bash -x "${IRONFOX_SCRIPTS}/ci-download-artifacts.sh" 'geckoview' 'arm64' + bash -x "${IRONFOX_SCRIPTS}/ci-download-artifacts.sh" 'geckoview' 'arm' + bash -x "${IRONFOX_SCRIPTS}/ci-download-artifacts.sh" 'geckoview' 'x86_64' + fi fi # Prepare sources @@ -108,27 +104,3 @@ fi # Build bash -x "${IRONFOX_SCRIPTS}/build.sh" "${ci_build_arch}" "${ci_build_project}" - -# Copy our GeckoView AAR archives to the artifacts directory for publishing -if [[ "${ci_build_project}" == 'geckoview' ]]; then - mkdir -vp "${IRONFOX_AAR_ARTIFACTS}" - if [[ "${ci_build_arch}" == 'arm64' ]]; then - cp -v "${IRONFOX_OUTPUTS_GECKOVIEW_AAR_ARM64}" "${IRONFOX_AAR_ARTIFACTS}/" - elif [[ "${ci_build_arch}" == 'arm' ]]; then - cp -v "${IRONFOX_OUTPUTS_GECKOVIEW_AAR_ARM}" "${IRONFOX_AAR_ARTIFACTS}/" - elif [[ "${ci_build_arch}" == 'x86_64' ]]; then - cp -v "${IRONFOX_OUTPUTS_GECKOVIEW_AAR_X86_64}" "${IRONFOX_AAR_ARTIFACTS}/" - fi -fi - -# Copy our Fenix outputs to the artifacts directory for publishing -if [[ "${ci_build_project}" == 'fenix' ]]; then - mkdir -vp "${IRONFOX_APK_ARTIFACTS}" - mkdir -vp "${IRONFOX_APKS_ARTIFACTS}" - - cp -v "${IRONFOX_OUTPUTS_ARM64}" "${IRONFOX_APK_ARTIFACTS}/" - cp -v "${IRONFOX_OUTPUTS_ARM}" "${IRONFOX_APK_ARTIFACTS}/" - cp -v "${IRONFOX_OUTPUTS_X86_64}" "${IRONFOX_APK_ARTIFACTS}/" - cp -v "${IRONFOX_OUTPUTS_UNIVERSAL}" "${IRONFOX_APK_ARTIFACTS}/" - cp -v "${IRONFOX_OUTPUTS_BUNDLE}" "${IRONFOX_APKS_ARTIFACTS}/" -fi diff --git a/scripts/ci-build.sh b/scripts/ci-build.sh index 08a72ca4..56c82029 100755 --- a/scripts/ci-build.sh +++ b/scripts/ci-build.sh @@ -50,4 +50,4 @@ readonly IRONFOX_CI_BUILD_FAILED export IRONFOX_CI_BUILD_FAILED # Compress our archives -compress_archives +#compress_archives diff --git a/scripts/ci-download-artifacts-if.sh b/scripts/ci-download-artifacts-if.sh new file mode 100755 index 00000000..075216b2 --- /dev/null +++ b/scripts/ci-download-artifacts-if.sh @@ -0,0 +1,152 @@ +#!/bin/bash + +set -euo pipefail + +# Set-up our environment +if [[ -z "${IRONFOX_CI+x}" ]]; then + export IRONFOX_CI=1 +fi +source $(dirname $0)/env.sh + +# Include utilities +source "${IRONFOX_UTILS}" + +# Include version info +source "${IRONFOX_VERSIONS}" + +if [[ -z "${IRONFOX_FROM_AR_DOWN+x}" ]]; then + echo_red_text 'ERROR: Do not call ci-download-artifacts-if.sh directly. Instead, use ci-download-artifacts.sh.' >&1 + exit 1 +fi + +readonly down_artifact="$1" + +# Set-up target parameters +IRONFOX_AR_DOWN_FENIX=0 +IRONFOX_AR_DOWN_GECKOVIEW=0 + +if [[ "${down_artifact}" == 'fenix' ]]; then + # Download Fenix + IRONFOX_AR_DOWN_FENIX=1 +elif [[ "${down_artifact}" == 'geckoview' ]]; then + # Push GeckoView + IRONFOX_AR_DOWN_GECKOVIEW=1 +else + echo_red_text "ERROR: Invalid artifact: ${down_artifact}\n You must enter one of the following:" + echo 'Fenix: fenix' + echo 'GeckoView: geckoview' + exit 1 +fi +readonly IRONFOX_AR_DOWN_FENIX +readonly IRONFOX_AR_DOWN_GECKOVIEW + +readonly down_arch="$2" + +if [[ "${down_arch}" != 'arm64' ]] && [[ "${down_arch}" != 'arm' ]] && [[ "${down_arch}" != 'x86_64' ]] && [[ "${down_arch}" != 'bundle' ]]; then + echo_red_text "ERROR: Invalid target architecture: ${down_arch}\n You must enter one of the following:" + echo 'ARM64: arm64' + echo 'ARM: arm' + echo 'x86_64: x86_64' + echo 'Bundle: bundle' + exit 1 +fi +readonly IRONFOX_AR_DOWN_ARCH="${down_arch}" + +# Function to download and verify the SHA512sum of an artifact +function download_artifact() { + local readonly pipeline_id="$1" + local readonly artifact="$2" + local readonly arch="$3" + local readonly output_dir="$4" + + if [[ "${arch}" == 'arm64' ]]; then + local readonly arch_suffix='arm64-v8a' + elif [[ "${arch}" == 'arm' ]]; then + local readonly arch_suffix='armeabi-v7a' + elif [[ "${arch}" == 'x86_64' ]]; then + local readonly arch_suffix='x86_64' + elif [[ "${arch}" == 'universal' ]]; then + local readonly arch_suffix='universal' + fi + + if [[ "${artifact}" == 'fenix' ]]; then + if [[ "${arch}" == 'bundle' ]]; then + if [[ "${IRONFOX_RELEASE}" == 1 ]]; then + local readonly target_file="ironfox-${IRONFOX_VERSION}.apks" + else + local readonly target_file="ironfox-${IRONFOX_CHANNEL}-${IRONFOX_VERSION}.apks" + fi + else + if [[ "${IRONFOX_RELEASE}" == 1 ]]; then + local readonly target_file="ironfox-${IRONFOX_VERSION}-${arch_suffix}.apk" + else + local readonly target_file="ironfox-${IRONFOX_CHANNEL}-${IRONFOX_VERSION}-${arch_suffix}.apk" + fi + fi + elif [[ "${artifact}" == 'geckoview' ]]; then + local readonly target_file="geckoview-${arch_suffix}.zip" + fi + + local readonly target_expected_sha512sum="${target_file}-sha512sum.txt" + local readonly target_expected_sha512sum_url="https://artifacts.ironfoxoss.org/${pipeline_id}/${target_expected_sha512sum}" + local readonly target_file_url="https://artifacts.ironfoxoss.org/${pipeline_id}/${target_file}" + local readonly output_file="${output_dir}/${target_file}" + local readonly output_expected_sha512sum="${output_dir}/${target_expected_sha512sum}" + + # Download the artifact + mkdir -p "${output_dir}" + echo_red_text "Downloading ${target_file} from ${target_file_url}..." + curl ${IRONFOX_CURL_FLAGS} --location "${target_file_url}" --output "${output_file}" + echo_green_text "SUCCESS: Downloaded ${target_file}" + + # Check the SHA512sum + echo_red_text "Validating SHA512sum for ${target_file}.." + curl ${IRONFOX_CURL_FLAGS} --location "${target_expected_sha512sum_url}" --output "${output_expected_sha512sum}" + local readonly expected_sha512sum=$(cat "${output_expected_sha512sum}" | xargs) + local readonly local_sha512sum=$(sha512sum "${output_file}" | "${IRONFOX_AWK}" '{print $1}') + if [[ "${local_sha512sum}" != "${expected_sha512sum}" ]]; then + echo_red_text 'ERROR: Checksum validation failed.' + echo "Expected SHA512sum: ${expected_sha512sum}" + echo "Actual SHA512sum: ${local_sha512sum}" + + # If checksum validation fails, also just clean-up the files + rm -f "${output_file}" + rm -f "${output_expected_sha512sum}" + exit 1 + fi + echo_green_text "SUCCESS: Checksum validated for ${target_file}" + echo "SHA512sum: ${local_sha512sum}" +} + +if [[ "${IRONFOX_AR_DOWN_FENIX}" == 1 ]]; then + if [[ "${IRONFOX_AR_DOWN_ARCH}" == 'arm64' ]]; then + download_artifact "${CI_PIPELINE_ID}" 'fenix' 'arm64' "${IRONFOX_APK_ARTIFACTS}" + fi + + if [[ "${IRONFOX_AR_DOWN_ARCH}" == 'arm' ]]; then + download_artifact "${CI_PIPELINE_ID}" 'fenix' 'arm' "${IRONFOX_APK_ARTIFACTS}" + fi + + if [[ "${IRONFOX_AR_DOWN_ARCH}" == 'x86_64' ]]; then + download_artifact "${CI_PIPELINE_ID}" 'fenix' 'x86_64' "${IRONFOX_APK_ARTIFACTS}" + fi + + if [[ "${IRONFOX_AR_DOWN_ARCH}" == 'bundle' ]]; then + download_artifact "${CI_PIPELINE_ID}" 'fenix' 'universal' "${IRONFOX_APK_ARTIFACTS}" + download_artifact "${CI_PIPELINE_ID}" 'fenix' 'bundle' "${IRONFOX_APKS_ARTIFACTS}" + fi +fi + +if [[ "${IRONFOX_AR_DOWN_GECKOVIEW}" == 1 ]]; then + if [[ "${IRONFOX_AR_DOWN_ARCH}" == 'arm64' ]]; then + download_artifact "${CI_PIPELINE_ID}" 'geckoview' 'arm64' "${IRONFOX_AAR_ARTIFACTS}" + fi + + if [[ "${IRONFOX_AR_DOWN_ARCH}" == 'arm' ]]; then + download_artifact "${CI_PIPELINE_ID}" 'geckoview' 'arm' "${IRONFOX_AAR_ARTIFACTS}" + fi + + if [[ "${IRONFOX_AR_DOWN_ARCH}" == 'x86_64' ]]; then + download_artifact "${CI_PIPELINE_ID}" 'geckoview' 'x86_64' "${IRONFOX_AAR_ARTIFACTS}" + fi +fi diff --git a/scripts/ci-download-artifacts.sh b/scripts/ci-download-artifacts.sh new file mode 100755 index 00000000..48dfaf1b --- /dev/null +++ b/scripts/ci-download-artifacts.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -euo pipefail + +if [[ "${CI_COMMIT_REF_NAME}" == "${PRODUCTION_BRANCH}" ]]; then + # Target release + export IRONFOX_RELEASE=1 +fi + +# Set-up our environment +if [[ -z "${IRONFOX_CI+x}" ]]; then + export IRONFOX_CI=1 +fi +if [[ -z "${IRONFOX_SET_ENVS+x}" ]]; then + bash -x $(dirname $0)/env.sh +fi +source $(dirname $0)/env.sh + +# Include utilities +source "${IRONFOX_UTILS}" + +# Set-up target parameters +readonly target_artifact=$(echo "${1}" | "${IRONFOX_AWK}" '{print tolower($0)}') +readonly target_arch=$(echo "${2}" | "${IRONFOX_AWK}" '{print tolower($0)}') + +# Upload our artifacts +readonly IRONFOX_FROM_AR_DOWN=1 +export IRONFOX_FROM_AR_DOWN +if [[ "${IRONFOX_LOG_AR_DOWN}" == 1 ]]; then + readonly AR_DOWN_LOG_FILE="${IRONFOX_LOG_DIR}/download-artifacts-${CI_PIPELINE_ID}-${target_artifact}.log" + + # If the log file already exists, remove it + if [[ -f "${AR_DOWN_LOG_FILE}" ]]; then + rm "${AR_DOWN_LOG_FILE}" + fi + + # Ensure our log directory exists + mkdir -vp "${IRONFOX_LOG_DIR}" + + bash -x "${IRONFOX_SCRIPTS}/ci-download-artifacts-if.sh" "${target_artifact}" "${target_arch}" > >(tee -a "${AR_DOWN_LOG_FILE}") 2>&1 +else + bash -x "${IRONFOX_SCRIPTS}/ci-download-artifacts-if.sh" "${target_artifact}" "${target_arch}" +fi diff --git a/scripts/ci-prep.sh b/scripts/ci-prep.sh index b41dd7ff..567130e7 100755 --- a/scripts/ci-prep.sh +++ b/scripts/ci-prep.sh @@ -22,22 +22,26 @@ source "${IRONFOX_UTILS}" # Set-up target parameters if [[ -z "${1+x}" ]]; then - echo_red_text "Usage: $0 android-keystore|s3|sb" >&1 + echo_red_text "Usage: $0 android-keystore|s3-artifacts|s3-releases|sb" >&1 exit 1 fi readonly ci_prep_target=$(echo "${1}" | "${IRONFOX_AWK}" '{print tolower($0)}') IRONFOX_CI_PREP_ANDROID_KEYSTORE=0 -IRONFOX_CI_PREP_S3=0 +IRONFOX_CI_PREP_S3_ARTIFACTS=0 +IRONFOX_CI_PREP_S3_RELEASES=0 IRONFOX_CI_PREP_SB_GAPI_KEY=0 if [[ "${ci_prep_target}" == 'android-ks' ]]; then # Set-up the Android keystore IRONFOX_CI_PREP_ANDROID_KEYSTORE=1 -elif [[ "${ci_prep_target}" == 's3' ]]; then - # Set-up S3 storage - IRONFOX_CI_PREP_S3=1 +elif [[ "${ci_prep_target}" == 's3-artifacts' ]]; then + # Set-up S3 storage - Artifacts + IRONFOX_CI_PREP_S3_ARTIFACTS=1 +elif [[ "${ci_prep_target}" == 's3-releases' ]]; then + # Set-up S3 storage - Releases + IRONFOX_CI_PREP_S3_RELEASES=1 elif [[ "${ci_prep_target}" == 'sb' ]]; then # Set-up the Google Safe Browsing API key IRONFOX_CI_PREP_SB_GAPI_KEY=1 @@ -45,11 +49,13 @@ else echo_red_text "ERROR: Invalid target: ${ci_prep_target}\n You must enter one of the following:" echo 'Android keystore: android-keystore' echo 'Google Safe Browsing API key: sb' - echo 'S3 storage: s3' + echo 'S3 storage - Artifacts: s3-artifacts' + echo 'S3 storage - Releases: s3-releases' exit 1 fi readonly IRONFOX_CI_PREP_ANDROID_KEYSTORE -readonly IRONFOX_CI_PREP_S3 +readonly IRONFOX_CI_PREP_S3_ARTIFACTS +readonly IRONFOX_CI_PREP_S3_RELEASES readonly IRONFOX_CI_PREP_SB_GAPI_KEY # Android keystore @@ -162,9 +168,135 @@ function prep_android_keystore() { echo_green_text 'SUCCESS: Prepared Android keystore' } -# S3 storage -function prep_s3() { - echo_red_text 'Preparing S3 storage...' +# S3 storage - Artifacts +function prep_s3_artifacts() { + echo_red_text 'Preparing S3 storage - Artifacts...' + + # First, ensure that environment variables specified externally (from CI) are properly set... + + ## S3 access key + if [[ -z "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY+x}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ACCESS_KEY environment variable is missing! Aborting...' + exit 1 + fi + readonly IRONFOX_ARTIFACTS_S3_ACCESS_KEY + + ## S3 bucket name + if [[ -z "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME+x}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_BUCKET_NAME environment variable is missing! Aborting...' + exit 1 + fi + readonly IRONFOX_ARTIFACTS_S3_BUCKET_NAME + + ## S3 endpoint + if [[ -z "${IRONFOX_ARTIFACTS_S3_ENDPOINT+x}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ENDPOINT environment variable is missing! Aborting...' + exit 1 + fi + readonly IRONFOX_ARTIFACTS_S3_ENDPOINT + + ## S3 secret key + if [[ -z "${IRONFOX_ARTIFACTS_S3_SECRET_KEY+x}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_SECRET_KEY environment variable is missing! Aborting...' + exit 1 + fi + readonly IRONFOX_ARTIFACTS_S3_SECRET_KEY + + # Now, ensure that our S3 file variables (defined at `env_common.sh`, set at `env_ci.sh`) are properly set... + + if [[ -z "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE environment variable is missing! Aborting...' + exit 1 + fi + + if [[ "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE environment variable has not been specified! Aborting...' + exit 1 + fi + + if [[ -z "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE environment variable is missing! Aborting...' + exit 1 + fi + + if [[ "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE environment variable has not been specified! Aborting...' + exit 1 + fi + + if [[ -z "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE environment variable is missing! Aborting...' + exit 1 + fi + + if [[ "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE environment variable has not been specified! Aborting...' + exit 1 + fi + + if [[ -z "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE environment variable is missing! Aborting...' + exit 1 + fi + + if [[ "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE environment variable has not been specified! Aborting...' + exit 1 + fi + + # Create our directories + mkdir -p $(dirname "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}") + mkdir -p $(dirname "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}") + mkdir -p $(dirname "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}") + mkdir -p $(dirname "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}") + + # Create the S3 access key file + touch "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" + chmod 600 "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" + echo -n "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY}" > "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" + + # Create the S3 bucket name file + touch "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" + chmod 600 "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" + echo -n "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME}" > "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" + + # Create the S3 endpoint file + touch "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" + chmod 600 "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" + echo -n "${IRONFOX_ARTIFACTS_S3_ENDPOINT}" > "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" + + # Create the S3 secret key file + touch "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" + chmod 600 "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" + echo -n "${IRONFOX_ARTIFACTS_S3_SECRET_KEY}" > "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" + + # Ensure nothing went wrong... + if [[ ! -s "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" ]]; then + echo_red_text "ERROR: S3 access key file ${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE} is empty!" + exit 1 + fi + + if [[ ! -s "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" ]]; then + echo_red_text "ERROR: S3 bucket name file ${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE} is empty!" + exit 1 + fi + + if [[ ! -s "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" ]]; then + echo_red_text "ERROR: S3 endpoint file ${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE} is empty!" + exit 1 + fi + + if [[ ! -s "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" ]]; then + echo_red_text "ERROR: S3 secret key file ${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE} is empty!" + exit 1 + fi + + echo_green_text 'SUCCESS: Prepared S3 storage - Artifacts' +} + +# S3 storage - Releases +function prep_s3_releases() { + echo_red_text 'Preparing S3 storage - Releases...' # First, ensure that environment variables specified externally (from CI) are properly set... @@ -285,7 +417,7 @@ function prep_s3() { exit 1 fi - echo_green_text 'SUCCESS: Prepared S3 storage' + echo_green_text 'SUCCESS: Prepared S3 storage - Releases' } # Google Safe Browsing API key @@ -332,8 +464,10 @@ function prep_sb_gapi_key() { # Prepare our secrets... if [[ "${IRONFOX_CI_PREP_ANDROID_KEYSTORE}" == 1 ]]; then prep_android_keystore -elif [[ "${IRONFOX_CI_PREP_S3}" == 1 ]]; then - prep_s3 +elif [[ "${IRONFOX_CI_PREP_S3_ARTIFACTS}" == 1 ]]; then + prep_s3_artifacts +elif [[ "${IRONFOX_CI_PREP_S3_RELEASES}" == 1 ]]; then + prep_s3_releases elif [[ "${IRONFOX_CI_PREP_SB_GAPI_KEY}" == 1 ]]; then prep_sb_gapi_key fi diff --git a/scripts/ci-update-fdroid.sh b/scripts/ci-update-fdroid.sh index 39060d4a..b7159ba8 100644 --- a/scripts/ci-update-fdroid.sh +++ b/scripts/ci-update-fdroid.sh @@ -43,7 +43,7 @@ function download_release() { if [[ "${local_sha512sum}" != "${expected_sha512sum}" ]]; then echo_red_text 'ERROR: Checksum validation failed.' echo "Expected SHA512sum: ${expected_sha512sum}" - echo "Actual SHA512sum: ${local_sha512sum}" + echo "Actual SHA512sum: ${local_sha512sum}" # If checksum validation fails, also just clean-up the files rm -f "${output_apk}" diff --git a/scripts/ci-upload-artifacts-if.sh b/scripts/ci-upload-artifacts-if.sh new file mode 100755 index 00000000..7b3923b6 --- /dev/null +++ b/scripts/ci-upload-artifacts-if.sh @@ -0,0 +1,338 @@ +#!/bin/bash + +set -euo pipefail + +# Ensure this is never ran with xtrace... +set +x + +# Set-up our environment +if [[ -z "${IRONFOX_CI+x}" ]]; then + export IRONFOX_CI=1 +fi +source $(dirname $0)/env.sh + +# Include utilities +source "${IRONFOX_UTILS}" + +if [[ -z "${IRONFOX_FROM_AR_UP+x}" ]]; then + echo_red_text 'ERROR: Do not call ci-upload-artifacts-if.sh directly. Instead, use ci-upload-artifacts.sh.' >&1 + exit 1 +fi + +if [[ -z "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE environment variable is missing! Aborting...' + exit 1 +fi + +if [[ "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE environment variable has not been specified! Aborting...' + exit 1 +fi + +if [[ ! -f "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" ]]; then + echo_red_text "ERROR: S3 access key file not found! (${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE})" + echo_green_text "Please ensure the IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE environment variable is set to the correct path in which the key file is located." + echo_red_text "Aborting..." + exit 1 +fi + +if [[ ! -s "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" ]]; then + echo_red_text "ERROR: S3 access key file ${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE} is empty!" + exit 1 +fi + +if [[ -z "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE environment variable is missing! Aborting...' + exit 1 +fi + +if [[ "${IRONFOX_RELEASES_S3_BUCKET_NAME_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_RELEASES_S3_BUCKET_NAME_FILE environment variable has not been specified! Aborting...' + exit 1 +fi + +if [[ ! -f "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" ]]; then + echo_red_text "ERROR: S3 bucket name file not found! (${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE})" + echo_green_text "Please ensure the IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE environment variable is set to the correct path in which the bucket name file is located." + echo_red_text "Aborting..." + exit 1 +fi + +if [[ ! -s "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" ]]; then + echo_red_text "ERROR: S3 bucket name file ${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE} is empty!" + exit 1 +fi + +if [[ -z "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE environment variable is missing! Aborting...' + exit 1 +fi + +if [[ "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE environment variable has not been specified! Aborting...' + exit 1 +fi + +if [[ ! -f "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" ]]; then + echo_red_text "ERROR: S3 endpoint file not found! (${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE})" + echo_green_text "Please ensure the IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE environment variable is set to the correct path in which the endpoint file is located." + echo_red_text "Aborting..." + exit 1 +fi + +if [[ ! -s "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" ]]; then + echo_red_text "ERROR: S3 bucket name file ${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE} is empty!" + exit 1 +fi + +if [[ "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" == 'null' ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE environment variable has not been specified! Aborting...' + exit 1 +fi + +if [[ -z "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" ]]; then + echo_red_text 'ERROR: The IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE environment variable is missing! Aborting...' + exit 1 +fi + +if [[ ! -f "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" ]]; then + echo_red_text "ERROR: S3 secret key file not found! (${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE})" + echo_green_text "Please ensure the IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE environment variable is set to the correct path in which the key file is located." + echo_red_text "Aborting..." + exit 1 +fi + +if [[ ! -s "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" ]]; then + echo_red_text "ERROR: S3 secret key file ${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE} is empty!" + exit 1 +fi + +readonly up_artifact="$1" + +# Set-up target parameters +IRONFOX_AR_UP_FENIX=0 +IRONFOX_AR_UP_GECKOVIEW=0 + +if [[ "${up_artifact}" == 'fenix' ]]; then + # Push Fenix + IRONFOX_AR_UP_FENIX=1 +elif [[ "${up_artifact}" == 'geckoview' ]]; then + # Push GeckoView + IRONFOX_AR_UP_GECKOVIEW=1 +else + echo_red_text "ERROR: Invalid artifact: ${up_artifact}\n You must enter one of the following:" + echo 'Fenix: fenix' + echo 'GeckoView: geckoview' + exit 1 +fi +readonly IRONFOX_AR_UP_FENIX +readonly IRONFOX_AR_UP_GECKOVIEW + +readonly up_arch="$2" + +if [[ "${up_arch}" != 'arm64' ]] && [[ "${up_arch}" != 'arm' ]] && [[ "${up_arch}" != 'x86_64' ]] && [[ "${up_arch}" != 'bundle' ]]; then + echo_red_text "ERROR: Invalid target architecture: ${up_arch}\n You must enter one of the following:" + echo 'ARM64: arm64' + echo 'ARM: arm' + echo 'x86_64: x86_64' + echo 'Bundle: bundle' + exit 1 +fi +readonly IRONFOX_AR_UP_ARCH="${up_arch}" + +# Set timezone to UTC for consistency +unset TZ +export TZ="UTC" + +# Verifies that a file exists and is not empty +function verify_file() { + function print_usage() { + echo "Usage: verify_file '/path/to/file'" + } + + if [[ -z "${1+x}" ]]; then + echo_red_text 'ERROR: Please specify the path to a file to verify' + print_usage + exit 1 + fi + + local readonly file_to_verify="$1" + + if [[ ! -f "${file_to_verify}" ]]; then + echo_red_text "ERROR: File ${file_to_verify} does not exist!" + exit 1 + fi + + if [[ ! -s "${file_to_verify}" ]]; then + echo_red_text "ERROR: File ${file_to_verify} is empty!" + exit 1 + fi +} + +# Pushes a file to S3 +function push_file() { + function print_usage() { + echo "Usage: push_file '/path/to/file' 'path/on/s3'" + } + + if [[ -z "${1+x}" ]]; then + echo_red_text 'ERROR: Please specify the path to a file that should be uploaded to S3 storage' + print_usage + exit 1 + fi + + if [[ -z "${2+x}" ]]; then + echo_red_text 'ERROR: Please specify the target path on S3 storage for where the file should be uploaded' + print_usage + exit 1 + fi + + local readonly push_file="$1" + local readonly s3_path="$2" + local readonly s3_full_path="${s3_path}/$(basename "${push_file}")" + + # Ensure our file to push is valid + verify_file "${push_file}" + + # Set our MIME type + case "${push_file}" in + *.apk) + local readonly mime_type='application/vnd.android.package-archive' + ;; + *.apks) + local readonly mime_type='application/vnd.android.package-archive' + ;; + *.json) + local readonly mime_type='application/json' + ;; + *.log) + local readonly mime_type='text/plain' + ;; + *.txt) + local readonly mime_type='text/plain' + ;; + *.zip) + local readonly mime_type='application/zip' + ;; + *) + echo_red_text "ERROR: Unsupported file type: ${push_file}" + exit 1 + ;; + esac + + local readonly s3_access_key=$(cat "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE}" | xargs) + local readonly s3_bucket_name=$(cat "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE}" | xargs) + local readonly s3_endpoint=$(cat "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE}" | xargs) + local readonly s3_secret_key=$(cat "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE}" | xargs) + + echo_red_text "Uploading ${push_file} to S3..." + source "${IRONFOX_PYENV}" + "${IRONFOX_S3CMD}" ${IRONFOX_S3CMD_FLAGS} --mime-type="${mime_type}" put "${push_file}" "s3://${s3_bucket_name}/${s3_full_path}" \ + --access_key="${s3_access_key}" \ + --secret_key="${s3_secret_key}" \ + --host="${s3_endpoint}" \ + --host-bucket="${s3_endpoint}" + echo_green_text "SUCCESS: Uploaded ${push_file} to S3" +} + +# Creates and pushes a SHA512sum for a file to S3 +function add_sha512sum() { + function print_usage() { + echo "Usage: add_sha512sum '/path/to/file'" + } + + if [[ -z "${1+x}" ]]; then + echo_red_text 'ERROR: Please specify the path to a file that a SHA512sum should be created for' + print_usage + exit 1 + fi + + local readonly sha512sum_file_in="$1" + local readonly sha512sum_file_name=$(basename "${sha512sum_file_in}") + local readonly sha512sum_file_path=$(dirname "${sha512sum_file_in}") + + if [[ -z "${2+x}" ]]; then + local readonly sha512sum_s3path=$(basename "${sha512sum_file_path}" | "${IRONFOX_AWK}" '{print tolower($0)}') + else + local readonly sha512sum_s3path="$2" + fi + + # Ensure our file to create a SHA512sum for is valid + verify_file "${sha512sum_file_in}" + + local readonly sha512sum_file_out="${sha512sum_file_path}/${sha512sum_file_name}-sha512sum.txt" + + # If there's already a SHA512sum file, remove it + if [[ -f "${sha512sum_file_out}" ]]; then + rm -f "${sha512sum_file_out}" + fi + + local readonly local_sha512sum=$(sha512sum "${sha512sum_file_in}" | "${IRONFOX_AWK}" '{print $1}') + echo -n "${local_sha512sum}" > "${sha512sum_file_out}" + + push_file "${sha512sum_file_out}" "${sha512sum_s3path}" +} + +# Creates a SHA512sum for and pushes a file to S3 +function push_and_add_sha512sum() { + function print_usage() { + echo "Usage: push_and_add_sha512sum '/path/to/file' 'path/on/s3'" + } + + if [[ -z "${1+x}" ]]; then + echo_red_text 'ERROR: Please specify the path to a file that should be uploaded to S3 storage' + print_usage + exit 1 + fi + + if [[ -z "${2+x}" ]]; then + echo_red_text 'ERROR: Please specify the target path on S3 storage for where the file should be uploaded' + print_usage + exit 1 + fi + + local readonly file_in="$1" + local readonly s3_path_out="$2" + + # Ensure our file to create a SHA512sum for and push is valid + verify_file "${file_in}" + + # Push our file to S3 + push_file "${file_in}" "${s3_path_out}" + + # Create and push a SHA512sum for our file to S3 + add_sha512sum "${file_in}" "${s3_path_out}" +} + +if [[ "${IRONFOX_AR_UP_FENIX}" == 1 ]]; then + if [[ "${IRONFOX_AR_UP_ARCH}" == 'arm64' ]] || [[ "${IRONFOX_AR_UP_ARCH}" == 'bundle' ]]; then + push_and_add_sha512sum "${IRONFOX_OUTPUTS_ARM64}" "${CI_PIPELINE_ID}" + fi + + if [[ "${IRONFOX_AR_UP_ARCH}" == 'arm' ]] || [[ "${IRONFOX_AR_UP_ARCH}" == 'bundle' ]]; then + push_and_add_sha512sum "${IRONFOX_OUTPUTS_ARM}" "${CI_PIPELINE_ID}" + fi + + if [[ "${IRONFOX_AR_UP_ARCH}" == 'x86_64' ]] || [[ "${IRONFOX_AR_UP_ARCH}" == 'bundle' ]]; then + push_and_add_sha512sum "${IRONFOX_OUTPUTS_X86_64}" "${CI_PIPELINE_ID}" + fi + + if [[ "${IRONFOX_AR_UP_ARCH}" == 'bundle' ]]; then + push_and_add_sha512sum "${IRONFOX_OUTPUTS_UNIVERSAL}" "${CI_PIPELINE_ID}" + push_and_add_sha512sum "${IRONFOX_OUTPUTS_BUNDLE}" "${CI_PIPELINE_ID}" + fi +fi + +if [[ "${IRONFOX_AR_UP_GECKOVIEW}" == 1 ]]; then + if [[ "${IRONFOX_AR_UP_ARCH}" == 'arm64' ]]; then + push_and_add_sha512sum "${IRONFOX_OUTPUTS_GECKOVIEW_AAR_ARM64}" "${CI_PIPELINE_ID}" + fi + + if [[ "${IRONFOX_AR_UP_ARCH}" == 'arm' ]]; then + push_and_add_sha512sum "${IRONFOX_OUTPUTS_GECKOVIEW_AAR_ARM}" "${CI_PIPELINE_ID}" + fi + + if [[ "${IRONFOX_AR_UP_ARCH}" == 'x86_64' ]]; then + push_and_add_sha512sum "${IRONFOX_OUTPUTS_GECKOVIEW_AAR_ARM}" "${CI_PIPELINE_ID}" + fi +fi diff --git a/scripts/ci-upload-artifacts.sh b/scripts/ci-upload-artifacts.sh new file mode 100755 index 00000000..9ea2a2af --- /dev/null +++ b/scripts/ci-upload-artifacts.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -euo pipefail + +if [[ "${CI_COMMIT_REF_NAME}" == "${PRODUCTION_BRANCH}" ]]; then + # Target release + export IRONFOX_RELEASE=1 +fi + +# Set-up our environment +if [[ -z "${IRONFOX_CI+x}" ]]; then + export IRONFOX_CI=1 +fi +if [[ -z "${IRONFOX_SET_ENVS+x}" ]]; then + bash -x $(dirname $0)/env.sh +fi +source $(dirname $0)/env.sh + +# Include utilities +source "${IRONFOX_UTILS}" + +# Set-up target parameters +readonly target_artifact=$(echo "${1}" | "${IRONFOX_AWK}" '{print tolower($0)}') +readonly target_arch=$(echo "${2}" | "${IRONFOX_AWK}" '{print tolower($0)}') + +# Upload our artifacts +readonly IRONFOX_FROM_AR_UP=1 +export IRONFOX_FROM_AR_UP +if [[ "${IRONFOX_LOG_AR_UP}" == 1 ]]; then + readonly AR_UP_LOG_FILE="${IRONFOX_LOG_DIR}/upload-artifacts-${CI_PIPELINE_ID}-${target_artifact}.log" + + # If the log file already exists, remove it + if [[ -f "${AR_UP_LOG_FILE}" ]]; then + rm "${AR_UP_LOG_FILE}" + fi + + # Ensure our log directory exists + mkdir -vp "${IRONFOX_LOG_DIR}" + + bash "${IRONFOX_SCRIPTS}/ci-upload-artifacts-if.sh" "${target_artifact}" "${target_arch}" > >(tee -a "${AR_UP_LOG_FILE}") 2>&1 +else + bash "${IRONFOX_SCRIPTS}/ci-upload-artifacts-if.sh" "${target_artifact}" "${target_arch}" +fi diff --git a/scripts/env_ci.sh b/scripts/env_ci.sh index bad6a2bb..568f1cab 100644 --- a/scripts/env_ci.sh +++ b/scripts/env_ci.sh @@ -19,18 +19,23 @@ export IRONFOX_LOCAL_AS_VERSION_OVERRIDE="$("${IRONFOX_DATE}" -d "${CI_PIPELINE_ export IRONFOX_LOCAL_GLEAN_VERSION_OVERRIDE="$("${IRONFOX_DATE}" -d "${CI_PIPELINE_CREATED_AT}" "+%s%N")" # GeckoView AAR archives -export IRONFOX_GECKOVIEW_AAR_ARM64_DIR="${IRONFOX_EXTERNAL}/geckoview-arm64" -export IRONFOX_GECKOVIEW_AAR_ARM64="${IRONFOX_GECKOVIEW_AAR_ARM64_DIR}/aar/geckoview-arm64-v8a.zip" -export IRONFOX_GECKOVIEW_AAR_ARM_DIR="${IRONFOX_EXTERNAL}/geckoview-arm" -export IRONFOX_GECKOVIEW_AAR_ARM="${IRONFOX_GECKOVIEW_AAR_ARM_DIR}/aar/geckoview-armeabi-v7a.zip" -export IRONFOX_GECKOVIEW_AAR_X86_64_DIR="${IRONFOX_EXTERNAL}/geckoview-x86_64" -export IRONFOX_GECKOVIEW_AAR_X86_64="${IRONFOX_GECKOVIEW_AAR_X86_64_DIR}/aar/geckoview-x86_64.zip" +export IRONFOX_GECKOVIEW_AAR_ARM64="${IRONFOX_AAR_ARTIFACTS}/geckoview-arm64-v8a.zip" +export IRONFOX_GECKOVIEW_AAR_ARM="${IRONFOX_AAR_ARTIFACTS}/geckoview-armeabi-v7a.zip" +export IRONFOX_GECKOVIEW_AAR_X86_64="${IRONFOX_AAR_ARTIFACTS}/geckoview-x86_64.zip" export IRONFOX_GECKOVIEW_BUNDLE_DIRECT=1 # Log directory export IRONFOX_LOG_DIR="${IRONFOX_LOG_ARTIFACTS}" # S3 + +## Artifacts +export IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE='/opt/IronFox/ironfox-artifacts-s3-access-key.txt' +export IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE='/opt/IronFox/ironfox-artifacts-s3-bucket-name.txt' +export IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE='/opt/IronFox/ironfox-artifacts-s3-endpoint.txt' +export IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE='/opt/IronFox/ironfox-artifacts-s3-secret-key.txt' + +## Releases export IRONFOX_RELEASES_S3_ACCESS_KEY_FILE='/opt/IronFox/ironfox-releases-s3-access-key.txt' export IRONFOX_RELEASES_S3_BUCKET_NAME_FILE='/opt/IronFox/ironfox-releases-s3-bucket-name.txt' export IRONFOX_RELEASES_S3_ENDPOINT_FILE='/opt/IronFox/ironfox-releases-s3-endpoint.txt' diff --git a/scripts/env_common.sh b/scripts/env_common.sh index 847381dd..059add46 100644 --- a/scripts/env_common.sh +++ b/scripts/env_common.sh @@ -176,6 +176,22 @@ fi readonly IRONFOX_LOG_BUILD export IRONFOX_LOG_BUILD +# Should we create a log file for ci-download-artifacts.sh? (Default) +readonly IRONFOX_LOG_AR_DOWN_DEFAULT=1 +if [[ -z "${IRONFOX_LOG_AR_DOWN+x}" ]]; then + IRONFOX_LOG_AR_DOWN="${IRONFOX_LOG_AR_DOWN_DEFAULT}" +fi +readonly IRONFOX_LOG_AR_DOWN +export IRONFOX_LOG_AR_DOWN + +# Should we create a log file for ci-upload-artifacts.sh? (Default) +readonly IRONFOX_LOG_AR_UP_DEFAULT=1 +if [[ -z "${IRONFOX_LOG_AR_UP+x}" ]]; then + IRONFOX_LOG_AR_UP="${IRONFOX_LOG_AR_UP_DEFAULT}" +fi +readonly IRONFOX_LOG_AR_UP +export IRONFOX_LOG_AR_UP + # Should we create a log file for prebuild.sh? (Default) readonly IRONFOX_LOG_PREBUILD_DEFAULT=1 if [[ -z "${IRONFOX_LOG_PREBUILD+x}" ]]; then @@ -1131,7 +1147,43 @@ export IRONFOX_SIGN_SKIP_ADB # S3 -# S3 access key +## Artifacts + +### S3 access key +readonly IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE_DEFAULT='null' +if [[ -z "${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE+x}" ]]; then + IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE="${IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE_DEFAULT}" +fi +readonly IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE +export IRONFOX_ARTIFACTS_S3_ACCESS_KEY_FILE + +### S3 bucket name +readonly IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE_DEFAULT='null' +if [[ -z "${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE+x}" ]]; then + IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE="${IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE_DEFAULT}" +fi +readonly IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE +export IRONFOX_ARTIFACTS_S3_BUCKET_NAME_FILE + +### S3 endpoint +readonly IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE_DEFAULT='null' +if [[ -z "${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE+x}" ]]; then + IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE="${IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE_DEFAULT}" +fi +readonly IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE +export IRONFOX_ARTIFACTS_S3_ENDPOINT_FILE + +### S3 secret key +readonly IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE_DEFAULT='null' +if [[ -z "${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE+x}" ]]; then + IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE="${IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE_DEFAULT}" +fi +readonly IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE +export IRONFOX_ARTIFACTS_S3_SECRET_KEY_FILE + +## Releases + +### S3 access key readonly IRONFOX_RELEASES_S3_ACCESS_KEY_FILE_DEFAULT='null' if [[ -z "${IRONFOX_RELEASES_S3_ACCESS_KEY_FILE+x}" ]]; then IRONFOX_RELEASES_S3_ACCESS_KEY_FILE="${IRONFOX_RELEASES_S3_ACCESS_KEY_FILE_DEFAULT}" @@ -1139,7 +1191,7 @@ fi readonly IRONFOX_RELEASES_S3_ACCESS_KEY_FILE export IRONFOX_RELEASES_S3_ACCESS_KEY_FILE -# S3 bucket name +### S3 bucket name readonly IRONFOX_RELEASES_S3_BUCKET_NAME_FILE_DEFAULT='null' if [[ -z "${IRONFOX_RELEASES_S3_BUCKET_NAME_FILE+x}" ]]; then IRONFOX_RELEASES_S3_BUCKET_NAME_FILE="${IRONFOX_RELEASES_S3_BUCKET_NAME_FILE_DEFAULT}" @@ -1147,7 +1199,7 @@ fi readonly IRONFOX_RELEASES_S3_BUCKET_NAME_FILE export IRONFOX_RELEASES_S3_BUCKET_NAME_FILE -# S3 endpoint +### S3 endpoint readonly IRONFOX_RELEASES_S3_ENDPOINT_FILE_DEFAULT='null' if [[ -z "${IRONFOX_RELEASES_S3_ENDPOINT_FILE+x}" ]]; then IRONFOX_RELEASES_S3_ENDPOINT_FILE="${IRONFOX_RELEASES_S3_ENDPOINT_FILE_DEFAULT}" @@ -1155,7 +1207,7 @@ fi readonly IRONFOX_RELEASES_S3_ENDPOINT_FILE export IRONFOX_RELEASES_S3_ENDPOINT_FILE -# S3 secret key +### S3 secret key readonly IRONFOX_RELEASES_S3_SECRET_KEY_FILE_DEFAULT='null' if [[ -z "${IRONFOX_RELEASES_S3_SECRET_KEY_FILE+x}" ]]; then IRONFOX_RELEASES_S3_SECRET_KEY_FILE="${IRONFOX_RELEASES_S3_SECRET_KEY_FILE_DEFAULT}" @@ -1189,30 +1241,6 @@ fi readonly IRONFOX_GECKOVIEW_AAR_X86_64 export IRONFOX_GECKOVIEW_AAR_X86_64 -# Location of where CI should extract the ARM64 GeckoView AAR archive -readonly IRONFOX_GECKOVIEW_AAR_ARM64_DIR_DEFAULT="${IRONFOX_EXTERNAL}/geckoview-arm64" -if [[ -z "${IRONFOX_GECKOVIEW_AAR_ARM64_DIR+x}" ]]; then - IRONFOX_GECKOVIEW_AAR_ARM64_DIR="${IRONFOX_GECKOVIEW_AAR_ARM64_DIR_DEFAULT}" -fi -readonly IRONFOX_GECKOVIEW_AAR_ARM64_DIR -export IRONFOX_GECKOVIEW_AAR_ARM64_DIR - -# Location of where CI should extract the ARM GeckoView AAR archive -readonly IRONFOX_GECKOVIEW_AAR_ARM_DIR_DEFAULT="${IRONFOX_EXTERNAL}/geckoview-arm" -if [[ -z "${IRONFOX_GECKOVIEW_AAR_ARM_DIR+x}" ]]; then - IRONFOX_GECKOVIEW_AAR_ARM_DIR="${IRONFOX_GECKOVIEW_AAR_ARM_DIR_DEFAULT}" -fi -readonly IRONFOX_GECKOVIEW_AAR_ARM_DIR -export IRONFOX_GECKOVIEW_AAR_ARM_DIR - -# Location of where CI should extract the x86_64 GeckoView AAR archive -readonly IRONFOX_GECKOVIEW_AAR_X86_64_DIR_DEFAULT="${IRONFOX_EXTERNAL}/geckoview-x86_64" -if [[ -z "${IRONFOX_GECKOVIEW_AAR_X86_64_DIR+x}" ]]; then - IRONFOX_GECKOVIEW_AAR_X86_64_DIR="${IRONFOX_GECKOVIEW_AAR_X86_64_DIR_DEFAULT}" -fi -readonly IRONFOX_GECKOVIEW_AAR_X86_64_DIR -export IRONFOX_GECKOVIEW_AAR_X86_64_DIR - source "${IRONFOX_VERSIONS}" # Node.js @@ -1363,7 +1391,7 @@ export IRONFOX_OUTPUTS_BUNDLE_AAB if [[ "${IRONFOX_RELEASE}" == 1 ]]; then readonly IRONFOX_OUTPUTS_BUNDLE_DEFAULT="${IRONFOX_OUTPUTS_APKS}/ironfox-${IRONFOX_VERSION}.apks" else - readonly IRONFOX_OUTPUTS_BUNDLE_DEFAULT="${IRONFOX_OUTPUTS_APK}/ironfox-${IRONFOX_CHANNEL}-${IRONFOX_VERSION}.apks" + readonly IRONFOX_OUTPUTS_BUNDLE_DEFAULT="${IRONFOX_OUTPUTS_APKS}/ironfox-${IRONFOX_CHANNEL}-${IRONFOX_VERSION}.apks" fi if [[ -z "${IRONFOX_OUTPUTS_BUNDLE+x}" ]]; then IRONFOX_OUTPUTS_BUNDLE="${IRONFOX_OUTPUTS_BUNDLE_DEFAULT}"