前言

最近这一周,我加入了奇奇怪怪的Team,我负责将编写的新接口打包并发布到服务器上。每次都需要手动执行打包、发布、关闭旧版本程序和启动新版本程序等繁琐的步骤,这让我感到非常不便,而且也非常重复。对于这种重复性的任务,我想到了可以利用机器来完成,于是决定尝试使用 GitHub 上的工作流。

需要准备的东西:

  • 掌握搜索引擎技能(保证一直是最新的知识。)
  • 一个大脑🧠
  • 一个GitHub的账号()
  • 掌握基础的git 操作
  • 你需要掌握一门语言例如 Java nodejs等这样才可以使用工作流

本篇就那我自己写的屎山 Spring Boot应用举例子吧

什么是Gitub-Actions?

GitHub Actions是自动化工作流程工具,用于自动化构建、测试、部署和集成软件项目。它通过一系列事件、触发器和任务来执行各种操作,以实现持续集成和持续交付。

GitHub允许你可以发布以及共享你自己的Actions,别人可以通过市场找到你的Actions从而不需要在重复造轮子了。

什么是CI/CD?

CI/CD是持续集成(Continuous Integration)与持续交付/持续部署(Continuous Delivery/Continuous Deployment)的缩写,是一种软件开发实践和方法论。

持续集成(CI)是指开发人员将其代码频繁地集成到共享代码存储库中,并通过自动化构建和测试流程来验证代码的正确性。这样可以确保团队成员的代码变更能够快速地集成到主干代码中,并减少代码集成过程中的错误。

持续交付(CD)是指将通过持续集成产生的软件交付给质量保证团队进行进一步的自动化测试、部署和发布。持续交付的目标是确保软件始终处于可部署状态,以便可以随时交付给用户。

持续部署(CD)是持续交付的进一步延伸,指将通过持续交付阶段产生的可部署软件自动地部署到生产环境中,使软件能够快速地、可靠地投入使用。

通过采用CI/CD实践,团队可以实现更快速、可靠、高质量的软件交付。自动化的构建、测试、部署和发布流程能够减少人为错误,提高开发团队的生产效率,并使软件交付过程更加可靠和可追踪。

以上文本来自chatGPT。

正文

Actions的概念:

  • workflow (工作流):一个工作流程是一系列的任务(jobs)和步骤(steps),定义了自动化的过程。
  • Job(任务):一个工作流程可以包含一个或多个任务,每个任务运行在独立的环境中。每个任务可以包含一系列的步骤,可以并行或顺序执行。
  • Step(步骤):每个任务包含一个或多个步骤,每个步骤代表一个操作,例如构建代码、运行测试、部署应用程序等。步骤是工作流程的最小单位。
  • Workflow file(工作流程文件):工作流程文件是以YAML格式编写的文件,用于定义工作流程的结构、任务和步骤。通常存储在代码仓库的特定目录中(如**.github/workflows**)。

差不多主要使用的也就这些了。

Workflow file(工作流程文件)

对于**Workflow file** 的,关键字非常多我这边放GitHub的文档地址,有需要的可以自己看看吧,**Workflow file** 使用yaml 文件类型编写。

一下是常见的关键字。

  • name :一般是和你的 Workflow file 文件字一样,改成其他的和省略也没啥事情。
1
name: Build and Publish Release
  • on :指定触发条件,例如 push frok等,例如我这里设置的是push 的检测分支中的 master 分支。

`on: push: branches:

  • master`
  • jobs :工作流运行由一个或多个 jobs 组成,默认情况下并行运行。 若要按顺序运行作业,可以使用 jobs.<job_id>.needs 关键字定义对其他作业的依赖关系。

例如我写的

我的仓库

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
name: Build and Publish Release  # 工作流名称

on:
push:
branches:
- master # 当代码推送到master分支时触发工作流程

jobs:
build-and-publish:
runs-on: ubuntu-latest # 在最新的Ubuntu操作系统上运行任务

steps:
- uses: actions/checkout@v3 # 使用GitHub官方的checkout action,用于检出代码库

- name: Set up JDK # 设置JDK
uses: actions/setup-java@master # 使用GitHub官方的setup-java action,用于安装和配置Java环境
with:
java-version: 8
distribution: "adopt"
cache: maven

- name: Build with Maven # 使用Maven构建项目
run: mvn package --batch-mode # 执行mvn package命令进行项目构建

- name: Create Release # 创建GitHub Release
id: create_release
uses: actions/create-release@v1 # 使用GitHub官方的create-release action,用于创建GitHub Release
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }} # 设置GitHub令牌作为环境变量
with:
tag_name: Release-${{ github.run_number }} # 设置Release的标签名称
release_name: Release ${{ github.run_number }} # 设置Release的名称
draft: false # 是否是草稿状态
prerelease: false # 是否是预发布状态

- name: List files # 列出文件
run: ls -R # 执行ls -R命令,列出工作目录下的文件和子目录

- name: Display directory tree # 显示目录树
run: tree # 执行tree命令,以树状结构显示工作目录的内容

- name: Release JAR # 发布JAR文件
id: upload_jar
uses: actions/upload-release-asset@v1 # 使用GitHub官方的upload-release-asset action,用于上传Release的附件
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }} # 设置GitHub令牌作为环境变量
with:
upload_url: ${{ steps.create_release.outputs.upload_url }} # 设置上传URL
asset_path: ./controller/target/controller-1.0.jar # 设置要上传的JAR文件路径
asset_name: controller-jar # 设置JAR文件的名称
asset_content_type: application/java-archive # 设置JAR文件的内容类型

- name: rm Jar # 删除JAR文件
uses: appleboy/ssh-action@master # 使用appleboy的ssh-action,用于在服务器上执行SSH命令
with:
host: ${{ secrets.SERVER_HOST }} # 设置服务器主机
username: ${{ secrets.SERVER_USERNAME }} # 设置服务器用户名
key: ${{ secrets.SSH_KEY }} # 设置SSH密钥
script: |
bash ${{secrets.SERVER_SHFILE}}/SpringBootStart-guosai.sh
cd /${{secrets.SERVER_FILE}}/controller/target/
rm -rf controller-1.0.jar

- name: upload jar # 上传JAR文件到服务器
uses: appleboy/scp-action@master # 使用appleboy的scp-action,用于将文件复制到远程服务器
with:
host: ${{ secrets.SERVER_HOST }} # 设置服务器主机
username: ${{ secrets.SERVER_USERNAME }} # 设置服务器用户名
key: ${{ secrets.SSH_KEY }} # 设置SSH密钥
source: ./controller/target/controller-1.0.jar # 设置本地要上传的JAR文件路径
target: ${{secrets.SERVER_FILE}}/ # 设置远程服务器上的目标路径

- name: Execute shell scripts on server # 在服务器上执行shell脚本
uses: appleboy/ssh-action@master # 使用appleboy的ssh-action,用于在服务器上执行SSH命令
with:
host: ${{ secrets.SERVER_HOST }} # 设置服务器主机
username: ${{ secrets.SERVER_USERNAME }} # 设置服务器用户名
key: ${{ secrets.SSH_KEY }} # 设置SSH密钥
script: |
cd /${{secrets.SERVER_FILE}}/controller/target/
ps -ef | grep controller-1.0.jar | grep -v grep | awk '{print $2}' | xargs kill -9
nohup java -jar controller-1.0.jar > nohup.out &
exit

上面的

  • SERVER_FILE
  • SERVER_HOST
  • SERVER_USERNAME
  • SSH_KEY
  • TOKEN

其中 这些都在仓库设置的机密设置进行设置,你也可以自己按需修改名字。

引用

我自己的GitHub 仓库:https://github.com/biliblihuorong/Bicarbon-MES

GitHub Actions官方文档:https://docs.github.com/zh/actions/using-workflows/workflow-syntax-for-github-actions

阮一峰大佬的 GitHub Actions 博文:https://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html

以及Chat GPT的大力协助。