【问题标题】:Using separate Dockerrun.aws.json files for separate branch deployments with Travis CI通过 Travis CI 使用单独的 Dockerrun.aws.json 文件进行单独的分支部署
【发布时间】:2019-05-16 18:12:12
【问题描述】:

所以我正在尝试设置一个简单的多容器 Elastic Beanstalk 应用程序,该应用程序通过 Travis CI 自动部署。

此外,我在 Elastic Beanstalk 上设置了两个环境,一个生产环境和一个暂存环境,我将 .travis.yml 文件设置为部署到 master 上的生产环境并在 stage 分支上暂存,就像这样:

sudo: required
services:
  - docker
before_install: docker build -t web:ci -f web/Dockerfile.dev web
script: docker run web:ci npm run test -- --coverage
before_deploy:
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_ID" --password-stdin
  - bash .build/image_maker.sh
  - bash .build/environment_initializer.sh
deployments:
  elasticbeanstalkdeploy: &elastic_beanstalk_deploy
    skip_cleanup: true
    provider: elasticbeanstalk
    app: "MySuperCoolApp"
    region: "us-east-2"
    bucket_name: "elasticbeanstalk-us-east-2-012345678910"
    bucket_path: "MySuperCoolApp"
    access_key_id: $ELASTIC_BEANSTALK_ACCESS_KEY
    secret_access_key:
      secure: $ELASTIC_BEANSTALK_SECRET_KEY
deploy:
  - <<: *elastic_beanstalk_deploy
    env: "MySuperCoolApp-ProductionEnv"
    on:
      branch: master
  - <<: *elastic_beanstalk_deploy
    env: "MySuperCoolApp-StagingEnv"
    on:
      branch: stage

您会在构建的“before_deploy”阶段注意到我在两个单独的文件上调用 bash。

第一个是 image_maker.sh,它负责构建 EB 应用所需的所有镜像并将它们推送到 Docker hub。

我不会向您展示 image_maker.sh 文件中的任何代码,因为我确信它正在工作并且与问题无关,但您应该知道它会根据当前推送到的分支来标记图像。

推送到master时,每张图片都会打上production.latest的标签(例如:image_name:production.latest),推送到stage分支时,每张图片都会打上staging.latest的标签(例如:image_name :staging.latest.)

了解这一点很重要,因为它解释了我为什么要尝试执行下一步(这就是我正在努力解决的问题。)

基本上我有两个 Dockerrun.aws.json 文件,每个文件都存储在生产或暂存子目录下的 .build 目录中(所以我在 '.build/production/Dockerrun.aws.json' 有一个文件,另一个在'.build/staging/Dockerrun.aws.json.')

这是基本的文件结构:

root
  .travis.yml
  .build
    image_maker.sh
    environment_initializer.sh
    production
      - Dockerrun.aws.json
    staging 
      - Dockerrun.aws.json

每个 Dockerrun.aws.json 文件之间的唯一区别是它们在容器定义中使用的图像标记,暂存 Dockerrun 文件查找带有 staging.latest 标记的图像,而生产 Dockerrun 文件查找带有标记的图像生产.最新

看起来很简单。

下一步显然是将 Dockerrun 文件移动到根目录,这取决于推送到哪个分支,这样当 Elastic Beanstalk 收到代码时它就知道要做什么了。

这是来自“before_deploy”命令的第二个 bash 脚本的唯一用途:.build/environment_initializer.sh。

代码如下:

#!/bin/bash

if [[ "$TRAVIS_PULL_REQUEST" = false ]]; then

  if [ "$TRAVIS_BRANCH" = 'master' ]; then
    echo Moving production Dockerrun.aws.json to root
    mv ./.build/production/Dockerrun.aws.json ./
  fi

  if [ "$TRAVIS_BRANCH" = 'stage' ]; then
    echo Moving staging Dockerrun.aws.json to root
    mv ./.build/staging/Dockerrun.aws.json ./
  fi

fi

理想情况下,我希望这完全符合我的要求,并且可以无缝地工作。问题是,无论我尝试什么,我总是在 Elastic Beanstalk 日志中收到相同的错误:

No ecs task definition (or empty definition file) found in environment

这基本上意味着传递给 Elastic Beanstalk 的代码没有我在 .build/environment_initializer.sh 中所做的更改,这很糟糕,因为据我了解,在部署命令中使用 skip_cleanup 应该会阻止 Travis从撤消您对代码所做的更改。

我不知道接下来要尝试什么,到目前为止,我已经对上面的代码尝试了大约一千种不同的小调整,包括:

  1. 在 environment_initializer.sh 文件的末尾添加“git stash -all”。
  2. 'mv ./.build/production/Dockerrun.aws.json ./' 的大约一百种变体
  3. 使用 cp 代替 mv。

但无论我做什么,似乎都没有任何效果。所以现在,我把它交给你了。任何帮助将不胜感激!

【问题讨论】:

    标签: travis-ci amazon-elastic-beanstalk


    【解决方案1】:

    原来问题在于 Travis 如何将代码传递给部署命令。 显然,Travis 使用 git 将构建阶段的结果传递给部署阶段。通常,Travis 将通过运行“git stash --all”来清理在构建期间所做的所有代码更改。

    在 .travis.yml 部署部分中设置 skip_cleanup: true 确实阻止 Travis 撤消所有更改(通过跳过 git stash 命令)但是,由于代码仍在通过 git 传递,所有默认情况下,未暂存的文件不会传递给部署。

    考虑到这一点,解决方案很简单:

    添加 'git add .'将文件移动到根目录后,如下所示:

    if [[ "$TRAVIS_PULL_REQUEST" = false ]]; then
    
      if [ "$TRAVIS_BRANCH" = 'master' ]; then
        echo Moving production Dockerrun.aws.json to root
        mv ./.build/production/Dockerrun.aws.json ./
        git add .
      fi
    
      if [ "$TRAVIS_BRANCH" = 'stage' ]; then
        echo Moving staging Dockerrun.aws.json to root
        mv ./.build/staging/Dockerrun.aws.json ./
        git add .
      fi
    
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2019-01-09
      • 2012-02-07
      • 2019-01-26
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多