GAE/Go (+ dep)를 gcloud 명령없이 CI에 배포

GAE(Google App Engine) 앱을 배포할 때는 일반적으로 gcloud app deploy 명령 사용

dep를 사용하면 gcloud deploy 할 수 없습니까?



그러나 GAE/Go 조합에서 dep을 사용하면 다음과 같은 오류로 배포하지 못했습니다.
Updating service [default]...failed.
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
2018/01/28 01:49:22 go-app-builder: Failed parsing input: package "path/to/project/vendor/google.golang.org/appengine/urlfetch" cannot import internal package "google.golang.org/appengine/internal/urlfetch"

이미 이 오류는 다음 기사에서 다루었습니다.
  • gcloud app deploy에서 cannot import internal package 오류

  • 불행히도 아직 수정되지 않은 것 같습니다.

    그래서, 이 문제의 이슈 에 올라 있던 「오래된 goapp 를 사용하는 방법」을 시험해 보겠습니다.

    goapp deploy 명령 사용



    다음 페이지에서 goapp 명령이 포함된 이전 sdk를 설치할 수 있습니다.

    설치가 완료되면 보통 goapp deploy 명령을 치면됩니다.
    $ goapp deploy -application <PROJECT_ID> -version <VERSION> path/to/app.yaml
    

    이제 배포에 성공! 해결! …라고 생각했지만 CI에서 자동 배포하려고 할 때 문제가 발생했습니다.
    goapp 명령은 gcloud 명령의 인증 토큰을 읽지 않으므로 인증을 통과하지 못하고 CI에서 자동 배포 할 수 없다는 것이 었습니다.

    CI의 출력을 보면, "브라우저를 열고 인증해라"라는 메시지로 완전히 정지되어 버렸습니다.
    $ gcloud auth activate-service-account --key-file path/to/secret.json
    $ goapp deploy -application *** -version master
    Activated service account credentials for: [***@***.iam.gserviceaccount.com]
    Updated property [core/project].
    08:47 AM Host: appengine.google.com
    08:47 AM Application: *** (was: None); version: master (was: None)
    08:47 AM Starting update of app: ***, version: master
    08:47 AM Getting current resource limits.
    Your browser has been opened to visit:
    
        https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.admin+https%3A%2F%2Fwww.googleapis.com%2Fauth......
    
    If your browser is on a different machine then exit and re-run this
    application with the command-line parameter 
    
      --noauth_local_webserver
    
    Too long with no output (exceeded 10m0s)
    

    appcfg.py update 명령 사용


    goapp 명령에는 인증 토큰을 명령으로 설정하는 옵션이 없으므로 goapp가 내부적으로 호출하는 appcfg.py 명령을 사용합니다.

    이 명령은 인증 토큰을 직접 지정할 수 있는 옵션 --oauth2_access_token 가 있으므로 거기에 gcloud auth print-access-token 를 사용하여 gcloud 명령 측에서 인증한 토큰을 가져오는 방법입니다.
    $ appcfg.py update --application=<PROJECT_ID> --version=<VERSION> --oauth2_access_token=$(gcloud auth print-access-token 2> /dev/null) path/to/app.yaml
    

    이것으로 무사히 CI로부터의 배포에 성공했습니다! (⌒▽⌒)


    $ appcfg.py update --application=*** --version=master --oauth2_access_token=$(gcloud auth print-access-token 2> /dev/null) path/to/app.yaml
    Activated service account credentials for: [***@***.iam.gserviceaccount.com]
    Updated property [core/project].
    09:35 AM Host: appengine.google.com
    09:35 AM Application: *** (was: None); version: master (was: None)
    09:35 AM Starting update of app: ***, version: master
    
    ...
    
    09:35 AM Starting deployment.
    09:35 AM Checking if deployment succeeded.
    09:35 AM Deployment successful.
    09:35 AM Checking if updated app version is serving.
    09:36 AM Completed update of app: ***, version: master
    

    좋은 웹페이지 즐겨찾기