java - 在 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 还是我做错了什么?
解决方案
另一个答案也表明了这一点,但只是为了澄清:
- CodeBuild(在 buildspec.yml 中指定)创建工件。简单地说,它需要您的代码并创建 jar。您在此处定义了 java 版本。但是,这与您将部署它的实例无关。这是构建发生的图像。
- CodeDeploy(在 appspec.yml 中指定)负责在您定义和拥有的实例上部署工件。如果您手动创建了目标实例,则需要在那里使 java 可用。正如上面的 matesio 建议的那样,您可以使用适当的 java env 简化/自动化实例创建,但这是您的责任,因为那是您的实例(不像 AWS 在后台配置的用于构建的 env)
推荐阅读
- python - Python 无法在同一目录中导入两个相同的类之一
- http - 如何让 Jenkins 可以通过主机名访问?
- c# - 如何过滤 Mongodb 特定文档的子文档
- git - 我可以忽略主分支中的文件,但不能忽略子分支和子分支中的文件吗?
- javascript - 从 JSON 中获取键名和值名并在 Highcharts 中使用
- javascript - optionLabel 文本最初不显示 / kendodropdownlist
- python-3.x - 已安装制表模块时如何解决ModuleNotFoundError(python3制表模块)?
- azure - Azure AD B2C 为什么在密码重置时添加显示控件时继续按钮不起作用?
- python - 如何提高我的 python 程序的速度
- php - 使用 json_encoded 表单数据创建动态插入语句的正确方法