github actions实现CICD

基于 GitHub Actions + Docker实现 SpringBoot 项目自动部署

当我们开发 SpringBoot 项目时,如果需要对项目进行上线,传统方式就是先用mvn命令构建jar包,随后再使用java -jar命令运行jar包,当我们需要频繁地更改代码并上线时,这种方式是很繁琐的,所以需要借助一些CI工具让这整个流程自动化。

常见的CI工具有GitHub ActionsJenkins等,本文我主要讲解如何使用GitHub Actions来构建工作流,使用Jenkins也可以,但因为使用Jenkins的话需要额外下载相关依赖,还需要再专门的服务器上搭建该服务,而GitHub Actions直接依赖于github,不需要去安装任何东西,对于开发个人项目来说,我觉得还是很方便的,话不多说,下面开始讲解具体的操作步骤~

首先需要有一个GitHub仓库,在仓库页面点击Actions

在这里插入图片描述

进入Actions页面后会有很多选项提供选择,这些都是创建工作流的模板,你可以选择一个你想要的模板,也可以自己创建一个新的模板,因为我开发项目使用maven,所以这里我就选择了Java with Maven模板,如果你用的是gradle,可以选择gradle模板

在这里插入图片描述

点击config后,你的仓库会自动在根目录下创建一个.github/workflows文件夹,里面有一个maven.yml文件,这个yml文件就是用来设置工作流的,我们需要根据自己的需求去配置该文件,如jdk版本、打包命令、运行命令等。在介绍具体的yml配置之前,我们需要先创建自己的Secrets,因为在yml配置文件中涉及到连接服务器的操作,在连接服务器的时候我们需要再命令中加上服务器的ip和密码,为了防止密码暴露出去,我们需要用一个变量维护它,这个变量就是secrets,在仓库页面点击settings,随后点击左侧栏的secrets and variables,再点击下拉框的actions,随后创建secret即可,这个secret在创建后就无法再查看了,所以要记好。在使用的时候,格式为${{secrets.你定义的名字}}

在这里插入图片描述

下面介绍一下具体的工作流配置:

name: Java CI with Maven

on:
  push:
    branches: [ "master" ] # 当向master分支进行git push时触发该工作流
  pull_request:
    branches: [ "master" ] # 当向master分支合并分支时触发该工作流

# 工作流具体执行的任务
jobs:
  build:

    runs-on: ubuntu-latest # 运行在虚拟机上,指定虚拟机及其版本
	# 工作流步骤
	# 写在steps中
	# 每个 - 即代表一个任务
	# name:任务名字
	# uses:使用github提供的某个action,每个action都有不同的用途
    steps:
      - name: pull latest code
        uses: actions/checkout@v3 # 使用官方的checkout action,用于将仓库中的最新代码检查并拉取到工作目录中

      - name: Set up JDK 1.8
        uses: actions/setup-java@v3 # 安装java环境的action
        with:
          java-version: '8.0' # 指定jkd版本
          distribution: 'temurin'
          cache: maven # 使用maven缓存,避免每次构建项目时都要重新下载maven依赖

      - name: Build docker image
        run: | 									   # run:该步骤要执行的命令,| 代表可以有多条命令
          docker build -t dingsai-backend:0.1 .    # 构建docker镜像,命令最后的点代表Dockerfile所在目录
          docker save -o dingsai-backend.tar dingsai-backend:0.1 # 保存压缩后的docker镜像,这一步是为了方便后面我们将该镜像上传至指定的服务器

	 # 删除旧的docker镜像
	 # 使用sshpass以非交互式的用户名密码方式登录远程服务器
	 # 停止运行中的docker容器、删除该容器、删除镜像
	 # docker命令后面的两条竖线 || 代表当前面的docker命令执行失败时,命令可以继续往下执行,这样做的原因是在第一次构建项目的时候肯定不会存在这些容器和镜像,此时删除或停止这些容器就会失败
      - name: delete old docker image
        run: sshpass -p ${{secrets.REMOTE_SERVER01_PWD}} ssh -o StrictHostKeyChecking=no root@${{secrets.REMOTE_SERVER01_IP}} "docker stop dingsai-backend || true && docker rm dingsai-backend || true && docker rmi dingsai-backend:0.1 || true"

		# 删除旧的docker镜像压缩包
      - name: delete old docker tar
        run: sshpass -p ${{secrets.REMOTE_SERVER01_PWD}} ssh -o StrictHostKeyChecking=no root@${{secrets.REMOTE_SERVER01_IP}} "cd ${{secrets.REMOTE_PROJECT_CATALOGUE}} && rm -f dingsai-backend.tar"
		# 上传新的docker镜像
      - name: upload new docker image and start-up script
        run: sshpass -p ${{secrets.REMOTE_SERVER01_PWD}} scp -r -o StrictHostKeyChecking=no ./dingsai-backend.tar root@${{secrets.REMOTE_SERVER01_IP}}:${{secrets.REMOTE_PROJECT_CATALOGUE}}
		# 加载tar文件,加载docker镜像
      - name: load new docker image
        run: sshpass -p ${{secrets.REMOTE_SERVER01_PWD}} ssh -o StrictHostKeyChecking=no root@${{secrets.REMOTE_SERVER01_IP}} "docker load -i ${{secrets.REMOTE_PROJECT_CATALOGUE}}/dingsai-backend.tar"
		# docker run 运行,启动容器
      - name: run project
        run: sshpass -p ${{secrets.REMOTE_SERVER01_PWD}} ssh -o StrictHostKeyChecking=no root@${{secrets.REMOTE_SERVER01_IP}} "docker run -d -p 8081:8081 --name dingsai-backend dingsai-backend:0.1"

上面我在yml文件中都标注了各个命令的含义,但还有一下需要注意的地方:

  • 使用ssh连接服务器的时候一定要加上-o StrictHostKeyChecking=no,因为在第一次连接服务器的时候,即便是使用的非交互式的sshpass命令,服务器也会询问你是否要建立连接,即总会出现一次交互,当在ssh命令中加上该参数后,代表不需要进行连接确认,可以直接建立连接
  • 指定java版本的时候一定要填8.0而不是1.8,写1.8会找不到版本!!!

在上面的工作都完成后,我们向master分支push代码:

在这里插入图片描述

如上所示,github触发了工作流,我们再看一下服务器上是否有对应的docker容器在运行:

在这里插入图片描述

成功运行!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
GitHub Actions是GitHub的持续集成服务,它可以帮助开发者通过自动化的构建、发布和测试来验证代码,从而尽快发现集成错误。\[2\]GitHub Actions由多个操作组成,比如抓取代码、运行测试、登录远程服务器、发布到第三方服务等等,这些操作被称为actions。一个workflow是一次持续集成的运行过程,由一个或多个jobs构成,每个job又由多个steps构成,每个step可以执行一个或多个命令(action)。\[3\] GitHub Actions允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用该脚本,这个脚本就是一个Action。开发者可以从GitHub社区共享的官方市场查找需要的Action,也可以自己编写Action并开源供其他人使用。Action可以通过指定commit、标签或分支来引用不同的版本。\[1\] 在使用GitHub Actions之前,需要了解持续集成/持续交付的概念、Git相关知识、Linux/Windows/macOS脚本相关知识以及Yaml基础语法。Yaml是一种用于配置文件的简洁易读的数据序列化格式。\[2\] GitHub Actions提供了Linux、Windows和macOS虚拟机来运行工作流程,也可以在自己的数据中心或云基础架构中托管自己的自托管运行器。通过在代码仓库中的.github/workflows目录下创建.yml文件,可以配置自动触发的工作流程。\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [GitHubActions详解](https://blog.csdn.net/unreliable_narrator/article/details/124468384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Github Actions](https://blog.csdn.net/SeriousLose/article/details/121476152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

neutron123ab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值