github action使用

2022-01-10 21:28:52github

什么是github action

GitHub Actions 是 GitHub
的持续集成服务
,于2018年10月推出。

抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。

详细内容可以参考学习阮一峰老师的博客 GitHub Actions 入门教程

一个简单的演示项目

为了更清晰的描述在此过程中遇到的问题和解决办法,以实际项目做演示:

以github pages为例:

  • 1:创建2个项目

注意事项:两个项目必须开源,才能免费试用github action功能

以下所有username 均替换成自己的github账号

# 源码项目
https://github.com/username/sourceProject

# 要发布的目标项目
https://github.com/username/username.github.page
  • 2. 给项目 sourceProject 创建一个action

img

可以选择下面推荐的一些action或者选择set up a workflow yourself 自己创建一个:

img

文件名必须是yml结尾。

下面一个action:每小时执行一次nodejs采集任务,并自动发布到github pages

main.yml

# name属性用来指定这个工作流的名字, 这是帮助您开始使用 Actions 的基本工作流程

name: xxxx

# 控制工作流何时运行,这个部分用来指定能够触发工作流执行的事件
on:
  # 在推送或拉取请求事件上触发工作流,但仅针对主分支
  # 当对分支main进行push操作的时候,这个工作流就被触发了
  # push:
  #   branches: [ main ]
  # pull_request:
  #   branches: [ main ]
  schedule:
    # 定时任务
    #  ┌───────────── minute (0 - 59)
    #  │ ┌───────────── hour (0 - 23)
    #  │ │ ┌───────────── day of the month (1 - 31)
    #  │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
    #  │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
    #  │ │ │ │ │
    #  │ │ │ │ │
    #  │ │ │ │ │
    #  * * * * *
    # 从零分中开始每隔30分钟执行一次
    #    - cron: '0/2 * * * *'
    #    每个小时第一分钟时执行一次
    - cron: '1 * * * *'

  # 允许您从“操作”选项卡手动运行此工作流
  workflow_dispatch:

# 工作流是由一个或多个的jobs构成的,在jobs里来说明要交给GitHub aciton执行的任务
jobs:
  # 这个jobs中的一个任务,名字叫build(随便怎么取)
  build:
    # 用来指定这个任务在什么操作系统上跑(服务器是GitHub免费提供的)
    runs-on: ubuntu-latest

    # 指出这个build任务的步骤
    steps:
      # 在 $GITHUB_WORKSPACE 下签出您的存储库,以便您的工作可以访问它
      - uses: actions/checkout@v2
      - name: node run script
        # 使用 runners shell 运行单个命令
        run: yarn start

      # 发布流程
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          # 教程:https://github.com/peaceiris/actions-gh-pages/tree/v3#%EF%B8%8F-deploy-to-external-repository-external_repository
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # 这里的key是在项目中配置的deploy key,因为要从a项目发布到b项目,跨项目时,需要提供一个sshkey的公私钥对
          external_repository: username/username.github.io
          #          publish_branch: main  # default: gh-pages # 默认分支在这里配置:https://github.com/username/username.github.io/settings/pages
          publish_dir: ./public

3,编写一个爬虫脚本

在 sourceProject 项目中 创建一个nodejs爬虫脚本

以下脚本,会请求一个也没,并把html保存到本项目中。

index.mjs

// 做一个简单爬虫,采集并保存到本地文件中。
import https from 'https'
import fs from 'fs'

https.get('https://www.baidu.com', (response) => {
    let body = []
    response.on('data', chunk => {
        body.push(chunk)
    })
    response.on('end', () => {
        body = Buffer.concat(body);
        body = body.toString()

        fs.writeFileSync('./public/baidu.html',body,{encoding:'utf-8'})
    })
})

记得手动创建一个public目录,方便代码成功保存文件。

4,使用openssl创建一个公私钥对

ssh-keygen -t rsa -C 'username@github.com' -f ~/.ssh/id_rsa_username_deploy_key

会在用户目录下的.ssh/目录下,生产一对公私钥

id_rsa_username_deploy_key

id_rsa_username_deploy_key.pub

5. 创建 Action secrets

sourceProject 项目中的 设置界面Secrets 选项卡中,

点击右上角的 New repository secret 按钮 新建一个Action secrets

img

name 字段尽量用官方默认的ACTIONS_DEPLOY_KEY,也可以自定义,只要在main.yml中保持一直就行。

小提示:name很容易出现前后有空格导致保存失败的情况,注意检查。

value 字段,就是把刚才id_rsa_username_deploy_key中的私钥文本复制过来,贴到这里面

然后保存就行了。

6. 创建 deploy key

同样的方式,在 username.github.io 项目中,创建 deploy key

name 随便填,方便自己记忆和区分即可

value 是id_rsa_username_deploy_key.pub 中的公钥内容。

img

img

至此,需要配置的地方,都已经配置完成。

再着重看一下main.myl的核心部分:

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          # 教程:https://github.com/peaceiris/actions-gh-pages/tree/v3#%EF%B8%8F-deploy-to-external-repository-external_repository
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} # 这里的key是在项目中配置的deploy key,因为要从a项目发布到b项目,跨项目时,需要提供一个sshkey的公私钥对
          external_repository: username/username.github.io
          #          publish_branch: main  # default: gh-pages # 默认分支在这里配置:https://github.com/username/username.github.io/settings/pages
          publish_dir: ./public

name 随便填写,方便自己记忆和识别

uses 应该是使用github action 的一些环境资源

external_repository 是需要构建的目标仓库地址

deploy_key 是用来从项目sourceProject发布到项目 username.github.io 的鉴权用,就是刚才配置的 ACTIONS_DEPLOY_KEY

publish_dir 将要把这里面的内容,从sourceProject 发布到username.github.io,所以尽量用一个目录存起来,方便管理

7. 最后提交代码

将index.mjs提交到sourceProject,如果开启了 on-push,则会再push之后,就立即触发一次Workflows的任务。

如果没用开启自动构建,则可以通过设置的on-workflow_dispatch来手动触发。

img

sourceProject任务完成后,就会把代码推送到 username.github.io ,而github pages项目比较特殊,已经系统内置了自动构建的功能。

构建完成后,既可以通过:https://username.github.io/baidu.html 访问到页面内容了。

sourceProject中的public目录,会在username.github.io存放在根目录,
所以这里/baidu.html通过根目录访问。

完成以上枯燥的操作之后,就可以发挥无限的想象力了。

可以把它做成一个采集站,自动收集一些零散的信息和资料。