GitHub Action 使用

GitHub Action 使用

GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。

计费规则

公共存储库中标准 GitHub 托管的运行器和自托管运行器可免费使用 GitHub Actions。 对于专用存储库,每个 GitHub 帐户可获得一定数量的免费时间和存储以用于 GitHub 托管的运行器,具体取决于帐户所使用的产品。 超出包含数量的任何使用量都由支出限制控制。分钟数每月重置一次,而存储空间使用量不会重置。ci机器使用超过 2 核的 Windows 和 Ubuntu 运行器,将始终收取费用,包括在公共存储库中。其中GitHub Free 给的存储是 500M,2000分钟/月。在 GitHub 主机的 Windows 和 macOS 运行器上运行的作业,其消耗分钟数是在 Linux 运行器上运行的作业的 2 倍和 10 倍。 例如,1000 分钟的 Windows 使用时间将占用帐户中包含的 2000 分钟。 1000 分钟的 macOS 使用时间将占用帐户中包含的 10000 分钟。仓库使用的存储空间是 GitHub Actions 构件和 GitHub Packages 使用的存储空间总计。

查看 GitHub Actions 使用情况

操作路径:在GitHub右上角点击头像 -> Settings -> 左侧变栏目(Billing and Plans) -> Plans and usage -> Usage this month
可以分别看到 Action部分与Packages 的使用情况
在这里插入图片描述
在这里插入图片描述

快速入门

  1. 在仓库的根目录下新建 .github/workflows/ 目录
  2. 在.github/workflows/目录下创建一个文件 learn-github-actions.yml(名字不一定是这个,只要是.yml结尾就行) 代码如下
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '14'
      - run: npm install -g bats
      - run: bats -v
  1. 提交代码push到远程仓库
  2. 现在你的工作流已经安装成功,在每次代码push的时候就能够触发,现在应该就能看到这个工作流的第一次运行。
  3. 查看地址如下
    在这里插入图片描述

备注

一个仓库可以定义多个工作流程,多个工作流的表现形式为 github/workflows/ 下存在多个不同的yml文件

关键使用流程(yml如何编写)

name 以及 run-name 只是一个标识和展示的用途,不是特别关键

如何触发工作流

  • 仓库的代码或者流程发生变更,例如代码push,pull request,issue等,这里可以针对分支,tag等一系列进行筛选控制,可参考
  • 在 GitHub 之外发生并在 GitHub 上触发 repository_dispatch 事件的事件,具体的事件
  • 定时执行,支持cronjob配置,可以支持配置多个。
  • 手动执行,如果你配置了workflow_dispatch结点则可以在界面上进行手动触发。
    在这里插入图片描述
on:
  # 只有push到master分支上才能触发这个action
  push:
    branches: [ "master" ]
  # 定义了这个结点表示可以手动触发,手动触发时还支持定义一些自定义参数
  workflow_dispatch:
  # 定时执行,注意这里的定时时间都是世界标准时间UTC,和中国有时差
  schedule:
    - cron:  0 2 * * *

如何编写一个job

工作流运行由一个或多个 jobs 组成,默认情况下并行运行。 若要按顺序运行作业,可以使用 jobs.<job_id>.needs 关键字定义对其他作业的依赖关系。每个作业在 runs-on 指定的运行器环境中运行。

设置作业的ID

使用 jobs.<job_id> 为作业提供唯一标识符。 键 job_id 是一个字符串,其值是作业配置数据的映射。 必须将 <job_id> 替换为对于 jobs 对象的唯一字符串。 <job_id> 必须以字母或 _ 开头,并且只能包含字母数字字符、- 或 _。

jobs:
  my_first_job:
    name: My first job
  my_second_job:
    name: My second job

作业名称

jobs.<job_id>.name 设置作业名称,该名称显示在 GitHub UI 中。

作业有依赖关系

在此示例中,job1 必须在 job2 开始之前成功完成,并且 job3 等待 job1 和 job2 完成。

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

选择作业的运行器

目前只支持 Windows、Ubuntu、macOS 三种运行器。注意 Windows和macOS如果使用时超过2核心则需要收费。支持的yml标签
Ubuntu 运行器已添加到名为 ubuntu-runners 的组中。 runs-on 键将作业发送到 ubuntu-runners 组中的任何可用运行器:

name: learn-github-actions
on: [push]
jobs:
  check-bats-version:
    runs-on: 
      group: ubuntu-runners
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '14'
      - run: npm install -g bats
      - run: bats -v

定义作业的输出

jobs:
  job1:
    runs-on: ubuntu-latest
    # Map a step output to a job output
    outputs:
      output1: ${{ steps.step1.outputs.test }}
      output2: ${{ steps.step2.outputs.test }}
    steps:
      - id: step1
        run: echo "test=hello" >> "$GITHUB_OUTPUT" # 要输出的内容统一指向这个环境变量
      - id: step2
        run: echo "test=world" >> "$GITHUB_OUTPUT"
  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - env:
          OUTPUT1: ${{needs.job1.outputs.output1}} # 前面输出的内容可以在其它步骤引用,但是注意时序问题
          OUTPUT2: ${{needs.job1.outputs.output2}}
        run: echo "$OUTPUT1 $OUTPUT2"

job中steps下uses 标签的使用

uses 标签标识当前你需要用什么工具去做操作。例如,你要下载代码 需要用这个 actions/checkout@v3 ,如果你接下来是编译go代码,那你得有go sdk actions/setup-go@v3。这其中是一系列封装好的步骤脚本。你也可以字节开发这样一个工具并且发布到 github社区供他人使用。更多例子
例如 go版本

name: Go package

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.15

      - name: Build
        run: go build -v ./...

      - name: Test
        run: go test -v ./...

例如 maven-java版本

name: Java CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Build with Maven
        run: mvn --batch-mode --update-snapshots package

在yml使用环境变量

有时候在编写action yml时 需要用到 账号,密码,cookie 等比较隐私的内容,不方便直接写在文件中。action有提供环境变量一样的引用方式。
操作路径
在这里插入图片描述
注意这里有 Secrets和Variables 两种变量。Secrets 变量设置完成后无法查看,在action流程执行中也无法将值打印出来,适合账号密码等比较隐私的场景。Variables 则是普通的环境变量,设置后可以直接看到值。

name: Study-CI

on:
  # 只有push到master分支上才能触发这个action
  push:
    branches: [ "master" ]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Install Go and Run Code Linting
        uses: actions/setup-go@v4.0.0
        with:
          go-version: 1.18 
      - name: Use variables # 使用vars关键词引用 Variables 中定义的变量
      run: |
        echo "repository variable : ${{ vars.REPOSITORY_VAR }}"
        echo "organization variable : ${{ vars.ORGANIZATION_VAR }}"
        echo "overridden variable : ${{ vars.OVERRIDE_VAR }}"
        echo "variable from shell environment : $env_var"
      - name: Go Build
        run: go build -o main
      - name: Go Run
        run: ./main
      - name: Ssh Romote Commands
        uses: appleboy/ssh-action@v0.1.2
        with:
          host: ${{ secrets.HOST }} # 直接使用secrets中的环境变量
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          script: cat readme.md

CD 怎么使用

前面介绍的都是ci环节,cd及部署。GitHub action 本质上只提供一个ci的机器。部署需要你有自己的一台服务器。关于CD 社区中也有各云厂商自己开发的action 插件可用。搜索地址 可按照自己实际的情况各取所需。
如果不想用云厂商开发好的功能,也可以使用通用的 ssh action 自定义cd流程。
例如,这里就演示了 使用 appleboy/ssh-action 登录到远程主机上,并且在用户家目录下 查看了 readme.md 文件的内容。

# This is a basic workflow to help you get started with Actions

# 取个ci流程的名字
name: Study-CI

on:
  # 只有push到master分支上才能触发这个action
  push:
    branches: [ "master" ]

  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Go and Run Code Linting
        uses: actions/setup-go@v4.0.0
        with:
          go-version: 1.18
      - name: Go Build
        run: go build -o main
      - name: Go Run
        run: ./main
      - name: Ssh Romote Commands # 使用ssh-action 登录远程主机执行脚本
        uses: appleboy/ssh-action@v0.1.2
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          script: cat readme.md

附加

如果要执行多条命令 则在命令后面加一个 | 或者是使用 & 连接多个命令

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3  # 前面用一个横线标识 steps 有多个值是一个数组
      - name: Use variables # 执行多行命令
      run: |
        echo "repository variable : ${{ vars.REPOSITORY_VAR }}"
        echo "organization variable : ${{ vars.ORGANIZATION_VAR }}"
        echo "overridden variable : ${{ vars.OVERRIDE_VAR }}"
        echo "variable from shell environment : $env_var"

如何执行shell命令

steps:
  - name: Display the path
    run: echo $PATH
    shell: bash

文件的上传下载及读取

第一个job计算3+7的结果写到文件math-homework.txt,第二job将第一个job的结果下载下来继续进行乘法计算 *9 并且将结果又写回原来的文件。第三步 下载下来这个文件,进行最终结果的打印。

name: Share data between jobs

on: [push]

jobs:
  job_1:
    name: Add 3 and 7
    runs-on: ubuntu-latest
    steps:
      - shell: bash
        run: |
          expr 3 + 7 > math-homework.txt
      - name: Upload math result for job 1
        uses: actions/upload-artifact@v3
        with:
          name: homework
          path: math-homework.txt

  job_2:
    name: Multiply by 9
    needs: job_1
    runs-on: windows-latest
    steps:
      - name: Download math result for job 1
        uses: actions/download-artifact@v3
        with:
          name: homework
      - shell: bash
        run: |
          value=`cat math-homework.txt`
          expr $value \* 9 > math-homework.txt
      - name: Upload math result for job 2
        uses: actions/upload-artifact@v3
        with:
          name: homework
          path: math-homework.txt

  job_3:
    name: Display results
    needs: job_2
    runs-on: macOS-latest
    steps:
      - name: Download math result for job 2
        uses: actions/download-artifact@v3
        with:
          name: homework
      - name: Print the final result
        shell: bash
        run: |
          value=`cat math-homework.txt`
          echo The result is $value

总结

本篇文章只是介绍了GitHub action 的一些最基础,最常用的内容。还有一些高级特性,比如条件控制,并发控制,权限管理,云厂商部署,容器化服务,标签管理,自定义运行器(自己提供ci机器)等。更多特性请参考官方文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

训练AI数据模型所需要的高性能计算机配置

目录 配置一 配置二 配置三 云服务器和超级计算机 AI模型训练是一种机器学习的过程&#xff0c;通过训练深度学习模型来自动化处理数据和完成任务。AI训练可以帮助企业和研究人员开发出更加智能、高效的应用&#xff0c;从而提高生产力和创新能力。 以下是按训练性能从低到…

对挖矿病毒 kdevtmpfsi 的处理办法

需求背景&#xff1a; 服务器CPU资源使用一直处于100%的状态&#xff0c;通过 top 命令查看&#xff0c;发现可疑进程 kdevtmpfsi。通过 google搜索&#xff0c;发现这是挖矿病毒。 排查方法 首先&#xff1a;查看 kdevtmpfsi 进程&#xff0c;使用 ps -ef | grep kdevtmpfsi …

数据结构之线性表

文章目录1. 线性表的定义2. 线性表的抽象数据类型3. 线性表的顺序存储结构4. 线性表的链式存储结构5. 单链表结构和顺序存储结构优缺点6. 静态链表7. 循环链表8. 双向链表1. 线性表的定义 零个或多个数据元素的有限序列 线性表的定义中强调有限和序列两个方面。 有限&#xff…

华硕ROG|玩家国度 冰刃7双屏 GX650PY Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原

华硕ROG|玩家国度 冰刃7双屏 GX650PY Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个…

【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅲ

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

MySQL基础-变量/流程控制/游标/触发器

文章目录MySQL基础-变量/流程控制/游标/触发器一、变量1、系统变量2、用户变量二、流程控制1、分支语句2、循环语句3、跳转语句三、游标1、概念2、使用四、触发器1、触发器概念2、触发器使用3、触发器的优缺点MySQL基础-变量/流程控制/游标/触发器 一、变量 在MySQL数据库的存…

RocketMQ水平扩展及负载均衡详解

文章目录 Broker端水平扩展Broker负载均衡commit logProducer负载均衡Consumer负载均衡集群模式广播模式RocketMQ是一个分布式具有高度可扩展性的消息中间件。本文旨在探索在broker端,生产端,以及消费端是如何做到横向扩展以及负载均衡的。 Broker端水平扩展 Broker负载均衡…

前端项目-05-轮播图banner和Floor组件开发-全局轮播图组件抽取

目录 1-轮播图模块数据开发 2-floor组件开发 3-抽取全局轮播图组件 1-轮播图模块数据开发 轮播图需要用到swiper插件&#xff0c;先安装5.4.5版本的swiper&#xff1a;npm install --save swiper^5.4.5 --force 模拟从服务器获取数据&#xff1b; 1-编写mockRequests的js…

【ACWing算法课】二分查找

前言&#x1f349; 二分查找一个简单的算法&#xff0c;但是因为边界问题往往写不好。特此记录模板&#xff0c;以便快捷使用。 [二分查找]从列表q找到第一个>k的数&#xff0c;返回位置&#x1f451; [二分查找]从列表q找到第一个>k的数&#xff0c;返回位置def bsear…

three.js实现3d球体树状结构布局——树状结构的实现

目录系列文章安装依赖基本分析实体类场景相机渲染器辅助线环境光点光源球形几何体球形几何体的材质线几何体线几何体的材质物体文本轨道控制实现效果实现源码参考文档系列文章 three.js实现3d球体树状结构布局——添加入场、出场、点击放大等动画 安装依赖 npm i three three…

Adaptive AUTOSAR——Time Synchronization(VRTE 3.0 R21-11)

15 Time Synchronization 15.1 What is Time Synchronization? 时间同步是自适应平台基础中的一个功能集群。时间同步通过库向应用程序提供C API&#xff0c;该库作为RTA-VRTE入门套件的一部分提供&#xff0c;并与应用程序链接以访问该功能。 本版本包含非常少量的时间同步…

ASIC-WORLD Verilog(1)一日Verilog

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…

Helm学习笔记

文章目录概念定义helm组件helm的工作流程helm安装helm仓库helm部署应用helm应用的更新或回退或卸载概念 定义 学习helm首先得了解helm是什么&#xff0c;我们先来看一下helm的定义&#xff1a;helm是将kubernetes的各种资源对象打包&#xff0c;类似于Linux中的yum工具&#…

【HTML系列】第六章 · 框架标签、HTML实体、HTML全局属性和meta元信息

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

【前端面试题——微信小程序】

目录1.请谈谈wxml与标准的html的异同&#xff1f;2.请谈谈WXSS和CSS的异同&#xff1f;3.请谈谈微信小程序主要目录和文件的作用&#xff1f;4.请谈谈小程序的双向绑定和vue的异同&#xff1f;5.简单描述下微信小程序的相关文件类型&#xff1f;6.微信小程序有哪些传值(传递数据…

jsp+javaEE+mysql校园物品租赁系统dzkf5294程序

1&#xff0e;物品信息管理&#xff1a;管理员发布物品信息后&#xff0c;普通用户便可以查询到该物品信息&#xff0c;用户选择某个物品信息&#xff0c;查询物品信息&#xff0c;管理员审核添加&#xff0c;或删除物品信息。 2&#xff0e;租赁管理&#xff1a;管理员发布租赁…

ChatGPT大解密:带您探讨机器学习背后的秘密、利用与发展

一、什么是机器学习&#xff1f;二、ChatGPT 的运作原理三、ChatGPT 生活利用1、自然语言处理2、翻译3、自动回复四、ChatGPT vs 其他相关技术五、ChatGPT 的未来1、未来发展2、职业取代3、客服人员4、翻译人员5、语言学家6、机遇与挑战六、结语这篇文章&#xff0c;将带着各位…

ThreeJS-投影、投影模糊(十七)

无投影&#xff1a; 完整的代码&#xff1a; <template> <div id"three_div"></div> </template> <script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/Or…

再不转型为ChatGPT程序员,有遭受降维打击的危险

Open AI在演示GPT-4的时候&#xff0c;有这么一个场景&#xff1a;给一个界面草图&#xff0c;就可以生成网页代码。这个演示非常简单&#xff0c;如果界面原型比较复杂呢&#xff1f;像这样&#xff1a;ChatGPT能不能直接生成HTML, CSS,JavaScript代码&#xff0c;把这个网页给…

MongoDB副本集Command failed with error 10107 (NotMaster):on server

问题 通过DataGrip连接的MongoDB节点&#xff0c;之前可以新增或更新数据。某天突然不能新增或更新数据&#xff0c;报错信息如下&#xff1a; 具体的报错信息&#xff1a; Command failed with error 10107 (NotMaster): not master on server 10.19.21.11:30386. The full…