阿里云devops——云效之CICD

阿里云devops——云效之CICD

背景

  1. 38块一年买了阿里云的云服务器(ECS)
  2. 想搭建一套学习练习用的asp.net core的web API还可以给我媳妇做接口测试
  3. 想结合docker做容器话部署
  4. 部署的时候不想每次登录服务器进行手动部署
  5. 想过用码云做代码管理,用Jenkins做CICD
  6. 还没实施的时候接触到了云效,因为公司在用Azure Devops,所以觉得云效应该更简单和灵活

准备

  1. 创建一个容器镜像服务的个人实例(免费)。因为已经有了ECS,所以无脑下一步即可。我们用他管理docker镜像。考虑到阿里系的集成性和网络因素,所以没有选择docker hub。

  2. ECS上安装docker环境。具体步骤参考

  3. ECS上安装Nginx做反向代理。

    这里有个小插曲,本想这把Nginx放在docker中安装的。由于docker内的Nginx转发请求到另一个容器中或者宿主机的某个端口,会很麻烦,确实没搞定。所以粗暴了一些直接安装在宿主机上了。

实现

  1. 在云效中创建一个项目,个人版是免费的。步骤很简单,无脑下一步即可。

  2. 代码管理中,创建代码库,并把本地代码推送到代码库中。

  3. 新建流水线

    • 流水线源

      • 资源选择Codeup
      • 代码库选择上一步对应的即可
      • 代码源触发可根据需求自定义,我选择手动触发。
    • 构建

      • 任务名称:默认

      • 构建集群:默认

      • 下载流水线源:默认

      • 任务步骤

        • .NET Core构建

          • SDK:根据你的项目选,我的是6.0
          • 执行命令:默认
        • 镜像构建并推送至阿里云镜像仓库个人版

          • 选择服务器连接:默认

          • 地域:我的服务器在背景,我就选北京

          • 仓库:如果准备中,容器镜像服务建好了,会自动带出。

          • Dockerfile路径:out/Dockerfile

            这个有个坑:

            1. 因为我的项目中dockerfile放在代码的根目录下,所以我Dockerfile路径填写的是Dockerfile,执行的时候报错了,提示没找到dockerfile
            2. 于是发现需要把代码所在路径也写上才可以找到,LoginProject/Dockerfile。虽然构建成功了,但是部署后容器会报错。提示donnet命令找不到LoginProject.dll。找了很久才反应过来是因为我编写的dockerfile中没有publish的动作,肯定会找不到。
            3. 当我改好dockerfile的时候,我又想在上一步.NET Core构建的时候已经publish了,为什么还要在dockerfile中再做一次呢?而且很影响镜像构建的效率。
            4. 经过多次试验,在日志中发现上一步构建后的文件会放在out这个文件夹下。
            5. 所以最后把Dockerfile路径写成out/Dockerfile即可。
          • ContextPath:因为Dockerfile和项目代码放在同一路径,所以不填。

      • 部署

        • 任务名称/主机组:默认

        • 部署配置-执行用户:root(目前只有一个用户)

        • 部署配置-部署脚本

          1. 登录docker仓库,docker login

          2. 拉取上一步构建出来的镜像 docker pull

          3. 停止docker 已经运行的容器并删除 docker rm -f

          4. 把拉取的镜像运行起来 docker run

            总结一下这里遇到的坑:

            1. 使用变量将上一步构建出来的tag获取到。在变量中可以选择,如:image =标签.LogoinProject_${DATETIME}。但是打印出来却是很长的一串字符。查阅文档发现需要用base64解码。所以第一步追加export image=$(echo $image | base64 -d);
            2. docker run -it -it报错,具体原因还未知
            3. 去掉-it重试,正常部署了,但是会一直停在终端,cd会一直不结束
            4. 追加-d,后端运行。成功了
          5. 以下是完成部署脚本,很粗糙,先用着。未来会编写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
            
上一篇:P1271 【深基9.例1】选举学生会


下一篇:Java 的使用习惯