年前的时候写了篇idea生成docker,后来用maven生成镜像都是比较麻烦的方法,都已经过时了,也比较麻烦。
公司的代码一般都放到云效里面,云效的流水线一直搞不明白,后来花了点时间弄了下,这里借用若依分离版做个示例。
在云效的体系下,建立云效的流水下可以自动给代码仓库建Webhooks。
这个功能比较迷糊,不知道是不是为了区别master提交的还是啥。
整体工作流如下:
image-1-bdzp.png
我这是以master的操作才打包
后端项目选择Codeup,代码库填上,如下图
image-hsvf.png
剩下的按照默认就好,前端部分只需要拉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构建部分

图示如下:
image-2.png
基本上选默认的就好,主要是注意工作目录选择不要选错了。
还有就是镜像构建并推送至ACR(个人版)
选好自己的后端镜像仓库和
image-3.png
标签最好填写${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构建部分

1736756546601.png
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的版本,实现自动部署最新版

1736757223895.png
1736757281165.png
1736757331050.png
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应用部署

1736757669136.png
选择ECS应用要在阿里云ecs设置下,这里才会显示
1736757824775.png
后面的部署配置

/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钩子填写那个地址就可以了