本教程使用IBM Cloud相关的产品进行APP的容器化部署,其中涉及到的IBM Cloud产品服务包括:
- Container Register:用于储存构建的镜像
- Code Engine:Code Engine拉取Container Register保存的镜像,构建并运行容器
- IBM Devops:在这个服务中新建ToolChain,进行自动化构建交付。
- IBM GitHub:IBM企业git存储仓库,可以选择其他可用的代码存储仓库
IAM API Key生成
- 打开IBM Cloud的网站
- 在网站顶部的选项中,选择管理->访问权
- 在访问权页面左侧,选择API密钥->点击创建IBM Cloud API密钥

- 在弹出的创建密钥窗口中输入名称(描述可选填),点击创建

- 接下来会出现成功创建API密钥的弹窗, 这里一定要注意下提示文字,最好将生成的密钥保存在其他安全的地方,因为关闭当前弹窗,就再也无法看到此密钥了

Container Register名称空间新建
- 点击IBM Cloud网站左上角的导航菜单按钮

- 在弹出的侧边栏列表选择Container Register

- 在Container Register页面点击侧边栏的名称空间,选择位置后,点击创建按钮


CodeEngine项目及访问注册权新建
- 新建项目, 在IBM导航菜单中选择CodeEngine,在CodeEngine页面,点击左侧项目选项

- 点击画面中的创建按钮,创建新项目,输入名称后创建保存


- 创建注册访问权, 为了使CodeEngine的项目可以访问到Container Register上的镜像,需要进一步为项目设置注册访问权

提示 注册服务器:和使用的Container Register名称空间的位置关联的,仔细看一下文字提示 在前一个sheet“ContainerRegister名称空间新建”,我创建了位于东京的项目,所以这里填写的是jp.icr.io 密码:这里的密码不是让用户自定义,填写的是IAM API Key(前面提醒大家保存的API Key) 注册表名称:后续CodeEngine发布容器时需要使用的
IBM Devops工具链创建
提醒:这里我们要使用IBM Devops的工具链来构建镜像,发布容器。请确保:你有ToolChain的编辑以上的权限
- 从IBM导航菜单点击Devops

- 选择位置:东京,点击创建工具链


- 在工具链模版中选择:构建自己的工具链

- 输入工具链名称


- 为新建的工具链添加工具:Github和Delivery Pipeline两个工具, 上面图片,点击添加工具
- 添加Github, 在搜索框中检索Github,如果你有IBM Github的账户,你会发现下面两个工具,否则只有第一个。

- 如果你用的是公开的Github仓库或者其他企业Github仓库,请选择第一个

本教程选用IBM Github进行演示, 存储库类型:现有->输入存储库URL->点击创建集成
提示: 这里特别注意一下:如果你不是存储库的Owner,需要在创建之后,通知真正的Owner再次进入这个工具,修改Owner。否则后面Deliver阶段会报错


- 创建Deliver Pipeline, 在搜索框输入deliver,点击Deliver Pipeline->输入管道名称,点击创建集成


- 添加服务, 添加完集成工具后,你可以看到下面的画面,提示需要Continuous Delivery服务,我们点击提示文字中的“添加服务”进行添加。根据需要选择套餐,点击创建。


对Delivery Pipeline添加并配置阶段
点击上面的Delivery Pipeline,进入如下页面,点击添加阶段,这里我会添加两个阶段
阶段一:将源代码构建为Container Register的镜像
阶段二:CodeEngine拉取ContainerRegister的镜像构建容器

- 阶段一 构建镜像, 输入选项卡,配置如下

- 作业选项卡,配置如下:添加作业为构建类型->构建器类型:Container Register->输入API key->Container Register名称空间->Docker镜像名称。构建脚本部分不需要修改,保存即可。




- 阶段二 构建容器




- 上面第三步 构建脚本如下,供参考
#!/bin/bash # 此处为您的脚本 # 安装 code-engine CLI # ibmcloud plugin install code-engine # 用API的方式 login IBM Cloud -r:地域 -g:资源组 ibmcloud login --apikey ${IBM_CLOUD_API_KEY} -r ${IBM_CLOUD_REGION} -g ${IBM_CLOUD_RESOURCE} ibmcloud cr login # 选择Code engine的Project # 指定Code engine project的名字 ibmcloud ce project select -n ${CODE_ENGINE_PROJ} # 发布 Code engine的程序 echo "CODE_ENGINE_PROJ=${CODE_ENGINE_PROJ}" echo "PIPELINE_IMAGE_URL=${PIPELINE_IMAGE_URL}" APP_EXISTED=0 eval $(ibmcloud ce application list | awk '$1=="'"${APP_NAME}"'" {printf("APP_EXISTED=1")}') if [ ${APP_EXISTED} -eq 1 ]; then ibmcloud ce application update --name ${APP_NAME} --image private.${PIPELINE_IMAGE_URL} --registry-secret ${REGISTRY_SECRET} else ibmcloud ce application create --name ${APP_NAME} --image private.${PIPELINE_IMAGE_URL} --registry-secret ${REGISTRY_SECRET} fi
说明: 脚本涉及到的环境变量大部分在图4里定义的, 只有PIPELINE_IMAGE_URL比较特殊,它来自上一阶段
注意:PIPELINE_IMAGE_URL需要在管道级别定义环境属性


REGISTRY_SECRET:需要去CodeEngine 定义注册表访问权,这里填注册表访问权的名称。
可以选CodeEngine受管私钥,生成这个Key。


最后点击保存,你会看到下面的画面。点击第一个阶段的运行按钮,第一阶段运行成功后会自动运行后面的阶段。

最后,所有阶段都通过后,你可以到CodeEngine项目下去查看发布的应用程序,可以看到运行状态,URL,还可以测试。
工具链可以添加第三方工具,比如slack,在构建成功或失败后向slack channel发送通知(参看链接https://api.slack.com/messaging/webhooks)
补充:
- deploy阶段的脚本
#!/bin/bash # 此处为您的脚本 # 用API的方式 login IBM Cloud -r:地域 -g:资源组 ibmcloud login --apikey ${IBM_CLOUD_API_KEY} -r ${IBM_CLOUD_REGION} -g ${IBM_CLOUD_RESOURCE} ibmcloud cr login # 选择Code engine的Project # 指定Code engine project的名字 ibmcloud ce project select -n ${CODE_ENGINE_PROJ} # 发布 Code engine的程序 echo "CODE_ENGINE_PROJ=${CODE_ENGINE_PROJ}" echo "PIPELINE_IMAGE_URL=${PIPELINE_IMAGE_URL}" APP_EXISTED=0 eval $(ibmcloud ce application list | awk '$1=="'"${APP_NAME}"'" {printf("APP_EXISTED=1")}') if [ ${APP_EXISTED} -eq 1 ]; then ibmcloud ce application update --name ${APP_NAME} --image private.${PIPELINE_IMAGE_URL} --registry-secret ${REGISTRY_SECRET} else ibmcloud ce application create --name ${APP_NAME} --image private.${PIPELINE_IMAGE_URL} --registry-secret ${REGISTRY_SECRET} fi
- deploy stage 截图


可以在终端上用命令查看CodeEngin状态
ibmcloud login -sso ibmcloud target -g ResourceGroup ibmcloud ce project select -n 'Code Engine Project' ibmcloud ce application logs --application pplication-80