对于在IBM Cloud上托管并使用Watson Assistant的节点Cloud Foundry应用程序,我们已经在IBM Cloud的工具链中构建了管道。 我们在工具链的部署阶段遇到了麻烦-使用我们的环境变量调用Assistant API时收到验证错误。
当我们使用相同的环境变量在本地运行应用程序时,一切正常。 我们可以看到在Deploy阶段可以访问在工具链的Setup阶段中定义的环境变量(我们可以使用cf env在Deploy Stage日志中打印它们,并且在IBM Cloud App Runtime UI中设置并显示环境变量),但是部署阶段的应用程序节点运行时无法访问它们(它们是未定义的,从而导致下面显示的日志中出现错误)。
在应用程序文件(节点js)中,我们使用process.env.VARIABLE_NAME访问环境属性。
如果我们在IBM Cloud App中手动设置环境变量,然后从本地终端cf push,则该应用程序也可以正常工作。
请在下面查看设置和部署阶段中使用的bash脚本。 构建阶段成功运行。
日志错误:
[APP/PROC/WEB/0] ERR Error: Insufficient credentials provided in constructor argument. Refer to the documentation for the required parameters. Common examples are username/password and iam_access_token.
[APP/PROC/WEB/0] ERR at AssistantV2.BaseService.initCredentials (/home/vcap/app/node_modules/ibm-cloud-sdk-core/lib/base_service.ts:317:15)
[APP/PROC/WEB/0] ERR at AssistantV2.BaseService (/home/vcap/app/node_modules/ibm-cloud-sdk-core/lib/base_service.ts:153:27)
[APP/PROC/WEB/0] ERR at new AssistantV2 (/home/vcap/app/node_modules/ibm-watson/assistant/v2.ts:51:5)
设置阶段脚本:(在此阶段,环境属性被定义为安全属性。)
#!/bin/bash
cf push "${CF_APP}"
# Set environment variables that will be used after build the app
cf set-env "${CF_APP}" WATSON_ASSISTANT_APIKEY "${WATSON_ASSISTANT_APIKEY}"
cf set-env "${CF_APP}" WATSON_ASSISTANT_WORKSPACE "${WATSON_ASSISTANT_WORKSPACE}"
cf set-env "${CF_APP}" WATSON_ASSISTANT_ASSISTANT_ID "${WATSON_ASSISTANT_ASSISTANT_ID}"
# Restage app to get the new credentials availables
cf restage "${CF_APP}"
部署阶段脚本:(或多或少相当于cf push)
#!/bin/bash
# Push app
if ! cf app $CF_APP; then
cf push $CF_APP
echo "no existing app, so doing fresh push"
else
OLD_CF_APP=${CF_APP}-OLD-$(date +"%s")
rollback() {
set +e
if cf app $OLD_CF_APP; then
cf logs $CF_APP --recent
cf delete $CF_APP -f
cf rename $OLD_CF_APP $CF_APP
fi
exit 1
}
set -e
trap rollback ERR
cf rename $CF_APP $OLD_CF_APP
cf push $CF_APP
cf delete $OLD_CF_APP -f
fi
# Export app name and URL for use in later Pipeline jobs
export CF_APP_NAME="$CF_APP"
export APP_URL=http://$(cf app $CF_APP_NAME | grep -e urls: -e routes: | awk '{print $2}')
# View logs
#cf logs "${CF_APP}" --recent