年前的时候写了篇idea生成docker,后来用maven生成镜像都是比较麻烦的方法,都已经过时了,也比较麻烦。
公司的代码一般都放到云效里面,云效的流水线一直搞不明白,后来花了点时间弄了下,这里借用若依分离版做个示例。
在云效的体系下,建立云效的流水下可以自动给代码仓库建Webhooks。
这个功能比较迷糊,不知道是不是为了区别master提交的还是啥。
整体工作流如下:
我这是以master的操作才打包
后端项目选择Codeup,代码库填上,如下图
剩下的按照默认就好,前端部分只需要拉master代码就好。
提前部署个docker redis
主要是redis的network网络
version: '3.3'
services:
redis:
image: redis:7.4.1-alpine
container_name: redis
restart: always
ports:
- '6379:6379'
volumes:
- ./data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
- ./logs:/logs
#配置文件启动
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- redis-network
networks:
redis-network:
driver: bridge
redis.conf的配置也给下吧
# Redis 服务器的端口号(默认:6379)
port 6379
# 绑定的 IP 地址,如果设置为 127.0.0.1,则只能本地访问;若设置为 0.0.0.0,则监听所有接口(默认:127.0.0.1)
bind 0.0.0.0
# 设置密码,客户端连接时需要提供密码才能进行操作,如果不设置密码,可以注释掉此行(默认:无)
# requirepass foobared
requirepass XXXXX
# 设置在客户端闲置一段时间后关闭连接,单位为秒(默认:0,表示禁用)
# timeout 0
# 是否以守护进程(daemon)模式运行,默认为 "no",设置为 "yes" 后 Redis 会在后台运行
daemonize no
# 设置日志级别(默认:notice)。可以是 debug、verbose、notice、warning
loglevel notice
# 设置日志文件的路径(默认:空字符串),如果不设置,日志会输出到标准输出
logfile ""
# 设置数据库数量(默认:16),Redis 使用数据库索引从 0 到 15
databases 16
# 是否启用 AOF 持久化,默认为 "no"。如果设置为 "yes",将在每个写操作执行时将其追加到文件中
appendonly no
# 设置 AOF 持久化的文件路径(默认:appendonly.aof)
# appendfilename "appendonly.aof"
# AOF 持久化模式,默认为 "always"。可以是 always、everysec 或 no
# always:每个写操作都立即同步到磁盘
# everysec:每秒钟同步一次到磁盘
# no:完全依赖操作系统的行为,可能会丢失数据,但性能最高
# appendfsync always
# 设置是否在后台进行 AOF 文件重写,默认为 "no"
# auto-aof-rewrite-on-rewrite no
# 设置 AOF 文件重写触发时,原 AOF 文件大小与新 AOF 文件大小之间的比率(默认:100)
# auto-aof-rewrite-percentage 100
# 设置是否开启 RDB 持久化,默认为 "yes"。如果设置为 "no",禁用 RDB 持久化功能
save 900 1
save 300 10
save 60 10000
# 设置 RDB 持久化文件的名称(默认:dump.rdb)
# dbfilename dump.rdb
# 设置 RDB 持久化文件的保存路径,默认保存在当前目录
# dir ./
# 设置是否开启对主从同步的支持,默认为 "no"
# slaveof <masterip> <masterport>
# 设置主从同步时是否进行数据完整性校验,默认为 "yes"
# repl-diskless-sync no
# 设置在复制时是否进行异步复制,默认为 "yes",可以加快复制速度,但会增加数据丢失的风险
# repl-backlog-size 1mb
# 设置是否开启集群模式(cluster mode),默认为 "no"
# cluster-enabled no
# 设置集群中的节点超时时间(默认:15000毫秒)
# cluster-node-timeout 15000
# 设置集群中节点间通信使用的端口号(默认:0)
# cluster-announce-port 0
# 设置集群中节点间通信使用的 IP 地址
# cluster-announce-ip 127.0.0.1
# 设置是否开启慢查询日志,默认为 "no"
# slowlog-log-slower-than 10000
# 设置慢查询日志的最大长度,默认为 128
# slowlog-max-len 128
# 设置每秒最大处理的写入命令数量,用于保护 Redis 服务器不被超负荷写入(默认:0,表示不限制)
# maxclients 10000
# 设置最大连接客户端数量(默认:10000,0 表示不限制)
# maxmemory <bytes>
# 设置最大使用内存的策略(默认:noeviction)。可以是 volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl 或 noeviction
# maxmemory-policy noeviction
# 设置允许最大使用内存的比例(默认:0),设置为 0 表示禁用
# maxmemory-samples 5
Java构建部分
图示如下:
基本上选默认的就好,主要是注意工作目录选择不要选错了。
还有就是镜像构建并推送至ACR(个人版)
选好自己的后端镜像仓库和
标签最好填写${BUILD_NUMBER},Dockerfile文件如下
# 如果云效流水下拉不下来java:8-jdk-alpine镜像本地上传到阿里云做中专
FROM java:8-jdk-alpine
RUN mkdir -p /home/ruoyi/uploadPath
RUN mkdir -p /home/ruoyi/logs
RUN mkdir -p /etc/apk/
RUN touch /etc/apk/repositories
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories
RUN apk --no-cache add ttf-dejavu fontconfig
RUN set -xe && apk --no-cache add ttf-dejavu fontconfig
WORKDIR /home/ruoyi
COPY ./ruoyi-admin/target/ruoyi-admin.jar ruoyi-admin.jar
EXPOSE 8080
CMD ["nohup","java","-jar","/home/ruoyi/ruoyi-admin.jar", ">", "/home/ruoyi/logs/nohup.log", "&"]
Node.js构建部分
Dockerfile文件和nginx_prod都放到跟目录下
安装node环境,最后选择和本地一样的
执行指令的一部分
npm install
npm run build:prod
选好自己的前端镜像仓库和标签填写${BUILD_NUMBER},前端Dockerfile如下
# 使用 Nginx 作为基础镜像,一样如果拉不下来就用阿里用或者是其他做个镜像中转
FROM nginx:1.12.2
# 将 nginx_prod.conf 拷贝到容器中,正式的选择正式的,测试的选择测试的
COPY nginx_prod.conf /etc/nginx/nginx.conf
# 创建存放前端编译后代码的目录
RUN mkdir -p /home/ruoyi-vue3
# 将构建好的应用拷贝到 Nginx 的默认 web 目录
COPY dist /home/ruoyi-vue3
# Expose 端口
EXPOSE 80
# 启动 Nginx 服务器
CMD ["nginx", "-g", "daemon off;"]
因为用了nginx所以也要把nginx配置提供下
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 127.0.0.1;
charset utf-8;
location / {
root /home/ruoyi-vue3;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://后端-service:8080/; #这个可以从docker-compose.yml看到
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
替换文件中的环境变量,主要是替换docker-compose.yml的版本,实现自动部署最新版
docker-compose.yml文件如下
#version: '3.3'
services:
后端-service:
image: 自己打包的镜像/pro:${BUILD_NUMBER}
container_name: 后端-service
environment:
- TZ=Asia/Shanghai
restart: always
ports:
- '8080:8080'
volumes:
- ./logs:/home/ruoyi/logs
- ./uploadPath:/home/ruoyi/uploadPath
networks:
- redis_redis-network
- 项目-network
前端-vue3:
image: 自己打包的前端镜像/pro_vue:${BUILD_NUMBER}
container_name: 前端-frontend
environment:
- TZ=Asia/Shanghai
restart: always
ports:
- "8081:80"
networks:
- 项目-network
depends_on:
- 后端-service
networks:
项目-network: ## 前后端在一个网络
driver: bridge
redis_redis-network:
external: true
ECS应用部署
选择ECS应用要在阿里云ecs设置下,这里才会显示
后面的部署配置
/home/app/package.tgz ##这是一个自定义目录,是说把现在的制品下载到这个目录
后面的部署脚本
tar zxvf /home/app/package.tgz -C /home/app/
# 清理旧的镜像
docker rmi $(docker images | grep 'pro\s' | sed '1d'| awk '{print $3}')
docker rmi $(docker images | grep pro_vue | sed '1d'| awk '{print $3}')
cd /home/app/
mv -f ./docker-compose.yml /home/ruoyi/docker-compose.yml
rm -rf ./package.tgz
# 部署
cd /home/ruoyi/
docker compose up -d
后面的都是默认的了执行下就可以了
关于集成其他git
这个集成比较简单,新建一个流水线,在触发设置有个Webhook触发,里面有个通用Webhook。
复制好地址,在自己的仓库代码有web钩子填写那个地址就可以了