如何写一个其他人可以使用的GitHub Action

news2024/9/21 10:43:16

前言

GitHub中,你肯定会使用GitHub Actions自动部署一个项目到GitHub Page上,在这个过程中总要使用workflows工作流,并在其中使用action,在这个使用的过程中,总会好奇怎么去写一个action呢,所以,我对此进行了一个学习。

什么是GitHub Actions

  • 官方概述如下:

GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。

GitHub Actions 不仅仅是 DevOps,还允许您在存储库中发生其他事件时运行工作流程。 例如,您可以运行工作流程,以便在有人在您的存储库中创建新问题时自动添加相应的标签。

GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。

  • 上述关键词:CI/CD,持续集成由很多操作组成,比如拉取代码、限定npm版本、下载依赖、运行测试、docker部署,发布到第三方服务等等。GitHub 把这些操作就称为 actions

  • 其实很多操作在不同项目里面都是类似的,完全可以使用相同的代码逻辑。GitHub允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。

  • 如果说你需要某个 action,不必自己写复杂的脚本,直接引用他人写好的 action 就行,整个持续集成过程,就变成了一个 actions 的组合。这就是 GitHub Actions 最特别的地方。

  • GitHub 做了一个官方市场,可以搜索到他人提交的 actions

如何写一个GitHub Action

经常使用其他人写好的action,或者说觉得其他人写的action并不好用,难免有时候会想自己写一个

  • 在上文中提到,GitHub允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。

初始化一个项目仓库

  • GitHub新建一个代码仓库

  • 本地初始化项目,并与远程仓库相连接

npm init -y

action.yml文件

  • 在项目的根目录下,新建action.yml文件
  • 以下是我写的action的部分action.yml文件代码,也包含注释
name: 'action-demo' # action的名字
description: 'GitHub Action data-cards' # 描述
author: 'lxKylin' # 作者
# 定义输入参数
inputs:
  github_token: # 参数
    description: 'Your GitHub token for authentication.' # 描述
    required: true # 是否必须
# 定义输出参数
outputs:
  result:
    description: 'action-demo'
runs: # 脚本运行环境
  using: node16
  main: 'dist/index.js' # 执行入口

安装必要的依赖

@actions/core
npm install @actions/core
  • @actions/core 用于创建和管理 GitHub Actions 的工作流程。它提供了一些基本的功能,帮助你在工作流程中定义输入参数、设置环境变量、输出结果等。
  • 提到定义输入参数,在上文的action.yml文件中,我们定义了一个叫github_token的输入参数,我们可以根据@actions/core包中的getInput()方法获取到:
const core = require('@actions/core')

const token = core.getInput('github_token')
@actions/github
npm install @actions/github
  • @actions/github 包允许你在 GitHub Actions 工作流中访问触发动作的事件负载、上下文和仓库信息。通过这个包,你可以轻松地获取有关触发动作的信息,例如推送到仓库的提交信息、触发工作流的事件类型等。
const github = require('@actions/github')

// 上下文信息
const context = github.context
// 仓库所有者
const owner = context.repo.owner
// 仓库名
const repo = context.repo.repo
  • 通过ownerrepo,我可以用之对相应的仓库进行提交等操作
@vercel/ncc
  • @vercel/ncc可以将一个 Node.js 模块及其依赖项打包到一个单一的 JavaScript 文件中,这有助于提高应用程序的性能和加载速度。这个工具的主要目的是减少模块的加载时间,使应用能够更快地启动和执行。
npm install @vercel/ncc
  • 这将以main.js为入口文件,在指定的目录dist中生成一个单一的文件(index.js),其中包含了你的 Node.js 模块及其依赖项。
ncc build main.js -o dist
  • package.json
"scripts": {
    "build": "ncc build main.js -o dist"
  },
  • 完成以上几步,写一个action项目的架子就已经搭好了,其余就是写你的action需要的逻辑了
  • 你需要注意的是,在你具体的action逻辑代码有所修改后,一定要执行npm run build进行重新打包生成dist文件夹,这样代码提交后,使用这个action时才是你最新的代码。
  • 如果你觉得每次修改完代码都得重新npm run build有点烦,那么你完全可以在action项目中写一个ci,当你的代码提交时,自动打包,并将更新的代码提交到该分支

自动打包并提交

  • 在上文中提到,可以写一个ci自动打包并提交代码,完整的代码如下:
name: Upload Action File

on:
  push:
    branches:
      - action
  workflow_dispatch:

jobs:
  Upload_Action_File:
    runs-on: ubuntu-latest # 运行环境
    steps:
      - name: Checkout code # 获取仓库代码
        uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v3 #安装node.js
        with:
          node-version: '16'
      - name: install & build
        run: |
          echo "npm run build"
          npm install
          npm run build
      - name: Upload Action File
        uses: actions/upload-artifact@v4
        with:
          name: index.js
          path: dist
      - name: Download Action File
        uses: actions/download-artifact@v4
        with:
          name: index.js
          path: dist # 指定下载到本地的路径
      - name: Delete Image Folder
        run: |
          echo "开始删除dist/image文件夹"
          rm -rf dist/image
          echo "成功删除dist/image文件夹"
        shell: bash
      - name: Commit and Push Changes
        run: |
          echo "Commit and Push Changes"
          git config --global user.name "${GITHUB_ACTOR}"
          # git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com"
          git config --global user.email "actions@github.com"

          git add .
          git commit -m "feat: Update Action File"
          # origin 是远程仓库的默认名称,而 HEAD:main 表示将本地的 HEAD 分支(通常是当前分支)推送到远程仓库的 action 分支
          git push origin HEAD:action
        env:
          GH_TOKEN: ${{ secrets.DATA_CARD_TOKEN }}

  • name是这个workflows工作流的名称
  • on表示触发这个workflows的条件,在上述代码中,当action分支有push操作时,便执行这个工作流
    • 也有数组写法:[push, pull_request],表示pushpull_request都将触发这个工作流
    • workflow_dispatch表示这个工作流可以手动触发:

image.png

  • jobs表示的是任务,其下的Upload_Action_File是任务的名称,是可以自定义的,每一个任务都是异步执行执行的,如果说,你需要每一步都按照顺序来,你可以这样使用needs
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

  • runs-on表示运行环境,一般就是ubuntu-latest

  • steps表示任务的步骤

    • name就表示这个步骤的名字,如果说,你是直接使用他人写好的action,那么可以使用uses进行引用
    • with,这里表示的是作业级别使用with来定义步骤的配置。像这里with: node-version: '16'就是你使用with指定node的版本,它还可以指定步骤的运行环境、虚拟机的操作系统、以及其他特定于作业的参数
  • actions/upload-artifact@v4actions/download-artifact@v4是步骤间共享数据所使用到的action,前者表示将生成的文件上传,后者表示将文件下载

    • 在这里,在执行npm run build时,会生成dist文件夹,我们需要拿到这个文件夹中的文件,所以需要用到步骤间的数据共享
  • Commit and Push Changes这一步骤呢就是平常我们配置git的操作,设置用户名称和邮箱

    • "${GITHUB_ACTOR}"这个可以获取到你的账户名
    • "${GITHUB_ACTOR}@users.noreply.github.com"这个可以获取到你在github设置的邮箱。而"actions@github.com"相当于使用action用户进行提交,最后的就是我们平时提交代码时的步骤啦
  • 最后这个env: GH_TOKEN: ${{ secrets.DATA_CARD_TOKEN }},需要到下图所示的地方进行生成一个具有你仓库读写权限的token

image.png

  • 在上面生成token后,再到下图所示的地方进行配置

image.png

  • 最后最后,为了确保这个workflows可以正常执行,在下图所示,你也需要给足workflows读写的权限

image.png

例子:data-card

  • 这个action是在学习写一个action项目时写的一个用于生成网页数据的卡片,比如:掘金、CSDN、力扣、语雀等,当然,这种数据卡片,最好还是使用img标签使用api直接请求后端返回图片。这个仅作为一个学习的例子。

  • 使用方法:

name: generate-data-card

on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:

jobs:
  generate-card:
    runs-on: ubuntu-latest
    steps:
      - name: Use Data Card Action
        uses: lxKylin/data-card@action
        with:
          github_token: ${{ secrets.DATA_CARD_TOKEN }}
          juejin_id: ${{ secrets.JUEJIN_PARAMS }} # 也可不使用变量,直接写juejin_id

image.png

image.png

  • 该项目不断完善中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1441376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无人机图像识别技术研究及应用,无人机AI算法技术理论,无人机飞行控制识别算法详解

在现代科技领域中,无人机技术是一个备受瞩目的领域。随着人们对无人机应用的需求在不断增加,无人机技术也在不断发展和改进。在众多的无人机技术中,无人机图像识别技术是其中之一。 无人机图像识别技术是利用计算机视觉技术对无人机拍摄的图像…

Project 2010下载安装教程,保姆级教程,附安装包和工具

前言 Project是一款项目管理软件,不仅可以快速、准确地创建项目计划,而且可以帮助项目经理实现项目进度、成本的控制、分析和预测,使项目工期大大缩短,资源得到有效利用,提高经济效益。软件设计目的在于协助专案经理发…

6、5 门关于 AI 和 ChatGPT 的免费课程,带您从 0-100

5 门关于 AI 和 ChatGPT 的免费课程,带您从 0-100 想在 2024 年免费了解有关 AI 和 ChatGPT 的更多信息吗? 图片由 DALLE 3 提供 活着是多么美好的时光啊。还有什么比现在更适合了解生成式人工智能(尤其是 ChatGPT)等人工智能元素的呢!许多人对这个行业感兴趣,但有些…

一文读懂:MybatisPlus从入门到进阶

快速入门 简介 在项目开发中,Mybatis已经为我们简化了代码编写。 但是我们仍需要编写很多单表CURD语句,MybatisPlus可以进一步简化Mybatis。 MybatisPlus官方文档:https://www.baomidou.com/,感谢苞米豆和黑马程序员。 Mybat…

表单标记(html)

前言 发现input的type属性还是有挺多的,这里把一些常用的总结一下。 HTML 输入类型 (w3school.com.cn)https://www.w3school.com.cn/html/html_form_input_types.asp text-文本 文本输入,如果文字太长,超出的部分就不会显示。 定义供文本输入的单行…

C语言操作符超详细总结

文章目录 1. 操作符的分类2. 二进制和进制转换2.1 2进制转10进制2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制2.2.1 2进制转8进制2.2.2 2进制转16进制 3. 原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符:&、|、^、~6. 逗号表达式…

vue3 之 通用组件统一注册全局

components/index.js // 把components中的所组件都进行全局化注册 // 通过插件的方式 import ImageView from ./ImageView/index.vue import Sku from ./XtxSku/index.vue export const componentPlugin {install (app) {// app.component(组件名字,组件配置对象)…

图解 V8 执行 JS 的过程

本文来分享 V8 引擎执行 JavaScript 的过程 1. JS 代码执行过程 在说V8的执行JavaScript代码的机制之前,我们先来看看编译型和解释型语言的区别。 编译型语言和解释型语言 我们知道,机器是不能直接理解代码的。所以,在执行程序之前&#xf…

Java_栈_队列

文章目录 一、栈(Stack)1.概念2.栈的使用3.栈的模拟实现1、定义接口2、定义栈3、成员4、构造方法5、判断空间是否满 full6、入栈 push7、出栈 pop8、获取栈顶元素 peek9、获取栈中有效元素个数 size10、检测栈是否为空 empty完整代码 4.练习1、有效括号2…

GEE Colab——如何利用Matplotlib在colab中进行图形制作

在colab中绘制图表 笔记本的一个常见用途是使用图表进行数据可视化。Colaboratory 提供多种图表工具作为 Python 导入,让这一工作变得简单。 Matplotlib Matplotlib 是最常用的图表工具包,详情请查看其文档,并通过示例获得灵感。 线性图 线性图是一种常见的图表类型,用…

LabVIEW网络测控系统

LabVIEW网络测控系统 介绍了基于LabVIEW的网络测控系统的开发与应用,通过网络技术实现了远程的数据采集、监控和控制。系统采用LabVIEW软件与网络通信技术相结合,提高了系统的灵活性和扩展性,适用于各种工业和科研领域的远程测控需求。 随着…

哈希表(Hash Table)-----运用实例【通过哈希表来管理雇员信息】(java详解) (✧∇✧)

目录 一.哈希表简介: 实例介绍: 类的创建与说明: 各功能图示: 1.class HashTab{ }; 2. class EmpLinkedList{ }; 3. class Emp{ }; 4.测试: 运行结果: 最后,完整…

springboot微信小程序uniapp学习计划与日程管理系统

基于springboot学习计划与日程管理系统,确定学习计划小程序的目标,明确用户需求,学习计划小程序的主要功能是帮助用户制定学习计划,并跟踪学习进度。页面设计主要包括主页、计划学习页、个人中心页等,然后用户可以利用…

Java汽车销售管理

技术架构: springboot mybatis Mysql5.7 vue2 npm node 有需要该项目的小伙伴可以私信我你的Q。 功能描述: 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管理 效果图&…

CTF--Web安全--SQL注入之‘绕过方法’

一、什么是绕过注入 众所周知,SQL注入是利用源码中的漏洞进行注入的,但是有攻击手段,就会有防御手段。很多题目和网站会在源码中设置反SQL注入的机制。SQL注入中常用的命令,符号,甚至空格,会在反SQL机制中…

预测模型:MATLAB线性回归

1. 线性回归模型的基本原理 线性回归是统计学中用来预测连续变量之间关系的一种方法。它假设变量之间存在线性关系,可以通过一个或多个自变量(预测变量)来预测因变量(响应变量)的值。基本的线性回归模型可以表示为&…

Ps:窗口排列

Ps菜单:窗口/排列 Window/Arrange Photoshop 的“窗口/排列” Arrange子菜单中提供了多种方式来组织和查看打开的文档窗口,这在处理多个文档或比较图像时非常有用。 ◆ ◆ ◆ 常用操作方法与技巧 1、同文档双窗口处理法 将同一个图像显示在两个窗口中&…

The Back-And-Forth Method (BFM) for Wasserstein Gradient Flows windows安装

本文记录了BFM算法代码在windows上的安装过程。 算法原网站:https://wasserstein-gradient-flows.netlify.app/ github:https://github.com/wonjunee/wgfBFMcodes 文章目录 FFTWwgfBFMcodesMATLABpython注 FFTW 官网/下载路径:https://ww…

备战蓝桥杯---动态规划(基础2)

本专题主要是介绍几个比较经典的题目: 假设我们令f[i]为前i个的最长不下降子序列,我们会发现难以转移方程很难写(因为我们不知道最后一个数)。 于是,我们令f[i]为以i结尾的最长不下降子序列,这样子我们就可…

Java基础知识练习题

1.对Java源文件进行编译操作的命令是(B) A.Java B.javac C.where is java D.javaw 2.下列命令中,用来运行Java程序的是(A)A.java B. javadoc C. jar D. javac 分析: 对Java源程序进行编译的命令是J…