0

将战争文件上传到暂存环境时遇到错误。编写了一个使用 eb cli 将工件部署到环境的 shell 脚本。

config.yml 看起来像这样:

branch-defaults:
  default:
    environment: testseries-stag-env
deploy:
  artifact: temp/servercp/testseries/testseries-service/target/testseries-service-1.0.0.war
environment-defaults:
  testseries-stag-env:
    branch: null
    repository: null
global:
  application_name: testseries
  default_ec2_keyname: testseries-stag
  default_platform: arn:aws:elasticbeanstalk:us-east-1::platform/Tomcat 8 with Java
    8 running on 64bit Amazon Linux/2.7.5
  default_region: us-east-1
  instance_profile: null
  platform_name: null
  platform_version: null
  profile: null
  sc: null
  workspace_type: Application

build.sh 看起来像这样:

#!/usr/bin/env bash

# Takes a fresh clone of the dependent repositories and installs them locally.
# Deploys test-series to staging env. See .elasticbeanstalk for more details on this
# Access key Id and secret must be configured in the system to use this shell script
# If you have key and secret with you but system is not configured with it, this script will do it for you. You will
# need to provide the values when requested

# This may contain system dependent bugs. Please report any to devops@adda247.com

timestamp() {
  date +"%d-%h_%H:%M:%S"
}

function installHomeBrew()
{
   /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
}

function installEbCliMac()
{
    brew install awsebcli
}

function installEbCliLinux()
{
    pip install --upgrade --user awsebcli
}

function installPip()
{
    curl -O https://bootstrap.pypa.io/get-pip.py
    if [[ -x $(command -v python) ]]; then
        echo "Python found"
        python get-pip.py --user
    else
        if [[ -x $(command -v python3) ]]; then
            echo "Python3 found"
            python3 get-pip.py --user
        else
#           Only valid for nix instances which support python3. Fails on other systems
            echo "Python not found. Installing..."
            sudo apt-get install python3
            python3 get-pip.py --user
        fi
    fi
    echo "Installing pip with python"
    pip install --upgrade --user pip
}

function installAWSCLI()
{
    if [[ ${OSTYPE} == 'linux-gnu' ]]; then
        pip install awscli --upgrade --user
    elif [[ ${OSTYPE} == 'darwin'* ]]; then
        brew install awscli
    fi
}

function ifEnvVariablesExist()
{
    if [[  -z ${AWS_ACCESS_KEY_ID} || -z ${AWS_SECRET_ACCESS_KEY} ]]; then
        echo false
    else
        echo true
    fi
}

function ifConfigExists()
{
    if [[ -e ${HOME}/.aws/credentials ]]; then
        echo true
    else
        echo false
    fi
}

function deployWar()
{
    version_label=testseries-dev-$(timestamp)
    eb deploy --label=${version_label}
}

function credentialsExist()
{
    env_var=$(ifEnvVariablesExist)
    if [[ ${env_var} == true ]]; then
        echo "reading from environment variables"
    else
        config_file=$(ifConfigExists)
        if [[ ${config_file} == true ]]; then
            echo "reading from config file"
        else
            echo "Neither environment variables nor config file found"
            echo "******   Configuring AWS for you. Please enter aws id and secret when prompted  ******"
            aws_exists=$(command -v aws)
            if [[ -x ${aws_exists} ]]; then
                echo "aws cli is present. Configuring"
            else
                echo "aws cli is absent. Installing"
                installAWSCLI
            fi
            aws configure
            if [[ $? -ne 0 ]]; then
                echo "Unsuccessful configuration. Exiting"
                exit $?
            fi
        fi
    fi
}

function proceedForMac()
{
    eb_cli_exists=$(command -v eb)
    if [[ -x ${eb_cli_exists} ]]; then
        echo "eb cli is present"
    else
        echo "eb cli is absent. Installing with HomeBrew"
        brew_exists=$(command -v brew)
        if [[ -x ${brew_exists} ]]; then
            echo "HomeBrew is present"
        else
            echo "HomeBrew is absent. Installing"
            installHomeBrew
        fi
        installEbCliMac
    fi

    credentialsExist
    deployWar
}

function proceedForLinux()
{
    eb_cli_exists=$(command -v eb)
    if [[ -x ${eb_cli_exists} ]]; then
        echo "eb cli is present"
    else
        echo "eb cli is absent. Installing with pip"
        pip_exists=$(command -v pip)
        if [[ -x ${pip_exists} ]]; then
            echo "pip is present"
        else
            echo "pip is absent. Installing"
            installPip
        fi
        export PATH=~/.local/bin:$PATH
        if [ -f ~/.bash_profile ]; then
            source ~/.bash_profile
        fi
        installEbCliLinux
    fi

    credentialsExist
    deployWar
}

WD=$(pwd)
BUILD_DIR=$(pwd)/temp

if [[ -d ${BUILD_DIR} ]]; then
    rm -rf ${BUILD_DIR}
fi

mkdir ${BUILD_DIR}
chmod 777 ${BUILD_DIR}

cd ${BUILD_DIR}
SSH_KEY_PATH=~/.ssh/id_rsa.pub

if [[ -f ${SSH_KEY_PATH} ]]; then
    git clone git@github.com:metiseduventures/servercp.git
else
    git clone https://github.com/metiseduventures/servercp.git
fi


echo "Building servercp"
cd ${BUILD_DIR}/servercp/testseries
git checkout dev
mvn clean install
if [[ $? -ne 0 ]]; then
    echo "Project build unsuccessful. Please correct testseries project in servercp and run again"
    exit $?
fi

echo "Build Successful. Deploying Artifact"
if [[ ${OSTYPE} == 'linux-gnu' ]]; then
    proceedForLinux
elif [[ ${OSTYPE} == 'darwin'* ]]; then
    proceedForMac
fi

eb deploy命令在deployWar失败的地方起作用

文件夹结构是

/--* .elasticbeanstalk/config.yml
   * build.sh

shell脚本克隆临时文件夹内的build.sh存储库并构建成功完成的项目

运行后的控制台输出为:

Build Successful. Deploying Artifact
eb cli is present
reading from config file
ERROR: Application Version does not exist locally 
(temp/servercp/testseries/testseries-service/target/testseries-service- 
1.0.0.war). Try uploading the Application Version again.

不过,temp/servercp/testseries/testseries-service/target/testseries-service-1.0.0.war存在就好。

如果我eb deploy --version-label="my-label"在那之后立即运行,工件就会被部署好。但是,当从脚本内部执行相同的操作时,会出现上述错误。我尝试在 eb deploy 命令之前睡 2 秒,但仍然没有

任何帮助表示赞赏。提前致谢

4

2 回答 2

1

我认为问题是由于您eb deploy(没有--label)发生的位置。使用cd ${BUILD_DIR}/servercp/testseries,您位于项目的深处,而temp/.../*.war是相对于项目根目录的路径。我认为应该解决您的问题cd ${WD}eb deploy

于 2018-07-10T19:51:11.010 回答
0

你的 build.sh 的内容是什么?我想也许你可以sleep 2在真正的部署命令之前休息一下?

于 2018-07-04T11:10:10.133 回答