superleeyom / blog

:bookmark: 个人博客仓库,用于记录一些幼稚的想法和脑残的瞬间,欢迎 star、watch,该仓库为个人博客,请不要提 issue ,该仓库后端参考了 @yihong0618 的 gitblog 项目,前端参考了@LoeiFy 的 Mirror 项目,感谢!
https://blog.leeyom.top
221 stars 20 forks source link

GitHub Actions 实战之Chrome书签同步 #10

Open superleeyom opened 3 years ago

superleeyom commented 3 years ago

之前对 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 Actionsyml 文件主要用于配置自动化构建,这里我就拿我的这次实践的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: 635709492@qq.com

# 任务
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/commit@v2.6
      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去下载该插件,关键字搜索「书签同步」进行下载安装,设置流程的话,参考插件使用指南:

自动化构建

由于项目是用 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.jsonREADME.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";

如何使用

  1. fork 仓库 chrome-bookmarks-sync仓库

  2. 修改chrome_bookmarks_sync.yml文件的环境变量:

    env:
     GITHUB_NAME: 改成你自己的github用户名
     GITHUB_EMAIL: 改成你自己的github邮箱

    设置 G_TOKEN常量,复制你创建的 github token,在该仓库下:Settings-->Secrets-->New repository secret,将此常量填入进去,变量名设置为G_TOKEN即可。

  3. 安装 Chrome 插件「书签同步」,依次输入用户名、凭据、仓库名、文件存放路径

  4. 填写完用户数据后,便可以进行「上传」或「下载」操作,然后借助 github action,就可以自动生成 README.md

参考文档