一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
目标
- 使用云效管理代码
- 每次提交的时候触发流水线
- 使用流水线对代码进行构建,打包docker镜像,上传到ECS,启动镜像
通俗的说就是,本地提交代码后就直接让代码在服务器上生效.
做到一次配置,简单使用.
准备
- 云效企业创建(免费)
- 项目准备
- 代码上传到云效(免费)
- ECS云服务器(收费)
- Docker基础知识
- 阿里云镜像仓库服务开通(个人版免费),并创建命名空间及仓库
操作
创建仓库
进入云效代码管理 codeup.aliyun.com/
进行仓库的创建,这里的创建仓库其实跟github上的一样,就是创建一个代码存储仓库
流水线配置
代码仓库创建后进入该仓库,进入流水线
新建流水线
分析一下我们的目标,我们本次的项目为java项目,那么就需要如下步骤
- maven编译打包
- docker镜像打包
- 推送docker镜像到镜像仓库(阿里的镜像服务ACR)
- 在ECS上执行部署运行脚本
-
- 脚本其实就是一个docker run命令,将推送到镜像仓库的镜像拉取到ECS本地,然后启动
那么在流水线的配置里,实际上其实就是两步
- java构建docker镜像并推送到镜像仓库
- Docker部署
看一下操作:
创建流水线
快速配置
我们选择快速配置,云效会根据项目来推荐一些配置项.
选择java
可以看到,快速配置提供的三个阶段,测试/构建/部署
简单起见,我们省略了测试阶段(是的,我们的代码应该是没问题,不需要扫描!)
根据上面的目标,我们选择Docker镜像
至于部署阶段,默认都是k8s部署的,我们直接省略掉,一会手动创建Docker部署任务.
确定之后,简单的流水线雏形已经出现了
代码源配置
我们可以看到,由于是直接通过代码库创建的,直接默认代码库源
我们可以修改分支,即哪个分支的代码有变动会触发流水线
如果之前单独使用jenkins的童鞋,应该知道webhook,而云效这里是直接整合了,无需多余的配置,默认就是当代码提交就会触发流水线,也可以改为其他事件,我们这里就不改了
构建docker镜像并推送
可以看到该步骤有个红色的叹号,说明该任务里有些必要配置我们没做.
点击该任务,出现右侧任务栏
可以看到该任务有两个步骤
- java构建
- 镜像构建推送仓库
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
其中的DOCKER_USERNAME都是变量,属于用户名密码,我们需要在配置里配置一下,保证安全
在变量和缓存里新建两个变量,如下:
这样创建的变量属于全局变量,可以在流水线任意位置使用,这样就可以在脚本里使用这两个变量了.
回到我们刚才的脚本,还有一个变量$iamge
这个变量是在这个任务里定义的,它很特殊,它的值是上一步推送docker镜像的产出物,我们可以点击上一步任务看下.
其实就是Docker镜像的版本,使用的变量获取.
这样配置后,我们的流水线就配置好了.
点击保存并运行就可以进行测试了.
测试
在本地提交一次代码,看是否能正常触发流水线
完美
点击查看可以查看日志信息,如果出现错误,可以根据日志信息进行排查,如果一切正常,流水线的配置就好了
总结
以前使用过github+webhook+jenkins来做简单的流水线部署,操作比较复杂,而且因为涉及到多个平台多种服务组件,需要摸索的地方比较多,但是现在通过使用云效一站式搞定,比较省力
再就是流水线的配置,可能第一次配置略显复杂,但是配置好了之后基本上就不会再动流水线了,对于开发来说是及其方便的,开发好一个功能后,只需要提交一下代码,然后去上个洗手间,回来代码就已经发布好了,完美!