2015-02-08 96 views
0

我在Google Compute Engine中設置了一個Jenkins實例,用於在this page from Google之後構建和部署App Engine Java項目。Jenkins gcloud部署導致ImportError

我已經配置詹金斯運行以下shell命令只有在Maven構建成功:gcloud --project=decent-ellipse-843 preview app deploy target/*-SNAPSHOT/

當我嘗試構建,部署失敗與以下跟蹤:

+ gcloud --project=decent-ellipse-843 preview app deploy target/backend-api-0.0.1-SNAPSHOT/ 
Traceback (most recent call last): 
    File "/usr/local/bin/../share/google/google-cloud-sdk/./lib/googlecloudsdk/gcloud/gcloud.py", line 183, in <module> 
    main() 
    File "/usr/local/bin/../share/google/google-cloud-sdk/./lib/googlecloudsdk/gcloud/gcloud.py", line 179, in main 
    _cli.Execute() 
    File "/usr/local/bin/../share/google/google-cloud-sdk/./lib/googlecloudsdk/calliope/cli.py", line 488, in Execute 
    post_run_hooks=self.__post_run_hooks) 
    File "/usr/local/bin/../share/google/google-cloud-sdk/./lib/googlecloudsdk/calliope/backend.py", line 1016, in Run 
    result = command_instance.Run(args) 
    File "/usr/local/bin/../share/google/google-cloud-sdk/./lib/googlecloudsdk/calliope/exceptions.py", line 86, in TryFunc 
    return func(*args, **kwargs) 
    File "/usr/local/share/google/google-cloud-sdk/lib/googlecloudsdk/appengine/app_commands/deploy.py", line 158, in Run 
    stage_dir = self.__MakeStagingDir(project, args, deployable) 
    File "/usr/local/share/google/google-cloud-sdk/lib/googlecloudsdk/appengine/app_commands/deploy.py", line 268, in __MakeStagingDir 
    java_app_update = appcfg_java.JavaAppUpdate(deployable, args) 
    File "/usr/local/share/google/google-cloud-sdk/platform/google_appengine/google/appengine/tools/appcfg_java.py", line 146, in __init__ 
    self.app_engine_web_xml = self._ReadAppEngineWebXml() 
    File "/usr/local/share/google/google-cloud-sdk/platform/google_appengine/google/appengine/tools/appcfg_java.py", line 205, in _ReadAppEngineWebXml 
    parser=app_engine_web_xml_parser.AppEngineWebXmlParser) 
    File "/usr/local/share/google/google-cloud-sdk/platform/google_appengine/google/appengine/tools/appcfg_java.py", line 217, in _ReadAndParseXml 
    return parser().ProcessXml(file_handle.read()) 
    File "/usr/local/share/google/google-cloud-sdk/platform/google_appengine/google/appengine/tools/app_engine_web_xml_parser.py", line 71, in ProcessXml 
    xml_root = ElementTree.fromstring(xml_str) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1300, in XML 
    parser = XMLParser(target=TreeBuilder()) 
    File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1466, in __init__ 
    "No module named expat; use SimpleXMLTreeBuilder instead" 
ImportError: No module named expat; use SimpleXMLTreeBuilder instead 
Build step 'Execute shell' marked build as failure 
Finished: FAILURE 

行家構建是成功的,我可以通過手動發佈gcloud命令來部署項目。

即使我在相同的目錄下並在同一用戶(tomcat)下運行完全相同的gcloud命令,部署也會成功完成而不會出錯。

我重新安裝了python並更新了Google Cloud SDK,沒有任何結果。

該實例運行Python 2.7.3,Jenkins 1.598,JDK 7u76和Maven 3.2.2。

我希望有人能幫助我這個!

+0

你從Jenkins和命令行發出命令時檢查環境之間的差異嗎?由於gcloud是一個python實用程序,因此在這兩種情況下檢查python解釋器環境可能會很有用。 – Antxon 2015-02-10 16:30:39

+0

我檢查了shell可執行文件(/ bin/sh),用戶,工作目錄和python版本。它們都與我在命令行上做的相符。 – 2015-02-10 17:08:38

+0

也檢查環境變量(shell env輸出命令)。看起來jenkins batched python解釋器無法在您的系統上找到expat軟件包。這很可能是由於登錄和登錄shell的環境初始化不同所致。 – Antxon 2015-02-10 20:03:50

回答

0

我遇到了類似的問題,在cloud-dev-python slave上運行我的作業。這些圖像缺少構建工具,您可能需要這些工具才能正確構建和部署。我的解決方案是連接到Docker鏡像,並在第一時間手動安裝這些工具。

# on docker host, connect to java image 
CONTAINER_ID=$(docker ps | grep cloud-dev-java | awk '{print $1}'); 
docker exec -i -t $CONTAINER_ID bash 

# on docker image, install crap to build lxml, etc 
gcloud -q components update preview app && apt-get update \ 
    && apt-get install -y build-essential libz-dev libxml2-dev \ 
    libxslt1-dev python-dev python-pip && apt-get autoremove 

給一個旋轉,看看是否有幫助。我目前仍然堅持服務帳戶不認證,即使它設置正確...