从0开始部署一个流水线

1,382 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

目标

  1. 使用云效管理代码
  2. 每次提交的时候触发流水线
  1. 使用流水线对代码进行构建,打包docker镜像,上传到ECS,启动镜像

通俗的说就是,本地提交代码后就直接让代码在服务器上生效.

做到一次配置,简单使用.

准备

  1. 云效企业创建(免费)
  2. 项目准备
  1. 代码上传到云效(免费)
  2. ECS云服务器(收费)
  1. Docker基础知识
  2. 阿里云镜像仓库服务开通(个人版免费),并创建命名空间及仓库

操作

创建仓库

进入云效代码管理 codeup.aliyun.com/

进行仓库的创建,这里的创建仓库其实跟github上的一样,就是创建一个代码存储仓库

流水线配置

代码仓库创建后进入该仓库,进入流水线

新建流水线

分析一下我们的目标,我们本次的项目为java项目,那么就需要如下步骤

  1. maven编译打包
  2. docker镜像打包
  1. 推送docker镜像到镜像仓库(阿里的镜像服务ACR)
  2. 在ECS上执行部署运行脚本
    1. 脚本其实就是一个docker run命令,将推送到镜像仓库的镜像拉取到ECS本地,然后启动

那么在流水线的配置里,实际上其实就是两步

  1. java构建docker镜像并推送到镜像仓库
  2. Docker部署

看一下操作:

创建流水线

快速配置

我们选择快速配置,云效会根据项目来推荐一些配置项.

选择java

可以看到,快速配置提供的三个阶段,测试/构建/部署

简单起见,我们省略了测试阶段(是的,我们的代码应该是没问题,不需要扫描!)

根据上面的目标,我们选择Docker镜像

至于部署阶段,默认都是k8s部署的,我们直接省略掉,一会手动创建Docker部署任务.

确定之后,简单的流水线雏形已经出现了

代码源配置

我们可以看到,由于是直接通过代码库创建的,直接默认代码库源

我们可以修改分支,即哪个分支的代码有变动会触发流水线

如果之前单独使用jenkins的童鞋,应该知道webhook,而云效这里是直接整合了,无需多余的配置,默认就是当代码提交就会触发流水线,也可以改为其他事件,我们这里就不改了

构建docker镜像并推送

可以看到该步骤有个红色的叹号,说明该任务里有些必要配置我们没做.

点击该任务,出现右侧任务栏

可以看到该任务有两个步骤

  1. java构建
  2. 镜像构建推送仓库

java构建没啥好说的,maven编译

无需修改

需要我们做配置的是构建docker镜像,并推送至阿里云镜像仓库

还记得我们准备操作中的阿里云容器镜像服务吗,这里的地域及仓库需要选择我们预先创建好的.

如果没有服务连接,需要先添加服务连接,其实就是授权云效使用阿里云容器镜像服务,因为他们都是阿里云的产品,所以打通了.

标签就是构建后的镜像的tag,我们也使用默认值${DATETIME},即当前时间

Dockerfile路径这个使用过docker应该就知道,我们打包镜像肯定是需要依赖Dockerfile的,这个需要手动编写一下

而这里的配置需要多说一下,Dockerfile路径默认值就是项目根目录下,如果Dockerfile不在项目根目录下,则需要填写相对于项目根目录的相对路径

ContxtPath,Docker工作的上下文路径

即执行docker build命令时的工作目录,如果不填,默认为Dockerfile的当前路径,即.

刚才外面的红色!其实就是需要我们来配置阿里云镜像仓库的,至于其他的参数默认即可,只要你的Dockerfile的位置就是项目根目录下

同时展示一下我的Dockerfile,简单一点:

FROM openjdk:8u312-jdk-oracle
LABEL maintainer=zhangyao
COPY ruoyi-admin/target/*.jar /app.jar

EXPOSE 80
ENTRYPOINT ["java","-jar","/app.jar"]

Docker部署配置

然后我们进行最后一步,配置ECS主机拉取镜像,并执行启动脚本

刚才我们在快速配置里没有配置部署,此时需要我们手动新建一个部署任务:

如上新建部署任务后,

这里的主机组就是ECS,也相当于授权云效使用ECS,这样云效就可以直接在ECS上运行脚本了

然后下面就是执行的部署脚本

可以看到已经有一个示例的脚本了,但是我们需要改造一下

因为我们阿里云容器镜像仓库属于一个私有的仓库,我们必须要先登陆才能拉取镜像

修改脚本如下

# 登陆ACR
echo $DOCKER_PASSWORD | docker login --username $DOCKER_USERNAME --password-stdin registry.cn-beijing.aliyuncs.com
# 运行镜像
docker run -p 80:80 -d $image

其中的DOCKERPASSWORDDOCKER_PASSWORD和DOCKER_USERNAME都是变量,属于用户名密码,我们需要在配置里配置一下,保证安全

在变量和缓存里新建两个变量,如下:

这样创建的变量属于全局变量,可以在流水线任意位置使用,这样就可以在脚本里使用这两个变量了.

回到我们刚才的脚本,还有一个变量$iamge

这个变量是在这个任务里定义的,它很特殊,它的值是上一步推送docker镜像的产出物,我们可以点击上一步任务看下.

其实就是Docker镜像的版本,使用的变量获取.

这样配置后,我们的流水线就配置好了.

点击保存并运行就可以进行测试了.

测试

在本地提交一次代码,看是否能正常触发流水线

完美

点击查看可以查看日志信息,如果出现错误,可以根据日志信息进行排查,如果一切正常,流水线的配置就好了

总结

以前使用过github+webhook+jenkins来做简单的流水线部署,操作比较复杂,而且因为涉及到多个平台多种服务组件,需要摸索的地方比较多,但是现在通过使用云效一站式搞定,比较省力

再就是流水线的配置,可能第一次配置略显复杂,但是配置好了之后基本上就不会再动流水线了,对于开发来说是及其方便的,开发好一个功能后,只需要提交一下代码,然后去上个洗手间,回来代码就已经发布好了,完美!