发布项目到git(前端Vue。后端java)
提交前端项目
1 2 3 4 5
| git init git add * git commit -m "first commit" git remote add origin https://nas.lzz.plus:8030/public/project-ui.git git push -u origin master
|
提交后端到git
1 2 3 4 5
| git init git add * git commit -m "first commit" git remote add origin https://nas.lzz.plus:8030/public/project-java.git git push -u origin master
|
安装Drone(dockerfile安装)
Drone-server安装,编写dockerfile文件
docker-compose-drone.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| version: '3' services: drone-server: restart: always image: drone/drone:2 ports: - "10080:80" volumes: - /home/docker/drone/drone:/var/lib/drone/ - /home/docker/drone/data:/data/ environment: - DRONE_GITEA_SERVER=https://xxx.com:8030/ # 支持http, https - DRONE_GITEA_CLIENT_ID=2e796e47-b970-4a76-a5fc-b5e921399bdb #Gitea oauth 客户端 ID - DRONE_GITEA_CLIENT_SECRET=gto_kjwgzincxrby3rq6esvrojtwpbmy2oklont7izun5bj5c4cqnmna #Gitea oauth 客户端密钥。 - DRONE_SERVER_HOST=https://xxx.com:8040 #drone外部主机名或 IP 地址 - DRONE_SERVER_PROTO=https # 支持http, https - DRONE_RPC_SECRET=9876543210123 #设置drone主服务于runner之间的密钥 - DRONE_GIT_ALWAYS_AUTH=true - DRONE_GIT_USERNAME=drone-server #在git 生成的访问令牌名称 - DRONE_GIT_PASSWORD=cb6e711e651b20548ce8XXXXXX4fdcfb060317b3 #在git 生成的访问令牌密钥 - DRONE_USER_CREATE=username:liuzhuangzhuang,admin:true # 开启并设置管理员账户(即一个真实的 GitHub 用户)
|
安装runner,用于运行发布项目
docker-compose-drone-runner.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| version: '3' services: drone-runner-docker: restart: always image: drone/drone-runner-docker:1 ports: - "10081:3000" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DRONE_RPC_PROTO=http # 支持http, https - DRONE_RPC_HOST=drone-server #drone-server地址 - DRONE_RPC_SECRET=9876543210123 #drone主服务于runner之间的密钥,于 drone-server设置相同 - DRONE_RUNNER_NAME=drone-runner-docker - DRONE_RUNNER_CAPACITY=2 #并发数量 - DRONE_RUNNER_LABELS=server:runner1 #runner标签,后续可在yml配置发版到哪一个标签服务器
|
编写发版文件后端(java)
编写entrypoint.sh 服务启动脚本
entrypoint.sh
1 2 3 4 5 6 7 8
| #!/bin/sh
java -Xms128m -Xmx128m -jar /app/project.jar --spring.profiles.active=dev
if [ $? != 0 ]; then echo Failed to start java >&2 exit 1 fi
|
–spring.profiles.active=dev : 命令行传参dev,执行dev环境配置文件
编写 Dockerfile 用于将java打包到容器中
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| FROM openjdk:17-jdk-alpine ENV SERVICE_PORTS=8081
FROM openjdk:17-jdk-alpine
# 设置服务端口作为环境变量 ENV SERVICE_PORTS=8081
# 更新 apk 源并安装字体,同时清理缓存 RUN set -xe \ && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ && apk --no-cache add ttf-dejavu fontconfig \ && apk --no-cache upgrade \ && rm -rf /var/cache/apk/*
# 创建应用目录并设置为工作目录 WORKDIR /app
# 将 shell 脚本复制到容器中并设置权限 COPY entrypoint.sh .
# 由于我们已经在前面设置了权限,这里不需要再递归设置 RUN chmod +x entrypoint.sh
# 复制应用程序 JAR 文件 COPY UniManage*.jar .
# 创建一个非特权用户并切换过去 RUN adduser -D appuser USER appuser
# 设置入口点 ENTRYPOINT ["/app/entrypoint.sh"]
|
编写run.sh 用于后期启动docker镜像使用
run.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #!/bin/sh # 定义应用组名 group_name='com.gitea.lzz' # 定义应用名称 app_name='project' # 定义应用版本 app_version='latest'
# 尝试停止名为 ${app_name} 的运行中的容器 docker stop ${app_name} echo '----stop container----' # 移除已停止的容器 docker rm ${app_name} echo '----rm container----' # 强制删除同名的旧镜像 docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----' # 打包编译docker镜像 # 使用当前目录下的 Dockerfile 构建一个新的 Docker 镜像,并打上标签 docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----' # 启动一个新容器,将主机的 8080 端口映射到容器内的 80 端口, # 设置时区环境变量为亚洲/上海, # 并挂载主机的系统时间文件到容器内, # 最后以后台模式运行容器。
docker run -p 8080:80 --name ${app_name} \ -e TZ="Asia/Shanghai" \ -v /etc/localtime:/etc/localtime \ -d ${group_name}/${app_name}:${app_version}
echo '----start container----'
|
编写.drone.yml
.drone.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| kind: pipeline type: docker name: ai
node: server: runner1 # 在上面的docker-compose-drone-runner.yml 定义的DRONE_RUNNER_LABELS,如果不填写,则会每台runner都会部署
steps: - name: build-jar # 流水线名称 image: maven:3.8.5-openjdk-17 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-cache path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 commands: # 定义在Docker容器中执行的shell命令 - mvn clean package -DskipTests=true # 应用打包命 - cp target/project-0.0.1-SNAPSHOT.jar /app/build/project-0.0.1.jar - cp entrypoint.sh /app/build/ - cp Dockerfile /app/build/ - cp run.sh /app/build/
- name: build-docker image: plugins/docker volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 - name: docker path: /var/run/docker.sock # 挂载宿主机的docker settings: dockerfile: /app/build/Dockerfile commands: # 定义在Docker容器中执行的shell命令 - cd /app/build - chmod +x run.sh - sh run.sh - docker ps
volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-build host: path: /home/data/maven/build # 从宿主机中挂载的目录 - name: maven-cache host: path: /home/data/maven/cache - name: docker host: path: /var/run/docker.sock
|
编写发版文件前端(Vue)
编写.drone.yml发版文件
.drone.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| kind: pipeline type: docker name: project-ui
node: server: runner1
# 声明宿主机 映射到 drone执行器的数据卷 volumes: - name: node_modules # 数据卷名称 # Host Volume, 挂载到宿主机上的卷轴 host: # 宿主机的绝对路径 path: /home/data/cache/node_modules
- name: blog_path host: # 宿主机的绝对路径 path: /home/data/project
steps: - name: build-project # 步骤名称 image: node:18.15.0-alpine3.17 # 使用镜像和版本 volumes: # 当前步骤使用(挂载)的卷轴 - name: node_modules # 数据卷名称 path: /drone/src/node_modules # 容器内的绝对路径 - name: blog_path path: /drone/src/build_web # 执行的命令 commands: - sed -i 's@https://dl-cdn.alpinelinux.org/@https://mirrors.aliyun.com/alpine/@g' /etc/apk/repositories - apk update && \ apk add --no-cache python3 make g++ autoconf && \ npm config set registry https://registry.npmmirror.com && \ npm ci && \ apk del python3 make g++ autoconf - npm run build - cp -r /drone/src/dist/* /drone/src/build_web # 打包应用镜像并运行 - name: build-start image: appleboy/drone-ssh settings: host: from_secret: ssh_url username: from_secret: ssh_user key: from_secret: ssh_key port: 22 command_timeout: 5m script: - cd /usr/local/nginx/sbin - pwd - cd /usr/local/nginx/sbin/ && ./nginx -s reload - pwd
|
ssh_url、ssh_user和ssh_key 需要提前在git上创建凭证