apk/ipa를 명령줄에서 UnityCloudBuild로 업그레이드

※19/07/12 추가
언젠가 바뀌어 무료라도 할 수 있다 공식

※19/06/26 추가
2018년 1월 정도부터 UnityCloudBuild, 유료화했군요(Advanced·Pro만)
몰랐습니다… 공식

※이 기사를 쓰고 있는 도중(2019/4/17)에 문득 구그면 작년 10월 공식 에…

그건 그렇고, 2017년 12월 15일에

Unity Cloud Build가 로컬 환경에서 만든 빌드 아티팩트를 업로드할 수 있습니다.

기사를 보았습니다.

그러나 웹에서가 아니라 CLI에서 업로드하고 싶습니다.
분명 누군가가 좋은 기사를 쓰는 것은 ...라고 생각했지만
놀랄 정도로 간단한 DeployGate 1가있는 탓인지,
혹시 애초에 관심이 없는지 기다려도 살지만 발견되지 않는다 2
CloudBuild 페이지 당을 보면 API 문서 발견

CloudBuild API Document(v1.0.0 시점)
h tps://부이 ld-아피. cぉd. 글쎄, ty3d. 코m/

 좋아 만들어 볼까!

 … 과연, 전혀 모르겠다

전에는 가지 않았다.
ChromeDeveloper에서 거동과 로그를 쫓아 어떻게든 할 수있었습니다 3
얼마나 많은 사람들이 사용하는지 모르겠지만 우선 공개

전제


  • 내 환경 : MacOSX10.14.4 (iMac4K)
  • 아티팩트는 apk/ipa 만 업로드 확인했습니다

  • unity DashBoard
    에서 앱명 등록까지 끝난 것으로 합니다
  • bash 쉘 스크립트에서 순서대로 설명
  • json 분석에 jq 사용
  • 대체에 gsed 사용
  • curl 등, 여러가지 잘못되면 죄송합니다…
  • 이므로 최소한만 기재

  • 아래 스쿠쇼의 문자열은 예이므로 DashBoard 바라보고 메모하십시오.
    PROJECT_ID (여기에서는 Test)와 UPID (여기에서는 3dc ...) 메모

    Test 아래의 ORG_ID (여기서는 developer ...) 메모

    아티팩트 파일 이름은 아스키 코드 0x20 ~ 0x40 근처를 사용하면
    %20에서 %40으로 변환하세요(URLEncode?)

    초기 설정


    API_KEY= #DashBoard - プロジェクト - Develop - Settings - Cloud Build - APIキーに書いてある
    PROJECT_ID= #DashBoard - プロジェクト名
    ORG_ID= #DashBoard - プロジェクト名の下に書いてある
    UP_ID= #DashBoard - プロジェクト - プロジェクト名の横に書いてあるUPID
    FILE_NAME= #成果物ファイル名 xxxx.ipa 等をURLEncode
    EXT= #成果物の拡張子(つまりapkかipa)
    
    FILE_SIZE= #成果物のファイルサイズ `wc -c < 成果物ファイル名` とか
    
    if [ "${EXT}" = "apk" ]; then
        PLATFORM=android
        TYPE_NAME=".APK file"
        TYPE_NAMEe=".APK%20file"
    elif [ "${EXT}" = "ipa" ]; then
        PLATFORM=ios
        TYPE_NAME=".IPA file"
        TYPE_NAMEe=".IPA%20file"
    else
        exit 1
    fi
    
    BUILD_API_DOMAIN="https://build-api.cloud.unity3d.com/api/v1"
    ARTIFACT_API_DOMAIN="https://build-artifact-api.cloud.unity3d.com/api/v1"
    BUILD_TARGET_ID="_local"
    LOG=`mktemp --tmpdir=./`
    
    function endJob {
        echo $1
        rm ${LOG}
    }
    

    빌드 영역 생성 및 빌드 번호 획득


    curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic ${API_KEY}" --data-binary "{\"platform\": \"${PLATFORM}\", \"label\": \"${COMMENT}\"}" ${BUILD_API_DOMAIN}/orgs/${ORG_ID}/projects/${PROJECT_ID}/buildtargets/${BUILD_TARGET_ID}/builds -o ${LOG} -s
    BUILD_NO=`cat ${LOG} | jq .[0].build`
    STAT=`cat ${LOG} | jq .[0].buildStatus`
    if [ "${STAT}" != "\"success\"" ]; then
        endJob "BuildArea - Error: ${STAT}"
        exit 1
    fi
    

    아티팩트 생성


    curl -X POST -H "Content-Type: application/json" -H "Authorization: Basic ${API_KEY}" --data-binary "{\"name\":\"${TYPE_NAME}\",\"primary\":true,\"public\":false,\"files\":[{\"filename\":\"${FILE_NAME}\",\"size\":${FILE_SIZE}}]}" ${ARTIFACT_API_DOMAIN}/projects/${UP_ID}/buildtargets/${BUILD_TARGET_ID}/builds/${BUILD_NO}/artifacts -o ${LOG} -s
    STAT=`cat ${LOG}`
    if [ "${STAT}" != "Created" ]; then
        endJob "Generate Artifact - Error: ${STAT}"
        exit 1
    fi
    

    업로드


    hc=$( curl -d "" -X POST -H "Upload-Length: ${FILE_SIZE}" -H 'Tus-Resumable: 1.0.0' -H 'Content-Type: application/offset+octet-stream' -H "Authorization: Basic ${API_KEY}" ${ARTIFACT_API_DOMAIN}/projects/${UP_ID}/buildtargets/${BUILD_TARGET_ID}/builds/${BUILD_NO}/artifacts/${TYPE_NAMEe}/upload/${FILE_NAME} -o ${LOG} -w '%{http_code}\n' -s )
    if [ $hc != 201 ]; then
        STAT=`cat ${LOG}`
        endJob "Upload Post - Error: $hc\n${STAT}"
        exit 1
    fi
    
    hc=$( curl -X PATCH -H 'Upload-Offset: 0' -H "Content-Length: ${FILE_SIZE}" -H 'Tus-Resumable: 1.0.0' -H 'Content-Type: application/offset+octet-stream' -H "Authorization: Basic ${API_KEY}" --data-binary @"${1}" ${ARTIFACT_API_DOMAIN}/projects/${UP_ID}/buildtargets/${BUILD_TARGET_ID}/builds/${BUILD_NO}/artifacts/${TYPE_NAMEe}/upload/${FILE_NAME} -o ${LOG} -w '%{http_code}\n' -s)
    if [ $hc != 204 ]; then
        STAT=`cat ${LOG}`
        endJob "Upload Patch - Error: $hc\n${STAT}"
        exit 1
    fi
    

    공유 링크 만들기


    # GET:既に生成済みのShareID取得、POST:ShareID生成、DELETE:ShareID削除
    curl -d "" -X POST -H "Content-Type: application/json" -H "Authorization: Basic ${API_KEY}" ${BUILD_API_DOMAIN}/orgs/${ORG_ID}/projects/${PROJECT_ID}/buildtargets/${BUILD_TARGET_ID}/builds/${BUILD_NO}/share -o ${LOG} -s
    STAT=`cat ${LOG} | jq .shareid | gsed 's/"//g'`
    if [ "${STAT}" == "null" ]; then
        cat ${LOG}
        endJob "ShareLink - failed"
        exit 1
    fi
    
    SHARE_URL="https://developer.cloud.unity3d.com/share/${STAT}"
    
    #ここらへんで SHARE_URL をチャット等に送る
    
    endJob "success"
    

    완성된 SHARE_URL을 채팅이나 메일 등에 흘리면 OK인가.
    Android, iOS에서 다운로드, 설치, 실행할 수 있었습니다.

    모두 행복해 ~ ~

    규약 위반이라면 기사 지웁니다 ....



    iOS만이라면 TestFlight, apk만이라면 GooglePlay 테스트 전송이라고 할지도 모르겠네요

    (1주일 기다렸을 뿐입니다만) 

    실제로 만든 것은 2017년 12월 28일. 1년 이상 자고 있었습니다. 

    좋은 웹페이지 즐겨찾기