Github Actions 自动化部署

准备工作

线上访问地址

Github Actions

概述

  • GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。
  • GitHub Actions 不仅仅是 DevOps,还允许您在存储库中发生其他事件时运行工作流程。 例如,您可以运行工作流程,以便在有人在您的存储库中创建新问题时自动添加相应的标签。
  • GitHub 提供 LinuxWindowsmacOS 虚拟机来运行工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。

术语

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow
  • job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
  • step (步骤):每个 job 由多个 step 构成,一步步完成。
  • action (动作):每个 step 可以依次执行一个或多个命令 action

工作流(workflows)

工作流程(workflows)是一种可配置的自动化流程,将运行一个或多个作业。工作流由签入存储库的 YAML 文件定义,并将在存储库中的事件触发时运行,也可以手动触发或按定义的计划触发。

yml 复制代码
# 工作流的名称,如果省略,则使用当前文件名
name: GitHub Actions Build Docs
# 从工作流生成的工作流运行的名称,如果省略,则使用提交时的commit信息
run-name: Deploy by @${{ github.actor }}
# 触发部署的条件
on:
  # 每当 push 到 main 分支时触发部署
  push:
    branches:
      - main
jobs:
	build-and-deploy:
  # 运行所需要的虚拟机环境
  	runs-on: ubuntu-latest
    ...
  ...

workflows 工作流配置如下:

  • name 工作流的名称,如果省略,则使用当前文件名
  • runs-name 从工作流生成的工作流运行的名称,如果省略,则使用提交时的 commit 信息
  • on 指定工作流的触发器,对特定分支、路径或标签执行指定操作时触发工作流的运行
  • jobs 工作流下的任务组合

任务(jobs)

任务(jobs)是 workflow 的基本单元,一个 workflow 可以由多个 job 组成,每个 job 之间是并行关系,可以同时执行,也可以依赖关系,一个 job 执行完毕后再执行另一个 job

yml 复制代码
# 当前流程要执行的任务,可以是多个。[build-and-deploy]就是一个任务
jobs:
  build-and-deploy:
    # 运行所需要的虚拟机环境
    runs-on: ubuntu-latest

    # 每个任务下的运行步骤,短横杠 - 表示一个步骤,从上至下依次执行。
    steps:
      # clone 该仓库的源码到工作流中
      - name: Checkout
        uses: actions/checkout@v3
        with:
          # "最近更新时间"等 git 日志相关信息,需要拉取全部提交记录
          fetch-depth: 0
      # 安装 Node 环境
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          # 选择要使用的 node 版本
          node-version: '16'
      ...
 	...

job 任务配置如下:

  • name 任务的名称,不设置则默认 build-and-deploy
  • runs-on 运行所需要的虚拟机环境
  • need 设置当前任务需要依赖的任务名称
  • steps 任务下的步骤组合,短横杠 - 表示一个步骤,从上至下依次执行

步骤(step)

步骤(step)是 job 的基本单元,一个 job 可以由多个 step 组成,每个 step 之间是串行关系,一个 step 执行完毕后再执行另一个 step

yml 复制代码
# 每个任务下的运行步骤,短横杠 - 表示一个步骤,从上至下依次执行。
steps:
  # clone 该仓库的源码到工作流中
  - name: Checkout
    uses: actions/checkout@v3
    with:
      # "最近更新时间"等 git 日志相关信息,需要拉取全部提交记录
      fetch-depth: 0
  # 安装 Node 环境
  - name: Setup Node.js
    uses: actions/setup-node@v3
    with:
      # 选择要使用的 node 版本
      node-version: '16'
  		...
  	...
  ...

step 运行步骤下短横杠 - 表示一个步骤,具体如下:

  • name 步骤的名称
  • run 需要运行的命令行程序 如:npm run build
  • uses 一般直接使用别人预先设置好的 actions 如:actions/setup-node@v3 用来安装 Node 环境
  • with 使用不同的 actions 需要不同的参数,如:node-version: '16' 用来选择安装的 Node 版本

动作(action)

动作(action)是 step 的基本单元,一个 step 可以由多个 action 组成,每个 action 之间是串行关系,一个 action 执行完毕后再执行另一个 action,更多详情请参考 About custom actions

所有的 action 都是在 GitHub 上开源的,可以在 GitHub Marketplace 上找到。

yml 复制代码
# 每个任务下的运行步骤,短横杠 - 表示一个步骤,从上至下依次执行。
steps:
  # clone 该仓库的源码到工作流中
  - name: Checkout
		# 使用 actions/checkout@v3 动作
    uses: actions/checkout@v3
    with:
      # "最近更新时间"等 git 日志相关信息,需要拉取全部提交记录
      fetch-depth: 0
  # 安装 Node 环境
  - name: Setup Node.js
		# 使用 actions/setup-node@v3 动作
    uses: actions/setup-node@v3
    with:
      # 选择要使用的 node 版本
      node-version: '16'
  		...
  	...
  ...

创建工作流

在需要部署的项目跟路径下新增 .github/workflows 目录,并添加 deploy.yml 配置文件【配置文件名称可自由定义 xxx.yml】,如下图所示:

deploy.yml 配置文件完整内容如下:

yml 复制代码
# 工作流的名称,如果省略,则使用当前文件名
name: GitHub Actions Build Docs

# 从工作流生成的工作流运行的名称,如果省略,则使用提交时的commit信息
run-name: Deploy by @${{ github.actor }}

# 触发部署的条件
on:
  # 每当 push 到 main 分支时触发部署
  push:
    branches:
      - main

# 当前流程要执行的任务,可以是多个。[my_first_job]就是一个任务
jobs:
  build-and-deploy:
    # 运行所需要的虚拟机环境
    runs-on: ubuntu-latest

    # 每个任务下的运行步骤,短横杠 - 表示一个步骤,从上至下依次执行。
    steps:
      # clone 该仓库的源码到工作流中
      - name: Checkout
        uses: actions/checkout@v3
        with:
          # "最近更新时间"等 git 日志相关信息,需要拉取全部提交记录
          fetch-depth: 0

      # 安装 Node 环境
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          # 选择要使用的 node 版本
          node-version: '16'

      # 如果你的依赖是使用 pnpm 的,用这种
      # 缓存 pnpm node_modules
      - name: Cache dependencies
        uses: pnpm/action-setup@v2
        with:
          version: ^7.0

      # 安装依赖 pnpm
      - name: Install dependencies
        run: pnpm install

      # # 如果你的依赖是使用 npm 的,用这种
      # # 缓存 npm node_modules
      # - name: Cache dependencies
      #   uses: actions/cache@v3
      #   with:
      #     path: ~/.npm
      #     key: ${{ runner.os }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
      #     restore-keys: |
      #       ${{ runner.os }}-npm-cache-

      # # 安装依赖 npm
      # - name: Install dependencies
      #   # 如果没有命中缓存才执行 npm install
      #   if: steps.cache-deps.outputs.cache-hit != 'true'
      #   run: npm install

      # 如果你的依赖是使用yarn的,用这种
      # 缓存 yarn node_modules
      # - name: Cache dependencies
      #   uses: actions/cache@v3
      #   id: yarn-cache
      #   with:
      #     path: |
      #       **/node_modules
      #     key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
      #     restore-keys: |
      #       ${{ runner.os }}-yarn-

      # 安装依赖 yarn
      # - name: Install dependencies
      #   # 如果没有命中缓存才执行 npm install
      #   if: steps.npm-cache.outputs.cache-hit != 'true'
      #   run: yarn --frozen-lockfile

      # 运行构建脚本
      - name: Run Build Script
        run: npm run docs:build

      # 部署到 GitHub Pages
      - name: Deploy to GitHub Pages
        # 此actions的官方文档 https://github.com/JamesIves/github-pages-deploy-action
        uses: JamesIves/github-pages-deploy-action@v4
        with:
          # 要部署的文件夹,必填,build 构建后的打包文件夹
          FOLDER: docs-dist
          # 希望部署的分支,默认gh-pages
          BRANCH: gh-pages
          # 默认情况是不需要填的,如果您需要更多权限,例如部署到另一个存储库才需要填写
          # TOKEN_NAME 对应 GitHub Secrets 中设置的字段【配置详细步骤在文章下面内容中】,不要照搬
          # 仓库范围的访问令牌,可以将个人令牌的值存储在 GitHub Secrets 中
          TOKEN: ${{ secrets.TOKEN_NAME }}
          # 部署到GitHub的不同仓库 <用户名>/<仓库名>
          # 此选项必须配置了TOKEN才能正常执行
          REPOSITORY-NAME: niezicheng/projectName

配置 GitHub Secrets

GitHub Secrets 是一种存储加密信息的方式,可以在 GitHub 仓库中使用。例如,如果你的工作流程需要使用 API 密钥,那么你可以将其存储在 GitHub Secrets 中,然后在工作流程中引用它。详细的配置可以查看我的另一篇文章 Github 个人令牌

设置部署分支

依据 .github/workflows/deploy.yml 中设置的部署分支【BRANCH: gh-pages】在 github 项目中进行分支配置选择。如下图所示:

![image-20231129195305650](/Users/10036514/Library/Application Support/typora-user-images/image-20231129195305650.png)

Github Pages 部署分支是否确可以在项目中点击 Settings => Pages 页面查看,如下图所示:

配置 Actions permissions

如果执行工作流遇到权限问题,可以查看 项目(arvin-components) => Settings => Actions【General】 页面权限是否正确,如下图所示:

部署、访问

当我们在 main 分支提交代码时,会自动触发 GitHub Actions 的工作流程,自动构建并部署到 GitHub Pages,如下图所示:

部署成功后,我们可以在 GitHub Pages 中查看部署后的项目线上地址,如下图所示:

结语

GitHub Actions 是一个非常强大的工具,可以帮助我们自动化构建、测试、部署等等,可以说是 CI/CD 的一种实现方式。本文只是简单的介绍了 GitHub Actions 的使用,更多的功能还需要大家自己去探索。

参考资料

GitHub Actions 入门教程

GitHub Docs Actions

相关推荐
吃杠碰小鸡40 分钟前
commitlint校验git提交信息
前端
虾球xz1 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇1 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒1 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员2 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐2 小时前
前端图像处理(一)
前端
程序猿阿伟2 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
疯狂的沙粒2 小时前
对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?
前端·javascript·typescript
瑞雨溪2 小时前
AJAX的基本使用
前端·javascript·ajax
力透键背2 小时前
display: none和visibility: hidden的区别
开发语言·前端·javascript