mirror of
https://github.com/ironfox-oss/IronFox.git
synced 2026-07-31 09:56:46 -04:00
288 lines
13 KiB
Bash
Executable File
288 lines
13 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# This file is expected to be executed in GitLab CI
|
|
# DO NOT executed this manually!
|
|
|
|
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
|
|
if [[ -z "${IRONFOX_SET_ENVS+x}" ]]; then
|
|
/bin/bash "$(realpath $(dirname "$0"))/env.sh"
|
|
fi
|
|
source "$(realpath $(dirname "$0"))/env.sh"
|
|
|
|
# Include utilities
|
|
source "${IRONFOX_UTILS}"
|
|
|
|
# Verify secrets
|
|
verify_file_with_env "${IRONFOX_RELEASES_S3_ACCESS_KEY_FILE}" 'IRONFOX_RELEASES_S3_ACCESS_KEY_FILE' || exit 1
|
|
verify_file_with_env "${IRONFOX_RELEASES_S3_BUCKET_NAME_FILE}" 'IRONFOX_RELEASES_S3_BUCKET_NAME_FILE' || exit 1
|
|
verify_file_with_env "${IRONFOX_RELEASES_S3_ENDPOINT_FILE}" 'IRONFOX_RELEASES_S3_ENDPOINT_FILE' || exit 1
|
|
verify_file_with_env "${IRONFOX_RELEASES_S3_SECRET_KEY_FILE}" 'IRONFOX_RELEASES_S3_SECRET_KEY_FILE' || exit 1
|
|
|
|
readonly GENERIC_PACKAGES_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic"
|
|
|
|
function upload_to_package_registry() {
|
|
local -r upload_file="$1"
|
|
local -r upload_package_name="$2"
|
|
local -r upload_file_name="$("${IRONFOX_BASENAME}" "${upload_file}")"
|
|
"${IRONFOX_CURL}" ${IRONFOX_CURL_FLAGS} --no-verbose --header "PRIVATE-TOKEN: ${GITLAB_CI_API_TOKEN}" \
|
|
--upload-file "${upload_file}" \
|
|
"${GENERIC_PACKAGES_URL}/${upload_package_name}/${IRONFOX_VERSION}/${upload_file_name}"
|
|
}
|
|
|
|
# Pushes a file to S3
|
|
function push_to_s3() {
|
|
function print_usage() {
|
|
echo "Usage: push_to_s3 '/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 -r push_file="$1"
|
|
local -r s3_path="$2"
|
|
local -r s3_full_path="${s3_path}/$("${IRONFOX_BASENAME}" "${push_file}")"
|
|
|
|
# Ensure our file to push is valid
|
|
verify_file "${push_file}" || exit 1
|
|
|
|
# Set our MIME type
|
|
case "${push_file}" in
|
|
*.apk)
|
|
local -r mime_type='application/vnd.android.package-archive'
|
|
;;
|
|
*.apks)
|
|
local -r mime_type='application/vnd.android.package-archive'
|
|
;;
|
|
*.json)
|
|
local -r mime_type='application/json'
|
|
;;
|
|
*.txt)
|
|
local -r mime_type='text/plain'
|
|
;;
|
|
*)
|
|
echo_red_text "ERROR: Unsupported file type: ${push_file}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
local -r s3_access_key=$("${IRONFOX_CAT}" "${IRONFOX_RELEASES_S3_ACCESS_KEY_FILE}" | "${IRONFOX_XARGS}")
|
|
local -r s3_bucket_name=$("${IRONFOX_CAT}" "${IRONFOX_RELEASES_S3_BUCKET_NAME_FILE}" | "${IRONFOX_XARGS}")
|
|
local -r s3_endpoint=$("${IRONFOX_CAT}" "${IRONFOX_RELEASES_S3_ENDPOINT_FILE}" | "${IRONFOX_XARGS}")
|
|
local -r s3_secret_key=$("${IRONFOX_CAT}" "${IRONFOX_RELEASES_S3_SECRET_KEY_FILE}" | "${IRONFOX_XARGS}")
|
|
|
|
if [[ "${s3_path}" == 'root' ]]; then
|
|
local -r s3_target_path="s3://${s3_bucket_name}"
|
|
else
|
|
local -r s3_target_path="s3://${s3_bucket_name}/${s3_full_path}"
|
|
fi
|
|
|
|
echo_red_text "Pushing ${push_file} to S3..."
|
|
source "${IRONFOX_PYENV}"
|
|
"${IRONFOX_S3CMD}" ${IRONFOX_S3CMD_FLAGS} --mime-type="${mime_type}" put "${push_file}" "${s3_target_path}" \
|
|
--access_key="${s3_access_key}" \
|
|
--secret_key="${s3_secret_key}" \
|
|
--host="${s3_endpoint}" \
|
|
--host-bucket="${s3_endpoint}"
|
|
echo_green_text "SUCCESS: Pushed ${push_file} to S3"
|
|
}
|
|
|
|
function add_sha512sum() {
|
|
local -r sha512sum_file_in="$1"
|
|
local -r sha512sum_file_name=$("${IRONFOX_BASENAME}" "${sha512sum_file_in}")
|
|
local -r sha512sum_file_path=$("${IRONFOX_DIRNAME}" "${sha512sum_file_in}")
|
|
|
|
if [[ -z "${2+x}" ]]; then
|
|
local -r sha512sum_s3path=$("${IRONFOX_BASENAME}" "${sha512sum_file_path}" | "${IRONFOX_AWK}" '{print tolower($0)}')
|
|
else
|
|
local -r sha512sum_s3path="$2"
|
|
fi
|
|
|
|
local -r 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
|
|
"${IRONFOX_RM}" -f "${sha512sum_file_out}"
|
|
fi
|
|
|
|
local -r local_sha512sum=$("${IRONFOX_SHA512SUM}" "${sha512sum_file_in}" | "${IRONFOX_AWK}" '{print $1}')
|
|
echo -n "${local_sha512sum}" > "${sha512sum_file_out}"
|
|
|
|
push_to_s3 "${sha512sum_file_out}" "${sha512sum_s3path}"
|
|
}
|
|
|
|
# Extract compressed artifacts
|
|
#"${IRONFOX_MKDIR}" -p "${IRONFOX_ARTIFACTS}"
|
|
#for archive in "${IRONFOX_ARTIFACTS}"/*.tar.xz; do
|
|
# [[ -f "${archive}" ]] || continue
|
|
# echo "Extracting ${archive}"
|
|
# "${IRONFOX_TAR}" xvJf "${archive}" -C "${IRONFOX_ARTIFACTS}"
|
|
#done
|
|
|
|
"${IRONFOX_MKDIR}" -vp "${IRONFOX_BUILD}"
|
|
|
|
readonly RELEASE_NOTES_FILE="${IRONFOX_BUILD}/release-notes.md"
|
|
readonly CHECKSUMS_FILE="${IRONFOX_BUILD}/asset-checksums.txt"
|
|
readonly RELEASE_FILE="${IRONFOX_BUILD}/release.yml"
|
|
|
|
echo -n "" > "${RELEASE_NOTES_FILE}"
|
|
echo -n "" > "${CHECKSUMS_FILE}"
|
|
|
|
declare -a assets
|
|
function upload_asset() {
|
|
local -r asset_package_name="$1"
|
|
local -r asset_s3_path="$2"
|
|
local -r asset_file="$3"
|
|
local -r asset_file_name="$("${IRONFOX_BASENAME}" "${asset_file}")"
|
|
|
|
echo "\`${asset_file_name}\`: " >> "${CHECKSUMS_FILE}"
|
|
echo "\`\`\`text" >> "${CHECKSUMS_FILE}"
|
|
"${IRONFOX_SHA512SUM}" -b "${asset_file}" | "${IRONFOX_CUT}" -d ' ' -f 1 >> "${CHECKSUMS_FILE}"
|
|
echo "\`\`\`" >> "${CHECKSUMS_FILE}"
|
|
echo '' >> "${CHECKSUMS_FILE}"
|
|
upload_to_package_registry "${asset_file}" "${asset_package_name}"
|
|
push_to_s3 "${asset_file}" "${asset_s3_path}"
|
|
add_sha512sum "${asset_file}" "${asset_s3_path}"
|
|
}
|
|
|
|
function upload_apk_arm64() {
|
|
upload_asset 'apk' "ironfox/releases/${IRONFOX_VERSION}/arm64-v8a" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-arm64-v8a.apk"
|
|
local -r arm64_file_name="$("${IRONFOX_BASENAME}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-arm64-v8a.apk")"
|
|
assets+=("{\"name\": \"${arm64_file_name}\",\"url\": \"https://releases.ironfoxoss.org/ironfox/releases/${IRONFOX_VERSION}/arm64-v8a/${arm64_file_name}\",\"link_type\": \"package\",\"direct_asset_path\": \"/${arm64_file_name}\"}")
|
|
}
|
|
|
|
function upload_apk_arm() {
|
|
upload_asset 'apk' "ironfox/releases/${IRONFOX_VERSION}/armeabi-v7a" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-armeabi-v7a.apk"
|
|
local -r arm_file_name="$("${IRONFOX_BASENAME}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-armeabi-v7a.apk")"
|
|
assets+=("{\"name\": \"${arm_file_name}\",\"url\": \"https://releases.ironfoxoss.org/ironfox/releases/${IRONFOX_VERSION}/armeabi-v7a/${arm_file_name}\",\"link_type\": \"package\",\"direct_asset_path\": \"/${arm_file_name}\"}")
|
|
}
|
|
|
|
function upload_apk_x86_64() {
|
|
upload_asset 'apk' "ironfox/releases/${IRONFOX_VERSION}/x86_64" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-x86_64.apk"
|
|
local -r x86_64_file_name="$("${IRONFOX_BASENAME}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-x86_64.apk")"
|
|
assets+=("{\"name\": \"${x86_64_file_name}\",\"url\": \"https://releases.ironfoxoss.org/ironfox/releases/${IRONFOX_VERSION}/x86_64/${x86_64_file_name}\",\"link_type\": \"package\",\"direct_asset_path\": \"/${x86_64_file_name}\"}")
|
|
}
|
|
|
|
function upload_apk_universal() {
|
|
upload_asset 'apk' "ironfox/releases/${IRONFOX_VERSION}/universal" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-universal.apk"
|
|
local -r universal_file_name="$("${IRONFOX_BASENAME}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-universal.apk")"
|
|
assets+=("{\"name\": \"${universal_file_name}\",\"url\": \"https://releases.ironfoxoss.org/ironfox/releases/${IRONFOX_VERSION}/universal/${universal_file_name}\",\"link_type\": \"package\",\"direct_asset_path\": \"/${universal_file_name}\"}")
|
|
}
|
|
|
|
function upload_apkset() {
|
|
upload_asset 'apkset' "ironfox/releases/${IRONFOX_VERSION}/bundle" "${IRONFOX_APKS_ARTIFACTS}/ironfox-${IRONFOX_VERSION}.apks"
|
|
local -r bundle_file_name="$("${IRONFOX_BASENAME}" "${IRONFOX_APKS_ARTIFACTS}/ironfox-${IRONFOX_VERSION}.apks")"
|
|
assets+=("{\"name\": \"${bundle_file_name}\",\"url\": \"https://releases.ironfoxoss.org/ironfox/releases/${IRONFOX_VERSION}/bundle/${bundle_file_name}\",\"link_type\": \"package\",\"direct_asset_path\": \"/${bundle_file_name}\"}")
|
|
}
|
|
|
|
# Upload packages to package registry
|
|
upload_apk_arm64
|
|
upload_apk_arm
|
|
upload_apk_x86_64
|
|
upload_apk_universal
|
|
upload_apkset
|
|
|
|
# Update our universal updates.json file
|
|
## (ex. used by Obtainium)
|
|
"${IRONFOX_CP}" -f "${IRONFOX_TEMPLATES}/updates.json" "${IRONFOX_ROOT}/updates.json"
|
|
|
|
readonly IRONFOX_ARM64_SHA512SUM=$("${IRONFOX_SHA512SUM}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-arm64-v8a.apk" | "${IRONFOX_AWK}" '{print $1}')
|
|
readonly IRONFOX_ARM_SHA512SUM=$("${IRONFOX_SHA512SUM}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-armeabi-v7a.apk" | "${IRONFOX_AWK}" '{print $1}')
|
|
readonly IRONFOX_X86_64_SHA512SUM=$("${IRONFOX_SHA512SUM}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-x86_64.apk" | "${IRONFOX_AWK}" '{print $1}')
|
|
readonly IRONFOX_UNIVERSAL_SHA512SUM=$("${IRONFOX_SHA512SUM}" "${IRONFOX_APK_ARTIFACTS}/ironfox-${IRONFOX_VERSION}-universal.apk" | "${IRONFOX_AWK}" '{print $1}')
|
|
readonly IRONFOX_BUNDLE_SHA512SUM=$("${IRONFOX_SHA512SUM}" "${IRONFOX_APKS_ARTIFACTS}/ironfox-${IRONFOX_VERSION}.apks" | "${IRONFOX_AWK}" '{print $1}')
|
|
|
|
"${IRONFOX_SED}" -i "s|{IRONFOX_VERSION}|${IRONFOX_VERSION}|" "${IRONFOX_ROOT}/updates.json"
|
|
"${IRONFOX_SED}" -i "s|ironfox-{IRONFOX_VERSION}|ironfox-${IRONFOX_VERSION}|" "${IRONFOX_ROOT}/updates.json"
|
|
"${IRONFOX_SED}" -i "s|{IRONFOX_ARM64_SHA512SUM}|${IRONFOX_ARM64_SHA512SUM}|" "${IRONFOX_ROOT}/updates.json"
|
|
"${IRONFOX_SED}" -i "s|{IRONFOX_ARM_SHA512SUM}|${IRONFOX_ARM_SHA512SUM}|" "${IRONFOX_ROOT}/updates.json"
|
|
"${IRONFOX_SED}" -i "s|{IRONFOX_X86_64_SHA512SUM}|${IRONFOX_X86_64_SHA512SUM}|" "${IRONFOX_ROOT}/updates.json"
|
|
"${IRONFOX_SED}" -i "s|{IRONFOX_UNIVERSAL_SHA512SUM}|${IRONFOX_UNIVERSAL_SHA512SUM}|" "${IRONFOX_ROOT}/updates.json"
|
|
"${IRONFOX_SED}" -i "s|{IRONFOX_BUNDLE_SHA512SUM}|${IRONFOX_BUNDLE_SHA512SUM}|" "${IRONFOX_ROOT}/updates.json"
|
|
|
|
push_to_s3 "${IRONFOX_ROOT}/updates.json" 'ironfox/releases'
|
|
|
|
# Because we now upload all releases to releases.ironfoxoss.org, we only want to keep the last 3 releases in ex. F-Droid
|
|
## In order to do so, we need to store/upload the current and prior 2 versions of IronFox as text files
|
|
"${IRONFOX_CURL}" ${IRONFOX_CURL_FLAGS} --location 'https://releases.ironfoxoss.org/ironfox/releases/latest_release.txt' --output "${IRONFOX_ROOT}/current-latest_release.txt"
|
|
"${IRONFOX_CURL}" ${IRONFOX_CURL_FLAGS} --location 'https://releases.ironfoxoss.org/ironfox/releases/previous_release.txt' --output "${IRONFOX_ROOT}/current-previous_release.txt"
|
|
|
|
echo -n "${IRONFOX_VERSION}" > "${IRONFOX_ROOT}/latest_release.txt"
|
|
"${IRONFOX_CP}" "${IRONFOX_ROOT}/current-latest_release.txt" "${IRONFOX_ROOT}/previous_release.txt"
|
|
"${IRONFOX_CP}" "${IRONFOX_ROOT}/current-previous_release.txt" "${IRONFOX_ROOT}/previous_previous_release.txt"
|
|
|
|
push_to_s3 "${IRONFOX_ROOT}/latest_release.txt" 'ironfox/releases'
|
|
add_sha512sum "${IRONFOX_ROOT}/latest_release.txt" 'ironfox/releases'
|
|
|
|
push_to_s3 "${IRONFOX_ROOT}/previous_release.txt" 'ironfox/releases'
|
|
add_sha512sum "${IRONFOX_ROOT}/previous_release.txt" 'ironfox/releases'
|
|
|
|
push_to_s3 "${IRONFOX_ROOT}/previous_release.txt" 'ironfox/releases'
|
|
add_sha512sum "${IRONFOX_ROOT}/previous_previous_release.txt" 'ironfox/releases'
|
|
|
|
{
|
|
readonly changelog_file="${IRONFOX_ROOT}/changelogs/${IRONFOX_VERSION}.md"
|
|
if [[ -f "${changelog_file}" ]]; then
|
|
"${IRONFOX_CAT}" "${changelog_file}"
|
|
fi
|
|
|
|
echo "# IronFox ${IRONFOX_VERSION}"
|
|
echo '____'
|
|
echo ''
|
|
|
|
echo '## Changes'
|
|
echo ''
|
|
echo '- '
|
|
echo ''
|
|
|
|
echo '## App Verification'
|
|
echo "To verify the integrity/authenticity of your IronFox installation, in addition to [the checksums](#checksums) provided below, we highly recommend using [\`AppVerifier\`](https://github.com/soupslurpr/AppVerifier):"
|
|
echo ''
|
|
echo "Package ID: \`org.ironfoxoss.ironfox\`"
|
|
echo ''
|
|
echo 'SHA256 hash of signing certificate:'
|
|
echo "\`\`\`text"
|
|
echo 'C5:E2:91:B5:A5:71:F9:C8:CD:9A:97:99:C2:C9:4E:02:EC:97:03:94:88:93:F2:CA:75:6D:67:B9:42:04:F9:04'
|
|
echo "\`\`\`"
|
|
echo ''
|
|
echo '---'
|
|
echo ''
|
|
|
|
echo '## Checksums'
|
|
echo ''
|
|
"${IRONFOX_CAT}" ${CHECKSUMS_FILE}
|
|
echo ''
|
|
|
|
echo '---'
|
|
echo "_This release was automatically generated by the CI/CD pipeline ([view pipeline](${CI_JOB_URL})) and is guaranteed to be generated from commit [${CI_COMMIT_SHORT_SHA}](${CI_PROJECT_URL}/-/tree/${CI_COMMIT_SHA})._"
|
|
echo ''
|
|
} >> "${RELEASE_NOTES_FILE}"
|
|
|
|
{
|
|
echo "---"
|
|
echo "name: IronFox v${IRONFOX_VERSION}"
|
|
echo "tag-name: v${IRONFOX_VERSION}"
|
|
echo "description: |"
|
|
"${IRONFOX_AWK}" '{print " " $0}' < "${RELEASE_NOTES_FILE}"
|
|
echo "assets-link:"
|
|
for asset in "${assets[@]}"; do
|
|
echo " - '${asset}'"
|
|
done
|
|
} > "${RELEASE_FILE}"
|