目录

  • 什么是GitHub action
  • action基本使用
  • GitHub action 中的一些基本概念
  • GitHub action执行定时任务脚本
  • 拓展:关于action的定时设置

什么是GitHub action

官方定义:使用GitHub Actions在存储库中自动化,自定义和执行软件开发工作流程。您可以发现,创建和共享操作以执行所需的任何作业(包括CI / CD),并在完全定制的工作流程中组合操作。

官方帮助文档

action基本使用

进入自己的GitHub 公开仓库,点击ACTION按钮


选择自己来写工作流文件,不从GitHub已经提供的工作流模板中做选择。因为是第一次写,所以自己先写可以更直观的了解一些GitHub acton 的基本概念和要素,后面再根据自己的需求在对应的模板中做选择,这样可以提高写action的效率。

GitHub自动给我们生成了这个main.yml文件,里头已经填充上一个工作流所必须的基本要素了。


这个文件可以好好说明一下。首先是文件的位置,GitHub默认给我们创建的位置是基于项目下的.github/workflows/目录中,其实这是GitHub action执行工作流的指定路径,要想让GitHub识别并执行工作流的话,对应的工作流文件是必须要放在这个目录下的。

当然最终要的是这个文件的内容了,我将其拷贝出来并做一些精简,如下。

# name属性用来指定这个工作流的名字
name: HELLO GITHUB ACITON# 这个部分用来指定能够触发工作流执行的事件
on:# 当对分支main进行push操作的时候,这个工作流就被触发了push:branches: [ main ]# 工作流是由一个或多个的jobs构成的,在jobs里来说明要交给GitHub aciton执行的任务
jobs:# 这个jobs中的一个任务,名字叫build(随便怎么取)build:# 用来指定这个任务在什么操作系统上跑(服务器是GitHub免费提供的)runs-on: ubuntu-latest# 指出这个build任务的步骤steps:# 步骤,这里只写了一个步骤,目的是输出hello github acition- name: Run a one-line scriptrun: echo Hello, github action!

当我们push或者修改文件代码时,workflows会被运行

GitHub action 中的一些基本概念

刚才直观地通过一个例子来说明了一下GitHub action是怎么执行的,接下来把GitHub action的一些基本概念给汇总下,这里主要引用了阮一峰老师的文章。

GitHub Actions 有一些自己的术语。
(1)workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
(2)job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
(3)step(步骤):每个 job 由多个 step 构成,一步步完成。
(4)action (动作):每个 step 可以依次执行一个或多个命令(action)。

GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows目录。
workflow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为.yml,比如foo.yml。一个库可以有多个 workflow 文件。GitHub 只要发现.github/workflows目录里面有.yml文件,就会自动运行该文件。

我们要写的主要文件也就是workflow文件,其中可以配置的字段非常多,主要介绍下一些常用的字段,更多的可以查看官方文档。

还是直接给出一个完整的worflow文件,字段直接用注解备注了。

#字段1 name:用来指定workflow的名称,必备
name: Greeting from Mona
#字段2 on: 用来指定触发 workflow 的条件,通常是某些事件。
# 也可以是数组,如 on: [push, pull_request]
on: push
#字段3 jobs: workflow文件的主体是jobs字段,表示要执行的一项或多项任务
jobs:
#字段4: jobs.job_id: job_id是自定义的,比如这里写my_jobmy-job:# 字段5: jobs.job_id.name: 用来指定这个job的说明name: My Job# 字段6: jobs.job_id.runs-on: 用来指定这个job要在什么环境跑,也是必备的runs-on: ubuntu-latest# 字段7: jobs.job_id.steps: steps字段指定每个 Job 的运行步骤,可以包含一个或多个步骤。steps是一个数组,每个元素是一个stepsteps:# 字段8: name,具体的一个step的名字- name: Print a greeting# 字段9: env,具体的一个step会用到的环境变量env:MY_VAR: Hi there! My name isFIRST_NAME: MonaMIDDLE_NAME: TheLAST_NAME: Octocat#字段10: run,具体的一个步骤运行的命令或者 action。run: |echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.

通过workflow示例文件也可以看出GitHub action中涉及到的基本概念的关系:在一个step中说明要做的事,比如执行指令或者使用他人的action, 一个job由多个step构成,jobs由多个job构成,而workflow的主体是jobs。workflow就是通过这样的层次组织来实现工作流的执行。

GitHub action执行定时任务脚本

使用使用GitHub action来推送天气到微信或QQ

现在,我们写一个爬虫脚本用来获取天气信息
github项目地址
参考教程

#!/usr/bin/python3
#coding=utf-8import requests, json# SCKEY=os.environ.get('SCKEY','') ##Server酱推送KEY
# SKey=os.environ.get('SKey','') #CoolPush酷推KEY
SCKEY='你的Server酱推送KEY'  #通过 http://sc.ftqq.com/?c=code 获取
SKey='你的CoolPush酷推KEY'  #通过 https://cp.xuthus.cc/ 获取
def get_iciba_everyday():icbapi = 'http://open.iciba.com/dsapi/'eed = requests.get(icbapi)bee = eed.json()  #返回的数据english = bee['content']zh_CN = bee['note']str = '【奇怪的知识】\n' + english + '\n' + zh_CNreturn strdef ServerPush(info): #Server酱推送api = "https://sc.ftqq.com/{}.send".format(SCKEY)title = u"天气推送"content = info.replace('\n','\n\n')data = {"text": title,"desp": content}print(content)requests.post(api, data=data)
def CoolPush(info): #CoolPush酷推# cpurl = 'https://push.xuthus.cc/group/'+spkey   #推送到QQ群# cpurl = 'https://push.xuthus.cc/send/' + SKey  # 推送到个人QQapi='https://push.xuthus.cc/send/{}'.format(SKey)print(info)requests.post(api, info.encode('utf-8'))
def main():try:api = 'http://t.weather.itboy.net/api/weather/city/'             #API地址,必须配合城市代码使用city_code = '101110105'   #进入https://where.heweather.com/index.html查询你的城市代码tqurl = api + city_coderesponse = requests.get(tqurl)d = response.json()         #将数据以json形式返回,这个d就是返回的json数据if(d['status'] == 200):     #当返回状态码为200,输出天气状况parent = d["cityInfo"]["parent"] #省city = d["cityInfo"]["city"] #市update_time = d["time"] #更新时间date = d["data"]["forecast"][0]["ymd"] #日期week = d["data"]["forecast"][0]["week"] #星期weather_type = d["data"]["forecast"][0]["type"] # 天气wendu_high = d["data"]["forecast"][0]["high"] #最高温度wendu_low = d["data"]["forecast"][0]["low"] #最低温度shidu = d["data"]["shidu"] #湿度pm25 = str(d["data"]["pm25"]) #PM2.5pm10 = str(d["data"]["pm10"]) #PM10quality = d["data"]["quality"] #天气质量fx = d["data"]["forecast"][0]["fx"] #风向fl = d["data"]["forecast"][0]["fl"] #风力ganmao = d["data"]["ganmao"] #感冒指数tips = d["data"]["forecast"][0]["notice"] #温馨提示# 天气提示内容tdwt = "【今日份天气】\n城市: " + parent + city + \"\n日期: " + date + "\n星期: " + week + "\n天气: " + weather_type + "\n温度: " + wendu_high + " / "+ wendu_low + "\n湿度: " + \shidu + "\nPM25: " + pm25 + "\nPM10: " + pm10 + "\n空气质量: " + quality + \"\n风力风向: " + fx + fl + "\n感冒指数: "  + ganmao + "\n温馨提示: " + tips + "\n更新时间: " + update_time + "\n✁-----------------------------------------\n" + get_iciba_everyday()# print(tdwt)# requests.post(cpurl,tdwt.encode('utf-8'))         #把天气数据转换成UTF-8格式,不然要报错。ServerPush(tdwt)CoolPush(tdwt)except Exception:error = '【出现错误】\n  今日天气推送错误,请检查服务或网络状态!'print(error)print(Exception)if __name__ == '__main__':main()


我们需要编写的main.yml文件

# name属性用来指定这个工作流的名字
name: GITHUB ACITON Weater# 这个部分用来指定能够触发工作流执行的事件
on:# 当对分支main进行push操作的时候,这个工作流就被触发了push:branches: [ main ]# 工作流是由一个或多个的jobs构成的,在jobs里来说明要交给GitHub aciton执行的任务
jobs:# 这个jobs中的一个任务,名字叫build(随便怎么取)build:# 用来指定这个任务在什么操作系统上跑(服务器是GitHub免费提供的)runs-on: ubuntu-lateststeps:# 首先copy git仓库到虚拟机上- name: Checkoutuses: actions/checkout@v2# 安装初始化python- name: 'Set up Python'uses: actions/setup-python@v1with:python-version: 3.8# 安装脚本所需的依赖- name: 'Install requests'run: pip install requests# 运行脚本- name: 'Working'env:  #添加环境变量SCKEY: ${{ secrets.SCKEY }}SKEY: ${{ secrets.SKEY }}run: python ./weater.py

爬虫脚本文件weater.py

#!/usr/bin/python3
#coding=utf-8import requests, json
import osSCKEY=os.environ.get('SCKEY') ##Server酱推送KEY
SKey=os.environ.get('SKEY') #CoolPush酷推KEY
def get_iciba_everyday():icbapi = 'http://open.iciba.com/dsapi/'eed = requests.get(icbapi)bee = eed.json()  #返回的数据english = bee['content']zh_CN = bee['note']str = '【奇怪的知识】\n' + english + '\n' + zh_CNreturn strdef ServerPush(info): #Server酱推送api = "https://sc.ftqq.com/{}.send".format(SCKEY)title = u"天气推送"content = info.replace('\n','\n\n')data = {"text": title,"desp": content}print(content)requests.post(api, data=data)
def CoolPush(info): #CoolPush酷推# cpurl = 'https://push.xuthus.cc/group/'+spkey   #推送到QQ群# cpurl = 'https://push.xuthus.cc/send/' + SKey  # 推送到个人QQapi='https://push.xuthus.cc/send/{}'.format(SKey)print(api)print(info)requests.post(api, info.encode('utf-8'))
def main():try:api = 'http://t.weather.itboy.net/api/weather/city/'             #API地址,必须配合城市代码使用city_code = '101110105'   #进入https://where.heweather.com/index.html查询你的城市代码tqurl = api + city_coderesponse = requests.get(tqurl)d = response.json()         #将数据以json形式返回,这个d就是返回的json数据if(d['status'] == 200):     #当返回状态码为200,输出天气状况parent = d["cityInfo"]["parent"] #省city = d["cityInfo"]["city"] #市update_time = d["time"] #更新时间date = d["data"]["forecast"][0]["ymd"] #日期week = d["data"]["forecast"][0]["week"] #星期weather_type = d["data"]["forecast"][0]["type"] # 天气wendu_high = d["data"]["forecast"][0]["high"] #最高温度wendu_low = d["data"]["forecast"][0]["low"] #最低温度shidu = d["data"]["shidu"] #湿度pm25 = str(d["data"]["pm25"]) #PM2.5pm10 = str(d["data"]["pm10"]) #PM10quality = d["data"]["quality"] #天气质量fx = d["data"]["forecast"][0]["fx"] #风向fl = d["data"]["forecast"][0]["fl"] #风力ganmao = d["data"]["ganmao"] #感冒指数tips = d["data"]["forecast"][0]["notice"] #温馨提示# 天气提示内容tdwt = "【今日份天气】\n城市: " + parent + city + \"\n日期: " + date + "\n星期: " + week + "\n天气: " + weather_type + "\n温度: " + wendu_high + " / "+ wendu_low + "\n湿度: " + \shidu + "\nPM25: " + pm25 + "\nPM10: " + pm10 + "\n空气质量: " + quality + \"\n风力风向: " + fx + fl + "\n感冒指数: "  + ganmao + "\n温馨提示: " + tips + "\n更新时间: " + update_time + "\n✁-----------------------------------------\n" + get_iciba_everyday()# print(tdwt)# requests.post(cpurl,tdwt.encode('utf-8'))         #把天气数据转换成UTF-8格式,不然要报错。ServerPush(tdwt)CoolPush(tdwt)except Exception:error = '【出现错误】\n  今日天气推送错误,请检查服务或网络状态!'print(error)print(Exception)if __name__ == '__main__':main()

如果你不想做那么多的步骤,像直接白嫖的的话,毕竟读书人的事,怎么能算嫖呢

使用GitHub的action将每日天气推送到微信和QQ相关推荐

  1. 【微信每日早安推送】每日天气推送

    微信每日早安推送 效果和网络上其他代码都大差不差,不过当地习俗是按照阴历过生日的,所以距离下一个生日是和阴历生日对应的. 效果 代码里有计时任务,只需要让你的代码保持24小时运行,你的女神早上七点半便 ...

  2. DailyInfo——利用Python实现基于企业微信的每日图文推送

    DailyInfo 基于企业微信的每日图文推送 项目地址 Gitee地址 Github地址 支持功能 Bing必应 每日壁纸 金山词霸 每日一句 ONE·一个 一图一句 和风天气 多地区天气预报 农历 ...

  3. 微信每日早安推送 Windows版

    应诸多网友要求,这次上一个windows版的. 使用方法就是双击打开,立即就会推送一次.需要定时执行,可以使用windows的 任务计划程序 实现.帮大家百度好了 windows如何定时运行程序htt ...

  4. python爬虫教程:如何用40行Python代码实现天气预报和每日鸡汤推送功能

    这篇文章主要介绍了通过40行Python代码实现天气预报和每日鸡汤推送功能,代码简单易懂,非常不错具有一定的参考借鉴价值 ,需要的朋友可以参考下 情人节刚过去几天,但是这和我们程序员有什么关系呢,对我 ...

  5. 【java】java天气消息推送至微信公众号详细教程

    文章目录 读前必看 测试号推送 天气接口获取数据 谁说程序员不懂浪漫? 将你的关心 推送至微信公众号 给女朋友及时的关怀~(这位同学 你女朋友呢?) 读前必看 关于微信开发平台,小程序和公众号是不一样 ...

  6. android 定时推送提醒,使用workManager实现每日定时推送通知

    写这篇博客的缘由来自一个需求: 每日定时推送通知,提醒用户完成签到.如果后台被清理,则在打开App后立即推送. 众所周知,如今的Android国产ROM想要实现定时操作需要做极强的保活.然而一旦做了保 ...

  7. 批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能

    近期已经写了不少关于微信的消息了,本来想换个话题休息一下,谁知道微信不休息啊,又开始内测了.7月25日,部分iOS内测微信用户会收到系统对长时间未读订阅号的提醒,并可通过提醒入口选择不接收这部分订阅号 ...

  8. php 微信客服信息推送失败 微信重复推送客服消息 40001 45047

    1 /*** 2 * 微信客服发送信息 3 * 微信客服信息推送失败 微信重复推送客服消息 40001 45047 4 * 递归提交到微信 直到提交成功 5 * @param $openid 6 * ...

  9. 实战技巧:Python爬取OEM 12C上的告警信息并推送至微信企业号

    关注我们获得更多精彩 作者 | 徐美兰 ,邮政软件开发工程师,广东.湖南邮政金融数据中心任职多年,擅长Oracle数据库性能诊断与调优,对基于Python的数据分析与挖掘开发具有浓厚兴趣. 编者说明: ...

最新文章

  1. 在SunOS5.8/solaris7上使用Xerces-C解析器
  2. Linux的tree
  3. ant 实现批量打包android应用
  4. tensorflow--模型的保存和提取
  5. 【TensorFlow】通过两个简单的例子实现反向传播
  6. 魔改和上线你的合成大西瓜,最全教程!
  7. tail 显示文件最后若干行内容
  8. Android之本地摄像头,Android之调用本地摄像头
  9. Struts中提示Invalid result location value/parameter
  10. C语言练手题(52个小练习)
  11. USB Server应用于RPA机器人案例分析
  12. iOS远程真机之usbmuxd中iproxy的作用
  13. svg 右键意见删除cvs_一种实现svg自定义鼠标右键菜单的方法
  14. 配置与管理Ubuntu 21.10
  15. 【c语言】复习无止境,day4--堆内存宏函数篇
  16. “众里寻她千百度”情人节
  17. Servlet3 过滤器 Filer
  18. SSM框架配置文件整理
  19. H3C服务器BIOS界面,全新改版图形化界面
  20. Spring框架核心思想

热门文章

  1. CQUPT Java平时作业02
  2. opencv实现车辆跟踪
  3. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
  4. 什么是BIOS?如何进入BIOS,恢复BIOS原始设置的快捷方法
  5. java bpm 开源_几种Java开源工作流引擎的简单比较
  6. 可能你也怀疑,5G时代下,学web前端培训会有什么影响?
  7. Nginx代理-端口转发
  8. mkv怎么转mp4,mkv转mp4方法
  9. 浙江省计算机二级题库excel,2014年浙江省计算机二级题库Excel03
  10. android zxing生成条形码,使用ZXing创建android条形码扫描应用程序