облачные литейные копии копируют маршруты из одного приложения в другое - PullRequest
0 голосов
/ 31 августа 2018

Cloud Foundry: можно ли скопировать недостающие маршруты из одного приложения в другое при выполнении развертывания сине-зеленого цвета?

У меня есть приложение с несколькими добавленными вручную маршрутами, в то время как я выполняю развертывание сине-зеленого цвета (автоматизировано с помощью сценария). Я хочу скопировать отсутствующие / добавленные вручную маршруты в новое приложение. Возможно ли это?

Сценарий:

#!/bin/bash

path="C:/Users/.../Desktop/cf_through_sh/appName.jar"

spaceName="development"
appBlue="appName"
appGreen="${appName}-dev"
manifestFile="C:/Users/.../Desktop/cf_through_sh/manifest-dev.yml"
domains=("domain1.com" "domain2.com")
appHosts=("host-v1" "host-v2")

evaluate_return_code (){
  ret=$1
  if [[ $ret != 0 ]]
  then
    exit $ret
  fi
}

switch_to_target_space() {
    space="development"
    echo "Change space to ${space}"
    cf t -s ${space}
    evaluate_return_code $?
}

push_new_release() {
    appGreen=$1
    if [ ! -f "${manifestFile}" ]; then
        echo "Missing manifest: ${manifestFile}";
        exit 1;
    fi

    if [ ! -f "${path}" ]; then
        echo "Missing artifact: ${path}";
        exit 1;
    fi
    echo "Deploying ${path} as ${appGreen}"
    cf push ${appGreen} -f ${manifestFile} -p ${path} --no-route
    evaluate_return_code $?
}

map_routes() {
    app=$1
    domains=$2
    shift
    appHosts=$3

    for  host in  ${appHosts[*]}; do
        echo "Mapping ${host} to ${app}"
        for  domain in  ${domains[*]}; do
            cf map-route ${app} ${domain} -n ${host}
            evaluate_return_code $?
        done
    done
}


unmap_routes() {
    app=$1
    domains=$2
    shift
    appHosts=$3

    for  host in  ${appHosts[*]}; do
        echo "Unmapping ${host} from ${app}"
        for  domain in  ${domains[*]}; do
            cf unmap-route ${app} ${domain} -n ${host}
        evaluate_return_code $?
        done
    done
}

rename_app() {
    oldName=$1
    newName=$2
    echo "Renaming ${oldName} to ${newName}"
    cf rename ${oldName} ${newName}
    evaluate_return_code $?
}

switch_names() {
    appBlue=$1
    appGreen=$2
    appTemp="${appBlue}-old"
    rename_app ${appBlue} ${appTemp}
    rename_app ${appGreen} ${appBlue}
    rename_app ${appTemp} ${appGreen}
}

stop_old_release() {
    echo "Stopping old ${appGreen} app"
    cf stop ${appGreen}
    evaluate_return_code $?
}

switch_to_target_space ${spaceName}
push_new_release ${appGreen}
map_routes ${appGreen} ${domains[*]} ${appHosts[*]}
unmap_routes ${appBlue} ${domains[*]} ${appHosts[*]}
switch_names ${appBlue} ${appGreen}
stop_old_release

echo "DONE"
exit 0;

Например: appblue имеет 5 маршрутов

 1. host-v1.domain1.com
 2. host-v2.domain1.com
 3. host-v1.domain2.com
 4. host-v2.domain2.com
 5. manual-add.domain1.com //manually added route through admin UI

После сине-зеленого развертывания через скрипт приложение содержит только 4 маршрута

 1. host-v1.domain1.com
 2. host-v2.domain1.com
 3. host-v1.domain2.com
 4. host-v2.domain2.com

Как скопировать недостающий 5-й маршрут? Я не хочу передавать хост вручную-добавить из скрипта, поскольку он добавлен вручную.

В общем, возможно ли копировать маршруты из одного приложения в другое, если они не сопоставлены?

1 Ответ

0 голосов
/ 03 сентября 2018

Это должно быть сделано только через Jenkins (или любой инструмент CI-CD). В нашем случае у нас были CF-Manifest-Template.yml и CF-Manifest-settings.json, и у нас была задача gradle, которая применяла бы настройки из JSON и заполняла храм Manifest и генерировала cf-manifest-generated.yml

В файле Gradle будет задание, которое будет выполнять сине-зеленое развертывание с использованием этого сгенерированного файла манифеста, и все маршруты будут жестко заданы в файле манифеста. Это стандартный способ сделать это.

Но если вы хотите скопировать маршрут из приложения, запущенного в Cloud Foundry, и скопировать его маршруты в другое приложение, вам нужно написать REST Client, который подключается к Cloud Foundry CloudController и получает весь маршрут App-A, а затем создает маршруты к APP-B

Это довольно просто !!

Написать клиент REST, который выполняет эту команду

см. Приложение APP-A

Это вернет детали APP-A в качестве ответа JSON. Ответ будет иметь эти параметры

Showing health and status for app APP-A in org Org-A / space DEV as arun2381985@yahoo.com...

name:              APP-A
requested state:   started
instances:         1/1
usage:             1G x 1 instances
routes:            ********
last uploaded:     Sat 25 Aug 00:25:45 IST 2018
stack:             cflinuxfs2
buildpack:         java_buildpack

Прочитайте этот ответ JSON и соберите маршруты APP-A, а затем сопоставьте их с APP-B. Это довольно просто

...