fix: Upload artifacts to S3 storage (instead of GitLab directly) - lets us bypass the size limits and reduces our reliance/dependency on GitLab

Signed-off-by: celenity <celenity@celenity.dev>
This commit is contained in:
celenity
2026-06-30 22:44:08 +00:00
parent 256d0ec7e5
commit 03190893e1
11 changed files with 833 additions and 96 deletions

View File

@@ -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.'

View File

@@ -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

View File

@@ -50,4 +50,4 @@ readonly IRONFOX_CI_BUILD_FAILED
export IRONFOX_CI_BUILD_FAILED
# Compress our archives
compress_archives
#compress_archives

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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}"

338
scripts/ci-upload-artifacts-if.sh Executable file
View File

@@ -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

43
scripts/ci-upload-artifacts.sh Executable file
View File

@@ -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

View File

@@ -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'

View File

@@ -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}"