DarkMatter in Cyberspace
  • Home
  • Categories
  • Tags
  • Archives

容器应用自动更新


自动更新的流程是:push代码 -> 重新生成docker image -> 重新部署应用。

deploy staging

参与方

  • app-docker-code-repo: git repo, 产品代码 + Dockerfile, start.sh in staging

  • docker-image-repo: 跟踪app-docker-code-repo develop branch, webhook指向container service的 重新部署 webhook;

  • container service: 定义了 重新部署 webhook;

流程

  1. app-docker-code-repo: push to develop branch;

  2. docker-image-repo: rebuild image on develop branch;

  3. container service: re-deploy application.

deploy beta

参与方

  • app-code-repo: git repo, 产品代码

  • docker-code-repo: Dockerfile + start.sh + production certificates + release history

  • docker-image-repo: 跟踪docker-code-repo master branch, webhook指向container service的 重新部署 webhook;

  • container service: 定义了 重新部署 webhook;

流程

  1. Jenkins job: release app code from develop to master branch in app-code-repo

  2. Jenkins job: 由上一个job触发,在docker-code-repo/release-history.md文件结尾追加一行发布时间记录; push to master branch of docker-code-repo;

  3. docker repo: 用docker-code-repo的Dockerfile, 证书, 启动脚本等替换掉app-code-repo master banch上的对应的文件, (master branch上的这些文件是从develop分支上合并过来的,适用于staging环境) rebuild image on master branch from app-code-repo;

  4. container service: re-deploy production application, publish a beta domain name: beta.mysite.com;

deploy production

Use the same docker image of beta app, just publish a production domain name: www.mysite.com.

Production and beta app shara all auxiliary apps, such as mongodb, elasticsearch, schedule, console, etc.

Fix submodule issue

在阿里云的镜像服务上, 由于目前该服务不支持私有submodule,下载代码后会马上执行submodule update, 对于没有私有submodule的权限,导致update失败。

目前是重新创建一遍image,就神奇地不报错了。 另外还有一个变通的方法:把包含submodule的git repo转化为不包含submodule的repo, 流程是: push代码 -> Jenkins job转换 -> push到无submodule repo -> 重新生成docker image -> 重新部署应用。

在Jenkins上创建转换任务

创建了运行在阿里云容器服务上的Jenkins服务:leo, nojs216

http://jen.cb048496dfcb04cc2bca25858c276ca9e.cn-beijing.alicontainer.com/job/transGitSubmodule/

convert submodule to plain repo

git clone ... newfairs cd newfairs git checkout develop git submodule init git submodule update git submodule foreach --recursive 'git checkout develop' git submodule foreach --recursive 'git pull' mkdir tmp mv packages/ tmp/ git submodule deinit . git rm -r packages/ mv tmp/ packages/ rm -r tmp packages//.git sed -i '/packages/d' .gitignore git add -A git commit -m 'some comments'

代码push后自动转换为无submodule版本

Push代码后自动执行Jenkins任务:https://code.aliyun.com/incubator/newfairs-code-docker/hooks

在阿里云code代码库里设置的webhook在代码push后不生效,发现阿里云dev可以连接bitbucket,

于是到bitbucket里创建了项目,测试webhook后报Error 403 No valid crumb was included in the request错误,还是不能实现代码push后自动重新构建。webhook的url

http://leo:1512d10620f83ab438a541445a10aece@jen.cb048496dfcb04cc2bca25858c276ca9e.cn-beijing.alicontainer.com/job/transGitSubmodule/build?token=transGitSubmodule

在命令行里用curl发送能够出发Jenkins任务。

用RequestBin测试后发现aliyun code可以在push后正确发送http request,可能Jenkins remote api遇到了与bitbucket一样的错误?

基本可以确定aliyun code和bitbucket没问题,问题出在了Jenkins一端。

原因是Jenkins默认打开Prevent Cross Site Request Forgery exploits,在 Manage Jenkins -> Configure Global Security 里取消勾选这一项,就OK了。

但这样似乎不太安全,最好还是打开一个功能,找到crumb,加入到HTTP请求里。

发现bitbucket的webhook是个很好的调试工具,可以返回错误信息。

无submodule版本push触发docker image rebuild

容器重新部署

通过将docker image 的 webhook 指向应用的 重新部署 webhook, 实现docker image rebuild 后重新部署应用。



Published

Nov 21, 2016

Last Updated

Nov 21, 2016

Category

Tech

Tags

  • docker 10
  • git 36
  • jenkins 26
  • submodule 3

Contact

  • Powered by Pelican. Theme: Elegant by Talha Mansoor