github workflow使用docker部署springboot并推送到阿里云镜像仓库

news2024/11/26 0:33:18

文章目录

    • 1. 建立你的actions
    • 2. 工作流脚本
      • 2.1 触发事件
      • 2.2 密文和执行参数
      • 2.3 deploy.sh执行脚本
      • 2.4 Dockerfile
    • 3. 阿里云镜像仓库设置

最近想通过github的workflow部署springboot项目(CI),网上看了很多文章,都是有这样那样的问题,最终花了一个下午的时间终于搞好了

通过github的workflow,可以节省掉jenkins,而且感觉workflow语法比pipeline 稍微简单一些,特此记录一下自己的过程,方便复习

这里我们使用:

  • docker或者docker-compose或者Kubernetes部署(写对应的脚本即可,我这里是docker部署)
  • 使用阿里云镜像仓库(dockerhub太慢了!github推阿里云非常快😁)

1. 建立你的actions

首先我们选择使用对应的打包工具,我这里使用maven

image-20230429195347414

选择好之后会在当前项目新建./github/workflows的目录,里面用来管理workflow相关的文件

详细的官方中文文档可以看这里:https://docs.github.com/zh/actions/using-workflows

image-20230429195640564

这里我起名叫docker_build.yml,其实都一样

2. 工作流脚本

工作流文件语法非常的简单,我这里把我的贴出来,可以根据自己项目的结构进行调整

大家只需要改登录Docker Hub的部分:这里需要看的服务有多少个模块,需要进入到最终jar包生成的地方然后docker build。其他的地方都差不多

name: Deploy with docker

on:
  push:
    # 分支
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  compile:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 8
        uses: actions/setup-java@v2
        with:
          java-version: '8.0'
          distribution: 'adopt'
      # maven缓存,不加的话每次都会去重新拉取,会影响速度
      - name: Dependies Cache
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-
      # 编译打包
      - name: Build with Maven
        run: |
          mvn package -Dmaven.test.skip=true
      # 登录Docker Hub
      - name: Build the Docker image
        run: |
          docker version
          # 登录阿里云镜像仓库
          docker login --username=${{ secrets.DOCKER_HUB_USERNAME }} --password=${{ secrets.DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
          cd app/chat-front
          mkdir docker
          cp ./Dockerfile ./docker
          cp ./target/*.jar ./docker
          cd docker
          # 使用Dockerfile构建镜像
          docker build . --file Dockerfile --tag ${{ vars.hubAddr }}/${{ vars.USER_NAME }}/${{ vars.IMAGE_NAME }}:${{ vars.tag }}
          # 推送镜像到镜像仓库
          docker push ${{ vars.hubAddr }}/${{ vars.USER_NAME }}/${{ vars.IMAGE_NAME }}:${{ vars.tag }}
      # push后,用ssh连接服务器执行脚本    
      - name: 登录服务器, 执行脚本
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_REMOTE_HOST }}
          port: ${{ secrets.SSH_PORT }}
          username: ${{ secrets.SSH_USER }}
          password: ${{ secrets.SSH_PASSWORD }}
          # 执行脚本
          script: |
            # 部署脚本 后面的vars是传递给脚本的参数
            sh /root/script/deploy.sh ${{ vars.USER_NAME }} ${{ vars.IMAGE_NAME }} ${{ vars.PORT }} ${{ vars.CONTAINS_PORT }} ${{ vars.hubAddr }} ${{ vars.tag }}

看上去是不是很简单呢😆

2.1 触发事件

第一部分就是触发的事件了,我这里是希望每次合并main分支并且合并PR的时候就可以自动触发

on:
  push:
    # 分支
    branches: [ main ]
  pull_request:
    branches: [ main ]

2.2 密文和执行参数

这个工作流脚本是直接在我们项目里面的,所以里面的一些参数肯定是不能被别人看到的,我们可以通过${{ secrets.xxx }}的方式设置密文,密文设置后就看不到了,只能够更新;通过${{ vars.xxx}}设置运行的参数,例如设置docker对外暴露的端口等等

image-20230429201234047

执行参数就需要结合我们的脚本一起用了,一般是通过我们会通过ssh远程执行一个部署脚本deploy.sh,并且携带一些参数过去

image-20230429202310715

2.3 deploy.sh执行脚本

当我们打包好docker镜像之后,可以通过ssh远程执行我们自己服务器上的部署脚本,让脚本把之前跑的容器鲨死,把镜像删除,再重新拉取我们最新的镜像进行部署。其实有镜像了,那我们只需要将脚本改一改就可以部署docker-composeKubernetes

下面是我的脚本:

为了让脚本做到通用性,可以部署不同的项目,需要通过外面传入一些参数,确定具体要部署的项目

  • user_name:就是你仓库的账号名,一般镜像拉取的URL的前面是带账号名的
  • image_name:镜像的名字,也是你允许后容器的名字(可以自己改改脚本)
  • PORT:访问容器的外部端口
  • CONTAINS_PORT:容器自己的端口,例如mysql默认3306,Tomcat默认8080
# 这里的$1、$2对应上面传递过来的参数
user_name=$1
image_name=$2
PORT=$3
CONTAINS_PORT=$4
hubAddr=$5
tag=$6
# 如果传入的参数有一个为空,我们就提示他输入参数,然后退出
if [ "$1" == "" ]  || [ "$2" == "" ] || [ "$3" == "" ] || [ "$4" == ""]; then 
          echo "请输入参数"
            exit
fi

# 删除容器,就是删除旧的容器
# docker ps -a 获取所有的容器
# | grep ${image_name} 得到这个容器 awk '${print $1}' 根据空格分割,输出第一项
containerId=`docker ps -a | grep ${image_name} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
        # 停止运行
docker stop $containerId
# 删除容器
docker rm $containerId
echo "Delete Container Success"
fi

# 删除镜像
# 获取所有的镜像,得到我们自己构建的镜像的id
imageId=`docker images | grep ${hubAddr}/${user_name}/${image_name} | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
        # 删除镜像
docker rmi -f $imageId
echo "Delete Image Success"
fi
# 登录docker
# docker login -u lijiayan -p 你在docker hub上获取的密钥
# 拉取docker上新的镜像
docker pull ${hubAddr}/${user_name}/${image_name}:${tag}
# 运行最新的镜像 
# -d 设置容器在后台运行
# -p 表示端口映射,把本机的 92 端口映射到 container 的 80 端口(这样外网就能通过本机的 92 端口访问了
# 如果服务器重启后,我们需要重新启动docker
# 执行 systemctl restart docker 重新启动docker
# 但docker启动了,里面的容器没有启动,所以我们添加--restart=always ,docker启动后,容器也可以启动
# dokcer ps -a 查看所有的容器
docker run -d -p $3:$4 --name $image_name --restart=always ${hubAddr}/${user_name}/${image_name}:${tag}
echo "Start Container Successs"
echo "$image_name"

2.4 Dockerfile

我这里贴一下自己的Dockerfile,需要注意的是,github不能用oracleJDK,需要用openJDK

FROM openjdk:8-alpine
COPY ./chat-front.jar /tmp/chat-front.jar
EXPOSE 9002
ENTRYPOINT java -jar /tmp/chat-front.jar

3. 阿里云镜像仓库设置

众所周知,在国内拉取dockerhub非常慢,所以我们可以使用阿里云提供给我们每个人免费的仓库

  • 地址:https://cr.console.aliyun.com/

注册阿里云账号完成之后,在dashboard中搜索“容器镜像服务”关键字

image-20210513095921439

可以看到个人免费有300个份额

image-20210513100348822

点击“访问凭证”按钮,设置固定密码

image-20210513100541072

注意:这里设置的密码用来填上面的工作流脚本里面的secrets.DOCKER_PASSWORD

接下来就是创建命名空间,命名空间其实就是你推送地址的名字,我们在工作流脚本里面推送的vars.USER_NAME,我这里用自己的名字命名

image-20230429203400785

在这一步中会确定下来仓库的类型是公开还是私有(私有需要登录后才能拉取),填完相关信息点击下一步进入代码源页面,这里使用的是github,所以要先进行github授权,授权完成后选定github对应的项目,最后取消“代码变更自动构建镜像”选项框,勾选“海外机器构建”选项框(因为github在海外,如果不选择这个,我尝试了下,推送镜像的时候会非常慢)

image-20210513101222122

然后创建好自己镜像仓库名称即可

image-20230429203548620

我们后面推送的地址和登录相关的信息可以点击创建好的项目里面进行查看

如果有问题可以看官方文档:Docker登录、推送和拉取失败常见问题

部署完之后当我们推送了main分支之后就能看到我们的项目正常的跑起来了🦄

image-20230429202420428
image-20230429203907395

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Design_transformer

磁性元件设计 思路 滤波电感设计 磁芯不要饱和(开气隙) 考虑铜损大于铁损 谐振电感设计 磁芯不要饱和(开气隙) 考虑铁损大于铜损 变压器设计 磁芯不要饱和(开气隙) 励磁电流产生磁场 开气隙 增加了…

1.rabbitMQ介绍

0.思考 我们以前为什么要学习java直接的框架代码,而不是用springboot整合的框架,在学习完MQ后,我的答案是,可以直接写成更灵活的MQ代码(其他框架也是,SSM我们为什么要学,在于灵活度更高,以后可能会遇到SSM的代码我就可以看得懂),springboot整合虽然完成了大多数功能,但是我要其…

SpringBoot+MyBatis搭建迷你微信小程序

课程链接:https://www.imooc.com/learn/945 标签组件 view view类似于HTML中的div标签是最基础的UI组件 https://blog.csdn.net/wushibo750/article/details/113802928 https://developers.weixin.qq.com/miniprogram/dev/component/view.html block flex ht…

突破1300件!腾讯数据安全专利授权量最新成绩出炉

今天是世界知识产权日,跟大家汇报一下我们在数据安全专利工作上的进展。 截至2023年4月,腾讯共获得数据安全相关专利授权量超过1300件、申请公开量超过1800件,涵盖数据加解密、数据库访问、数据分级分类、数据备份、数据防泄漏、机密计算等多…

音视频八股文(9)-- flv的h264六层结构和aac六层结构

flv介绍 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积⼩、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。 FLV封装格式是由⼀个⽂件头(file header)…

概述篇——01 计算机网络概述

一、什么是计算机网络 计算机网络主要由一些通用的、可编程的硬件互连而成,通过这些硬件,可以传送不同类型的数据,并且可以支持广泛和日益增长的应用; 计算机网络不只是软件概念,还包含硬件设备;计算机网…

【Mysql】基础篇:DML(data manipulation language)语句:增、删、改数据库数据总结

博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: Mysql从入门到精通近期目标:写好专栏的每一篇文章 目录 一、…

微搭低代码实现下拉框动态填充值

有个粉丝问我,微搭的下拉框如何自动填充值 想问一下,下拉控件需要绑定数据源里面的列表,这个需要怎么做,自己研究了蛮久也没弄出来,需要参考您哪一篇教程? 一般你字段设置为枚举类型就可以,如果…

数据结构入门(二)——单链表(增,删,查,改)

1.单链表的概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实现的。 1.2链表的结构 我们给int重新定义一下新类型叫做SLDataType…

开源Stylegan人脸生成预训练模型

最近在研究Stylegan对抗式图像生成网络,使用了网络的一些预训练模型生成相应的图像,感觉非常有趣。下面开源一些我找到了预训练模型和代码,供大家一起玩。 Stylegan2官方给出的是TensorFlow版本的,费了半天劲找出了pytorch版本 这…

【五一创作】【Midjourney】Midjourney 连续性人物创作 ① ( 通过垫图方式生成类似图像 )

文章目录 一、Midjourney 生成图像二、通过垫图方式生成类似图像 一、Midjourney 生成图像 Midjourney 可以生成高质量的图像 , 但是 生成过程有很大的随机性 , 输入同样的提示词指令 , 其输出结果也存在很大的不同 ; 如果要 生成稳定的人物角色 , 场景 , 描述连贯的内容 , 这…

RMAN-03009、ORA-19566数据文件坏块报错处理方法

在备份数据库的时候,出现RMAN-03009、ORA-19566报错: RMAN-03009: backup 命令 (c3 通道上, 在 04/29/2023 10:58:11 上) 失败 ORA-19566: 超出损坏块限制 0 (文件 E:\APP\ADMINISTRATOR\ORADATA\JHSEMR\JHEMR2.DBF) 继续执行其他作业步骤, 将不重新运行…

React--》一些不常见的hook函数讲解

目录 Hook函数 useImperativeHandle useLayoutEffect和useInsertionEffect与useEffect区别 useDebugValue useDeferredValue useTransition Hook函数 关于React中的钩子函数,在我之间的文章中讲解完我们已经非常熟悉了,钩子函数的功能非常强大而它…

编译安卓系统源码时异常处理

编译安卓系统源码时异常处理 提示语法错误,如下所示: FAILED: out/target/product/generic/system-qemu.img /bin/bash -c "(export SGDISKout/host/linux-x86/bin/sgdisk SIMG2IMGout/host/linux-x86/bin/simg2img; device/generic/goldfis…

新安装的ubuntu,遇到的问题记录

镜像版本: https://mirror.nju.edu.cn/ubuntu-releases/22.04/ubuntu-22.04.1-live-server-amd64.iso 安装后无法切换 root 用户: 问题截图: null 解决办法: 解决ubuntu操作系统默认没有创建root账户: 1、sudo passwd …

云原生CAx软件:多租户的认证

云原生CAx软件是在设计时便将云平台作为部署、运行环境的CAx软件。通常,为了降低成本、方便管理,云原生CAx系统需要能为多个租户提供服务,即多租户(Multi-tenancy),而实现这种多租户系统,关键是要处理好身份认证、权限…

PhotoShop如何使用图层之实例演示?

文章目录 0.引言1.创建简单的立体书效果图2.给人像制作逼真的影子3.用调整图层除去图像中的灰色4.制作有质感的口红颜色5.给黑白图像上色6.制作粉笔文字效果 0.引言 因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程…

Packet Tracer - 配置 IPv6 静态路由和默认路由

Packet Tracer - 配置 IPv6 静态路由和默认路由 IPv6 地址分配表 设备 接口 IPv6 地址/前缀 默认网关 R1 G0/0 2001:DB8:1:1::1/64 不适用 S0/0/0 2001:DB8:1:A001::1/64 不适用 R2 G0/0 2001:DB8:1:2::1/64 不适用 S0/0/0 2001:DB8:1:A001::2/64 不适用 S0…

如何将图片恢复水平位置?图片旋转矫正方法大全,ddddocr作者基于RotNet的旋转验证码深度学习识别模型Rotate-Captcha-Crack

基于边缘检测的图像旋转校正模型: 该模型首先使用边缘检测算法对图像进行边缘检测,然后找到边缘上的直线,并计算直线的角度。最后通过旋转图像来校正图像的角度。 import cv2 import numpy as np# 加载图像 img cv2.imread(skewed_image.j…

【chatgpt】学习开源项目chatgpt-web,搭建自己的chatgpt服务,功能非常丰富有打字效果

目录 前言1,开源的chatgpt项目2,项目可以直接使用docker-compose跑起来3,关于打字模式SSE, octet-stream (打字特效)4,关于内容存储5,总结 前言 本文的原文连接是: https://blog.csd…