赞
踩
相信关注技术前沿的同学,多少也了解过 GitHub Actions
小年我碰巧最近遇上使用的需求,体验了一番之后,感觉两个字:真香!
GitHub Actions 是 GitHub 推出的持续集成(Continuous Integration,简称 CI)服务,它提供了整套虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目等等操作。
持续集成(CI \ CD)主要有三个: 持续集成、持续交付、持续部署。
我们一般的软件开发流程是:
- 开发人员本地代码 commit
- 通过 git hook 触发自动化测试
- 测试通过后,合并发布分支
- 通过 git hook 触发自动部署服务
这里简单的描述了软件开发周期,当然实际上会更加复杂。
我们可以看到,CI \ CD 是由很多操作组成的,比如执行自动化测试、分支合并、服务部署等,而 GitHub 把这一系列的操作都称为 Actions。
当然 GitHub 创新点还不仅于此,不同的项目可能都会使用到相类似的 Action,GitHub 允许开发者把 action 写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。
GitHub 提供一个官方市场:GitHub Action Market ,在这里可以搜索到你想要的任何 actions,直接引用别人造好的轮子。
GitHub Actions 主要有以下几个概念
Workflows
工作流,可以添加到存储库中的自动化过程。工作流由一个或多个作业组成,可以由事件调度或触发。
Event
事件,触发工作流的特定动作。例如,向存储库提交 pr 或 pull 请求。
Jobs
作业,在同一跑步器上执行的一组步骤。默认情况下,具有多个作业的工作流将并行运行这些作业。
Steps
步骤,可以在作业中运行命令的单个任务。步骤可以是操作,也可以是 shell 命令。作业中的每个步骤都在同一个运行程序上执行,从而允许该作业中的操作彼此共享数据。
Actions
操作是独立的命令,它们被组合成创建作业的步骤。操作是工作流中最小的可移植构建块。你可以创建自己的动作,或者使用 GitHub 社区创建的动作。
Runners
运行器,安装了 GitHub Actions 运行器应用程序的服务器。。Github 托管的运行器基于 Ubuntu Linux、Microsoft Windows 和 macOS,工作流中的每个作业都在一个新的虚拟环境中运行。
闲话少说,咱们先通过简单的实例来体验一下 GitHub Action 的玩法。
例子比较简单,主要通过 GitHub Action 监听代码 push 事件,并发送邮件。(前提是邮箱需要开通 SMTP 服务)
第一步,在项目中 ./github/workflows/
路径下添加 .yml 或者 .yaml
文件,名字可以随便取。在这里我取名为 github-action-demo.yml
下面是 github-action-demo.yml
的内容:
name: GitHub Action Demo on: [push] jobs: build: runs-on: ubuntu-latest steps: # copy git 仓库到虚拟机上 - name: 'Checkout codes' uses: actions/checkout@v1 # 获取最新一条提交的git log - name: Get Git Log id: git_log uses: Edisonboy/latest-git-log-action@main with: tag: origin/master # 发送邮件 - name: Send email uses: dawidd6/action-send-mail@v3 with: server_address: smtp.qq.com server_port: 465 username: ${{secrets.MAIL_USERNAME}} password: ${{secrets.MAIL_PASSWORD}} subject: Github Actions job result to: ${{secrets.MAIL_TOUSERNAME}} from: ${{secrets.MAIL_USERNAME}} body: ${{github.repository}} push log : ${{steps.git_log.outputs.log}}
这个 .yml 文件就是对 GitHub Action 的定义,这里大概讲解一下主要的步骤,有关具体的语法,下文面再详解
on: [push]
项目 push 的时候触发jobs.build.runs-on
运行在ubuntu
的虚拟机上jobs.build.steps
定义了不同的步骤,如上注释
第二步,配置参数
聪明的同学可能还会问,那文件上的 ${{XXX}}
变量又是从何而来,哪里定义的呢?
上面的实例只要使用了两种类型的参数变量:
secrets.XXX
: GitHub 允许仓库所有者创建和管理需要保密性的参数。例如邮件的账号和密码都是属于敏感参数。
可以通过项目 Settings -> Secrets -> Actions 配置密码,在这里我们添加 MAIL_USERNAME
、MAIL_PASSWORD
、MAIL_TOUSERNAME
三个配置参数(注意:这里的密码是指 SMTP 服务的授权密码)
上下文:可以访问工作流程运行、运行器环境、作业及步骤相关信息的方式
${{github.repository}}
:当前仓库的的所有者和仓库名称。例如 Edisonboy/ActionDemo
${{steps.git_log_outputs.log}}
:获取step id 为 git_log 的输出集第三步,因为我们定义 push 为触发条件,所以当我们只有push 代码后,我们定义的 GitHub Action 才会被执行。然后在 GitHub 上的 Action 能够实时看到当前的执行状态。
等运行完后,咱们就能收到 git push 的日志邮件了!!!
实例地址:Edisonboy/ActionDemo
参考:利用 GitHub Actions 实现 github 代码同步 gitee 仓库
结合上面的例子,咱们简单学习一下 workflow 的语法。
workflow 文件必须存储在仓库的 .github/workflows
的目录中,扩展名为 .yml
或 .yaml
workflow 的名称, GitHub 在仓库的操作页面上显示 workflow 的名称。
触发 workflow 的 GitHub 事件的名称。
# 单个事件
on: push
# 多个事件列表
on: [push, pull_request]
# 指定main分支的push
on:
push:
branches:
- main
还可以使用定时调度:
on:
schedule:
- cron: '*/30 5,17 * * *'
作业,workflow 主要执行的核心任务。
每项作业必须关联一个 ID。例如上面实例的 ID 为 build
作业显示在 GitHub 上的名称。
识别在此作业运行之前必须成功完成的任何作业。
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
在此示例中,job1
必须在 job2
开始之前成功完成,而 job3
要等待 job1
和 job2
完成。
要运行作业的机器类型。 机器可以是 GitHub 托管的运行器或自托管的运行器。
可用的 GitHub 托管的运行器类型包括:
步骤,每个 Job 包含一个或多个步骤。步骤可以是运行命令、运行设置任务,或者运行仓库中的操作和 Dcoker 镜像发布等。
例如上面实例定义了 3 个步骤 :
每个步骤都可以定义以下几个字段:
jobs..steps[*].id : 步骤的唯一标识符
jobs..steps[*].name : 步骤显示在 GitHub 上的名称
jobs..steps[*].if : 自定义表达式,判断是否满足条件
jobs..steps[*].uses : 选择公共仓库中、或发布 Docker 容器映像作为一部分运行的操作。例如上面的实例都是使用了公共仓库提供的操作
jobs..steps[*].run : 运行 shell 命令程序。
有关 workflow 语法更多的细节使用可以参考: GitHub Actions 官方文档
在执行 workflow 的过程中,GitHub 会自动为我们提供相应的虚拟服务器资源,这时候脑洞大的同学就应该想到:有没有可能连接到这个服务器,白嫖一个服务器为所欲为呢。
看了一下 GitHub Actions 官方文档上提供的虚拟服务器资源,这个配置比一台低配个人服务器还香。
Windows 和 Linux 虚拟机的硬件规格:
- 2 核 CPU
- 7 GB RAM 内存
- 14 GB SSD 硬盘空间
MacOS 虚拟机的硬件规格:
- 3 核 CPU
- 14 GB RAM 内存
- 14 GB SSD 硬盘空间
有兴趣的同学可以参考:SSH 连接到 GitHub Actions 虚拟服务器
还有更硬核的操作! 黑客可谓把白嫖发挥得淋漓尽致,尽然想到利用 GitHub 的服务器挖矿 (详情:黑客用GitHub服务器挖矿,三天跑了3万个任务,代码惊现中文)
当然 GitHub Actions 也没有这么傻,肯定想到咱们白嫖的各种骚操作,所以对于使用增加了一定的限制
总的来说,GitHub Actions 是一个非常实用有趣的功能,没有你做不到的,只有你想不到的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。