首页 > 解决方案 > 在 CodeDeploy 中访问 CodeBuild 运行时

问题描述

我正在用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 还是我做错了什么?

标签: javaamazon-web-servicesaws-code-deployaws-codebuild

解决方案


另一个答案也表明了这一点,但只是为了澄清:

  • CodeBuild(在 buildspec.yml 中指定)创建工件。简单地说,它需要您的代码并创建 jar。您在此处定义了 java 版本。但是,这与您将部署它的实例无关。这是构建发生的图像。
  • CodeDeploy(在 appspec.yml 中指定)负责在您定义和拥有的实例上部署工件。如果您手动创建了目标实例,则需要在那里使 java 可用。正如上面的 matesio 建议的那样,您可以使用适当的 java env 简化/自动化实例创建,但这是您的责任,因为那是您的实例(不像 AWS 在后台配置的用于构建的 env)

推荐阅读