阿里云devops——云效之CICD
背景
- 38块一年买了阿里云的云服务器(ECS)
- 想搭建一套学习练习用的asp.net core的web API还可以给我媳妇做接口测试
- 想结合docker做容器话部署
- 部署的时候不想每次登录服务器进行手动部署
- 想过用码云做代码管理,用Jenkins做CICD
- 还没实施的时候接触到了云效,因为公司在用Azure Devops,所以觉得云效应该更简单和灵活
准备
-
创建一个容器镜像服务的个人实例(免费)。因为已经有了ECS,所以无脑下一步即可。我们用他管理docker镜像。考虑到阿里系的集成性和网络因素,所以没有选择docker hub。
-
ECS上安装docker环境。具体步骤参考
-
ECS上安装Nginx做反向代理。
这里有个小插曲,本想这把Nginx放在docker中安装的。由于docker内的Nginx转发请求到另一个容器中或者宿主机的某个端口,会很麻烦,确实没搞定。所以粗暴了一些直接安装在宿主机上了。
实现
-
在云效中创建一个项目,个人版是免费的。步骤很简单,无脑下一步即可。
-
代码管理中,创建代码库,并把本地代码推送到代码库中。
-
新建流水线
-
流水线源
- 资源选择Codeup
- 代码库选择上一步对应的即可
- 代码源触发可根据需求自定义,我选择手动触发。
-
构建
-
任务名称:默认
-
构建集群:默认
-
下载流水线源:默认
-
任务步骤
-
.NET Core构建
- SDK:根据你的项目选,我的是6.0
- 执行命令:默认
-
镜像构建并推送至阿里云镜像仓库个人版
-
选择服务器连接:默认
-
地域:我的服务器在背景,我就选北京
-
仓库:如果准备中,容器镜像服务建好了,会自动带出。
-
Dockerfile路径:out/Dockerfile
这个有个坑:
- 因为我的项目中dockerfile放在代码的根目录下,所以我Dockerfile路径填写的是Dockerfile,执行的时候报错了,提示没找到dockerfile
- 于是发现需要把代码所在路径也写上才可以找到,LoginProject/Dockerfile。虽然构建成功了,但是部署后容器会报错。提示donnet命令找不到LoginProject.dll。找了很久才反应过来是因为我编写的dockerfile中没有publish的动作,肯定会找不到。
- 当我改好dockerfile的时候,我又想在上一步.NET Core构建的时候已经publish了,为什么还要在dockerfile中再做一次呢?而且很影响镜像构建的效率。
- 经过多次试验,在日志中发现上一步构建后的文件会放在out这个文件夹下。
- 所以最后把Dockerfile路径写成out/Dockerfile即可。
-
ContextPath:因为Dockerfile和项目代码放在同一路径,所以不填。
-
-
-
部署
-
任务名称/主机组:默认
-
部署配置-执行用户:root(目前只有一个用户)
-
部署配置-部署脚本
-
登录docker仓库,
docker login
-
拉取上一步构建出来的镜像
docker pull
-
停止docker 已经运行的容器并删除
docker rm -f
-
把拉取的镜像运行起来
docker run
总结一下这里遇到的坑:
- 使用变量将上一步构建出来的tag获取到。在变量中可以选择,如:image =标签.LogoinProject_${DATETIME}。但是打印出来却是很长的一串字符。查阅文档发现需要用base64解码。所以第一步追加
export image=$(echo $image | base64 -d);
-
docker run -it
-it报错,具体原因还未知 - 去掉
-it
重试,正常部署了,但是会一直停在终端,cd会一直不结束 - 追加
-d
,后端运行。成功了
- 使用变量将上一步构建出来的tag获取到。在变量中可以选择,如:image =标签.LogoinProject_${DATETIME}。但是打印出来却是很长的一串字符。查阅文档发现需要用base64解码。所以第一步追加
-
以下是完成部署脚本,很粗糙,先用着。未来会编写sh脚本,做的更友好一些。
export image=$(echo $image | base64 -d); docker login -u=xxx -p=xxx registry.cn-beijing.aliyuncs.com docker pull $image docker rm -f loginproject docker run -d --rm -p 8081:8081 --name loginproject $image
-
-
-
-