Xcode Cloud

You can use the fastlane action or HTTP API to upload builds as part of an Xcode Cloud workflow.

Here is an example of a script you can use to upload. This file would be in ci_scripts/ci_post_xcodebuild.sh In this example the repo_name variable needs to be replaced with the name of your repo.

#!/bin/sh

set -e

if [[ -z "${CI_ARCHIVE_PATH}" ]]; then
    echo "No CI_ARCHIVE_PATH set, skipping Emerge upload"
else
    required_env_vars=(
        "CI_ARCHIVE_PATH"
        "EMERGE_API_KEY"
        "CI_BRANCH"
        "CI_COMMIT"
    )

    for var in "${required_env_vars[@]}"; do
        if [[ -z "${!var}" ]]; then
            echo "Environment variable $var is not set"
            exit 1
        fi
    done

    if ! command -v jq &> /dev/null; then
        echo "jq could not be found. Please install it to proceed."
        exit 1
    fi

    zip_path="$CI_ARCHIVE_PATH.zip"
    pushd $(dirname $CI_ARCHIVE_PATH)
    zip -r "$(basename $zip_path)" "$(basename $CI_ARCHIVE_PATH)"
    popd

    # Update this with your repo
    repo_name='MyOrg/MyRepo'

    if [[ "$CI_XCODE_SCHEME" == "My Debug Archive Scheme" ]]; then
        build_type='debug'
    else
        build_type='release'
    fi

    json_fields=$(cat <<EOF
"filename":"${zip_path}",
"branch":"${CI_BRANCH}",
"sha":"${CI_COMMIT}",
"repoName":"${repo_name}",
"buildType":"${build_type}"
EOF
    )

    if [[ -z "${CI_PULL_REQUEST_NUMBER}" ]]; then
        echo "Not a pull request, omitting pull request JSON fields"
    else
        required_env_vars=(
            "CI_PULL_REQUEST_NUMBER"
            "CI_PULL_REQUEST_TARGET_COMMIT"
        )

        for var in "${required_env_vars[@]}"; do
            if [[ -z "${!var}" ]]; then
                echo "Environment variable $var is not set"
                exit 1
            fi
        done

        json_fields=$(cat <<EOF
${json_fields},
"prNumber":"${CI_PULL_REQUEST_NUMBER}",
"baseSha":"${CI_PULL_REQUEST_TARGET_COMMIT}"
EOF
        )
    fi

    upload_response=$(curl \
        --url "https://api.emergetools.com/upload" \
        --header 'Accept: application/json' \
        --header 'Content-Type: application/json' \
        --header "X-API-Token: $EMERGE_API_KEY" \
        --data "{$json_fields}")

    # Pull the uploadURL field from the response using jq
    upload_url=$(echo "$upload_response" | jq -r .uploadURL)

    curl -v -H 'Content-Type: application/zip' -T "$zip_path" "$upload_url"
fi