自动更新的流程是: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;
流程
-
app-docker-code-repo: push to develop branch;
-
docker-image-repo: rebuild image on develop branch;
-
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;
流程
-
Jenkins job: release app code from develop to master branch in app-code-repo
-
Jenkins job: 由上一个job触发,在docker-code-repo/release-history.md文件结尾追加一行发布时间记录; push to master branch of docker-code-repo;
-
docker repo: 用docker-code-repo的Dockerfile, 证书, 启动脚本等替换掉app-code-repo master banch上的对应的文件, (master branch上的这些文件是从develop分支上合并过来的,适用于staging环境) rebuild image on master branch from app-code-repo;
-
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 后重新部署应用。