-
Notifications
You must be signed in to change notification settings - Fork 27
Description
之前对 GitHub Actions 不是特别熟悉,以为它适合于跑类似于脚本语言 Python,不太适合与 Java 这类需要借助于 JVM 的语言,恰好最近有一个简单的想法就是想把 Chrome 书签同步到 Github,并将书签生成 README.md 文件,就尝试下用 GitHub Actions 去构建 Java,实际验证了其实是可行的,GitHub Actions 完全可以跑 Java做一些自动化操作。
什么是 GitHub Actions
官网的定义就是:
在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。 您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。
做 Java 的其实都知道 Jenkins,其实就是和 Jenkins差不多,用于自动化构建的,只不过 GitHub Actions基于 Github 平台。
你只要在你的仓库下,创建.github/workflow目录,并在此目录下创建*.yml的文件,就可以开启 GitHub Actions,yml 文件主要用于配置自动化构建,这里我就拿我的这次实践的chrome_bookmarks_sync.yml示例:
# 此 action 的名字
name: ChromeBookmarksSyncApplication
on:
# 开启手动执行
workflow_dispatch:
# 触发条件,当有代码push到master分支的时候,就触发一次构建
push:
branches: [ master ]
# 触发条件,当有pr发起的时候,就触发一次构建
pull_request:
branches: [ master ]
# 自定义的环境变量,实际需要换成你自己的
env:
GITHUB_NAME: superleeyom
GITHUB_EMAIL: [email protected]
# 任务
jobs:
build:
# 设置系统环境
runs-on: ubuntu-latest
steps:
# 检出代码
- uses: actions/checkout@v2
# 设置jdk版本号
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# 执行maven命令,进行编译,并执行脚本,生成 README.md
- name: execute application
run: mvn -B clean compile exec:java --file pom.xml
# 提交代码
- name: update README.md
uses: github-actions-x/[email protected]
with:
github-token: ${{ secrets.G_TOKEN }}
commit-message: ":memo: update README.md"
files: README.md
rebase: 'true'
name: ${{ env.GITHUB_NAME }}
email: ${{ env.GITHUB_EMAIL }}更多的 GitHub Actions用例,可以参考官方的文档。
实现思路
其实思路很简单,首先使用 Chrome 插件「书签同步」,将书签信息(bookmark.json)上传到 Github 仓库,然后通过 github action 去读取书签数据,然后生成 README.md 文件。
没法科学上传的前提下,可以通过CrxDL.COM去下载该插件,关键字搜索「书签同步」进行下载安装,设置流程的话,参考插件使用指南:
-
登录Github,在
Settings->Personal access tokens->Generate new token生成一个访问 token -
生成的 token 需要勾选 repo 权限,保存生成的 token
-
点击插件 icon,依次输入用户名、凭据、仓库名、文件存放路径(在仓库提前创建好
*.json文件) -
如果需要记住用户数据,需要打开
Remember Me开关 -
填写完用户数据后,便可以进行「上传」或「下载」操作
自动化构建
由于项目是用 Maven 构建的,所以我当时的想法是通过用 mvn clean package 命令,写个单元测试方法,去触发并执行 Java 类方法,后面经过试验发现是可行的,但是觉得此方法比较 low 啊,应该是还有其他方法的,后面经过查询资料,其实 Maven 是可以通过插件 exec-maven-plugin,运行 Java main 方法:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<!-- 指定main方法入口 -->
<mainClass>com.bookmark.action.ChromeBookmarksSyncApplication</mainClass>
</configuration>
</plugin>对应的本地测试命令:mvn clean compile exec:java,实际的 github action 的 yml 文件里的写法有点区别:mvn -B clean compile exec:java --file pom.xml,需要指定 pom 文件。另外如果你想执行 mvn 命令的时候传递命令参数到 main 方法,可以这样:mvn clean compile exec:java -Dexec.args="arg0 arg1 arg2",这样在就可以接收到自定义参数了:
public class ChromeBookmarksSyncApplication {
public static void main(String[] args) {
// 打印:[arg0 arg1 arg2]
System.out.println("打印接收到的参数:"+JSONUtil.toJsonStr(args));
GenerateReadmeUtil.generateReadme();
System.exit(0);
}
}这样是不是我们可以在 yml 配置中自定义的参数,就可以通过 mvn 命令传递进来呢?对吧?
文件路径问题
关于文件读取和写入的路径问题,实际我们在本地测试的时候,对于 bookmark.json和README.md应该取绝对路径,在GenerateReadmeUtil.java类中:
private static final String BOOKMARK_JSON_PATH = "/Users/leeyom/workspace/github/chrome-bookmarks-sync/bookmark.json";
private static final String README_PATH = "/Users/leeyom/workspace/github/chrome-bookmarks-sync/README.md";但是实际在 github action 中,取的是相对地址,如果取绝对地址,会报文件找不到的问题:
private static final String BOOKMARK_JSON_PATH = "bookmark.json";
private static final String README_PATH = "README.md";如何使用
-
fork 仓库 chrome-bookmarks-sync仓库
-
修改
chrome_bookmarks_sync.yml文件的环境变量:env: GITHUB_NAME: 改成你自己的github用户名 GITHUB_EMAIL: 改成你自己的github邮箱
设置
G_TOKEN常量,复制你创建的github token,在该仓库下:Settings-->Secrets-->New repository secret,将此常量填入进去,变量名设置为G_TOKEN即可。 -
安装
Chrome插件「书签同步」,依次输入用户名、凭据、仓库名、文件存放路径 -
填写完用户数据后,便可以进行「上传」或「下载」操作,然后借助
github action,就可以自动生成README.md