什么是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
可以选择下面推荐的一些action或者选择set up a workflow yourself
自己创建一个:
文件名必须是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
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
中的公钥内容。
至此,需要配置的地方,都已经配置完成。
再着重看一下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
来手动触发。
sourceProject
任务完成后,就会把代码推送到 username.github.io
,而github pages项目比较特殊,已经系统内置了自动构建的功能。
构建完成后,既可以通过:https://username.github.io/baidu.html 访问到页面内容了。
sourceProject
中的public目录,会在username.github.io
存放在根目录,
所以这里/baidu.html通过根目录访问。
完成以上枯燥的操作之后,就可以发挥无限的想象力了。
可以把它做成一个采集站,自动收集一些零散的信息和资料。