簡體   English   中英

在 CodeDeploy 中訪問 CodeBuild 運行時

[英]Access CodeBuild Runtime in CodeDeploy

我正在用 java(基於 spring)構建一個簡單的 hello world 應用程序,我通過管道啟動到 AWS。

buildspec.yml 定義如下:

version: 0.2

phases:
  install:
    runtime-versions:
      java: openjdk8
  build:
    commands:
      - mvn package

artifacts:
  files:
    - '**/*'

與 appspec.yml 如下:

version: 0.0
os: linux
files:
  - source: target/helloworld-1.0-SNAPSHOT.jar
    destination: /tmp

hooks:
  ApplicationStart:
    - location: codedeploy/ApplicationStart.sh
      timeout: 60
      runas: root

文件 codedeploy/ApplicationStart.sh:

#!/usr/bin/env bash

JAR_FILE_HOME='/tmp/helloworld-1.0-SNAPSHOT.jar'

java -jar JAR_FILE_HOME

奇怪的是,部署失敗並出現以下錯誤:

指定位置的腳本:以 root 用戶身份運行 codedeploy/ApplicationStart.sh 失敗,退出代碼為 127

輸出日志:

[stderr]/opt/codedeploy-agent/deployment-root/5092b759-ecc4-44cb-859a-9823734abc04/d-GVQ6R854B/deployment-archive/codedeploy/ApplicationStart.sh:第9行:java:找不到命令

這似乎非常違反直覺,因為我已經在 buildspec.yml 中安裝了 java。 我需要在 ApplicationStart 腳本中再次手動安裝 java 還是我做錯了什么?

CodeBuild 沒有與您的應用程序實例的鏈接,而是僅在收到構建事件的工件時創建運行時。

您不需要每次都使用 appspec.yml 安裝 JAVA 運行時。 我建議您在 EC2 實例上安裝 JAVA 運行時,然后創建一個 AMI,作為將來使用的參考基礎映像,或者您可以繼續使用具有預構建環境的 Elasticbeanstalk。

另一個答案也暗示了這一點,但只是為了澄清:

  • CodeBuild(在 buildspec.yml 中指定)執行工件創建。 簡單地說,它需要您的代碼並創建 jar。 您在此處定義了 java 版本。 但是,這與您將部署的實例無關。 這是構建發生的圖像。
  • CodeDeploy(在 appspec.yml 中指定)負責在您定義和擁有的實例上部署工件。 如果您手動創建了目標實例,則需要在那里使 java 可用。 正如 matesio 上面建議的那樣,您可以使用適當的 java env 簡化/自動化實例創建,但這是您的責任,因為那是您的實例(與 AWS 在后台配置的用於構建的 env 不同)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM