Github Actions 使用指南和Android 持续集成示例
Posted 薛瑄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Github Actions 使用指南和Android 持续集成示例相关的知识,希望对你有一定的参考价值。
前言
Github Actions 官方文档(以下所有的官方文档的总入口)对很多细节都进行了详细说明,但是如果你是第一次接触,看了很多关于细节的东西,不知所云,导致很快忘记。本篇文章,从我项目的代码,从总体上,认识一下Actions。文章最后,我会把一些重要的官方文档贴出 ,学会这些基础的,再看其他的文档也就更能掌握
Github Actions
当代码push后,符合配置的条件,就会自动运行指定的操作。Github Actions 提供了免费硬件(查看配置) ,来实在持续集成的操作。
这些流程,通过项目中的yml文件来配置。
术语
- workflow
表示一次持续集成的过程 - job
表示构建任务,每个 workflow 可以由一个或者多个 job 组成,可支持并发执行 job,所有 job 执行完也就代表着 workflow 结束 - step
每个 job 由一个或多个 step 组成,按顺序依次执行 - action
每个step 由一个action组成, github 已经提供了一个[action 市场],可以搜索到各种第三方 actions,自由组合这些actions,来实现更复杂的操作
查阅了很多文章(GitHub Actions 入门教程,Github Actions 尝鲜),都说每个 step 由一个或多个 action 组成,但是在具体的开发过程中,发现steps的列表中并没有字段让我们设置多个action,uses只能设置一个action。更有文章甚至把step和action搞混
每个 step 由一个或多个 action 组成,按顺序依次执行,这里 action 需要特别说明一下,action 是可以是自定义脚本或引用第三方的脚本,依赖着 github 开源社区,许多 action 都可以直接复用(也可自己编写),github 已经提供了一个action 市场,可以搜索到各种第三方 actions,并且官方也提供了许多 actions。
示例
下面通过示例,来看看具体如何使用。下面是android的持续集成yml文件,
# workflow的名称,会显示在github 的项目的Actions的右边列表中,如下图
name: DEBUG_CI
# 在满足以下条件触发这个workflow
on:
push:
# 在指定的远程分支上,发生推送
branches:
- dev
# 指定文件发生修改
paths:
- 'config.gradle'
jobs:
# 多个job,如果有多个,每个以“-”开头
first-job:
# 该job 运行的系统环境,支持ubuntu 、windows、macOS
runs-on: ubuntu-latest
steps:
# 下面是多个step ,每个以“-”开头
# step:检查分支
- uses: actions/checkout@v1
# step:设置jdk版本
# step 名称
- name: set up JDK 1.8
# 引用公共action
uses: actions/setup-java@v1
with:
# 设置参数
java-version: 1.8
# step:打包apk
- name: Build with Gradle
# 运行命令
run: chmod +x gradlew &&./gradlew assembleDebug
#step:上传apk 到action,在右上角查看
# 官方文档 https://help.github.com/cn/actions/automating-your-workflow-with-github-actions/persisting-workflow-data-using-artifacts#uploading-build-and-test-artifacts
- name: Upload APK
uses: actions/upload-artifact@v1
with:
name: app
path: app/build/outputs/apk/debug/xw-debug.apk
# step:向蒲公英上传文件
- name: Upload To Pgyer
uses: JantHsueh/upload-file-action@master
with:
url: https://www.pgyer.com/apiv2/app/upload
method: POST
# $ secrets.pgyer_key 使用秘钥,如何设置下面会介绍
forms: '"_api_key":"$ secrets.pgyer_key ","buildInstallType":3'
fileForms: '"file":"app/build/outputs/apk/debug/xw-debug.apk"'
#step: 获取apk版本号
- name: Get Apk Info
#step id
id: apk
uses: JantHsueh/get-apk-info-action@master
with:
apkPath: app/build/outputs/apk/debug/xw-debug.apk
#获取指定时区的时间
- name: Get Time
id: time
uses: JantHsueh/get-time-action@master
with:
timeZone: 8
# 调用接口修改数据库的版本号
- name: Update SoftwareVersion
uses: JantHsueh/webrequest-action@master
with:
url: https://www.adsff123.com/app/guest/updateSoftwareVersion
method: POST
# $ steps.apk.outputs.versionCode 使用id为apk的step的输出参数versionCode
payload: '"id":1,"softwareType":1,"recommend":1,"versionDesc":"App自动发布成功,时间 $ steps.time.outputs.time \\n5分钟后再点更新 \\n8分钟后也可以 \\n10分钟后最好","version":"$ steps.apk.outputs.versionNum ","versionNum":$ steps.apk.outputs.versionCode '
headers: '"Content-Type": "application/json","authorization":"$ secrets.update_software_version_key ","platform":"android"'
#获取git log
- name: Get git log
id: git_log
uses: JantHsueh/get-git-log-action@master
with:
tag: release
# 向钉钉发送消息
- name: dingtalk
uses: JantHsueh/webrequest-action@master
with:
url: $ secrets.dingtalk_webhook
method: POST
payload: '"msgtype": "text", "text": "content": "西雾代理商-测试版(debug)-App更新-版本号: $ steps.apk.outputs.versionNum ,可直接在App中更新到最新版 \\n 距上个正式版的更新记录: \\n$ steps.git_log.outputs.log "'
headers: '"Content-Type": "application/json"'
每个step 使用的action 如下:
-
编译打包
执行命令 chmod +x gradlew &&./gradlew assembleDebug -
上传到蒲公英 https://github.com/JantHsueh/upload-file-action 这个action 可以上传任何文件到任何地址,可自由设置参数
-
获取git 的提交log日志 https://github.com/JantHsueh/get-git-log-action
每一项都给出github地址,使用方式,我在README.md都写了详细说明,欢迎大家start这些Actions项目
配置workflow
上面介绍的workflow YAML文件,需要放在项目根目录下:.github/workflows/
例如:.github/workflows/debug-workflow.yml
官方文档: 配置工作流程
不同job之间对的数据传递
官方文档: 使用构件持久化工作流程数据
action参数的输出输入
参考了 官方文档创建 JavaScript Action中 —— 在工作流程中测试您的操作 的示例
设置秘钥
官方文档: Creating and using encrypted secrets
自定义Action
有两种创建Action的方式:
- 创建 JavaScript Action,就是在Node.js 开发功能
- 创建 Docker 容器 Action,这种是创建一个docker 容器,可以实现的操作就非常自由了
Action 返回值是json如何使用:
在上面的示例中,都是返回一个参数例如一个int,一个string,那如果返回json,该如何引用呢?
官方文档没有明确的说明,我在这个项目中,看到有这样的使用,大概是下面这样,是在Ubuntu命令下解析json。但是我想把json中的指定参数作为下一个step 中action的参数传入,始终不行。
run: |
$output = '$ steps.webhook.outputs.output ' | ConvertFrom-Json
Write-Host "Time from output $($output.time) statusCode $($output.statusCode) data $($output.data)"
请点赞、收藏,感谢大家的支持,有任何疑问可在评论区回复
结语
主要的基本内容就这些,掌握这些后,再去细看官方文档,思路会更清楚。官方文档很多都是中文的,而且写得也很清楚,就不再赘述
以上是关于Github Actions 使用指南和Android 持续集成示例的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 GitHub Actions 中的 Actions 之间保留 WORKDIR?
如何使用 Github Actions 发布对 Docker 镜像的更改
Github Actions 使用指南和Android 持续集成示例