GitHub Actions持续部署

news2024/11/25 0:19:58

一、概述

1.1Github Action介绍

 什么是Github Action ?

GitHub Actions是GitHub提供的CI/CD(持续集成/持续部署)服务。它允许你在GitHub仓库中自动化、定制和执行你的软件开发工作流。你可以发现、创建和分享用于执行任何你想要的工作的操作,包括CI/CD,并在完全定制的工作流中组合操作。 


它可以帮助你通过自动化的构建(包括编译、发布、自动化测试)来验证你的代码,从而尽快地发现集成错误。github于2019年11月后对该功能全面开放,现在所有的github用户可以直接使用该功能。GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行您的工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。在使用Github Action之前首先需要了解以下前置知识:

  • 持续集成/持续交付的概念。
  • Git相关知识。
  • Linux或Windows或macOS脚本相关知识。
  • Yaml基础语法。

1.2基本概念 

  • workflow: 一个 workflow 就是一个完整的工作流过程,每个workflow 包含一组 jobs任务。
  • job : jobs任务包含一个或多个job ,每个 job包含一系列的 steps 步骤。
  • step : 每个 step 步骤可以执行指令或者使用一个 action 动作。
  • action : 每个 action 动作就是一个通用的基本单元。

1.3Github Action 的使用限制

在使用免费版本的Github Action是有如下限制的:

  • 作业执行时间 - 工作流中的每个作业最多可以运行 6 小时的执行时间。如果作业达到此限制,该作业将终止且无法完成。

  • 工作流运行时间 - 每个工作流运行限制为 35 天。如果工作流运行达到此限制,则工作流运行将被取消。此时间段包括执行持续时间以及等待和批准所花费的时间。

  • API 请求 - 您可以在一小时内跨存储库中的所有操作执行多达 1000 个 API 请求。如果超出此限制,其他 API 调用将失败,这可能会导致作业失败。

  • 并发作业 - 可以在帐户中运行的并发作业数取决于 GitHub 计划,如下表所示。如果超出,则任何其他作业都将排队。

  • 作业矩阵 - 作业矩阵每次工作流运行最多可以生成 256 个作业。此限制适用于 GitHub 托管和自托管的运行程序。

  • 工作流运行队列 - 每个存储库的排队时间间隔不超过 500 个工作流运行,间隔为 10 秒。如果工作流运行达到此限制,则工作流运行将终止且无法完成。

 相关Github Action文档

1.4工作流程

持续集成

GitHub Actions 可以用于实现持续集成(Continuous Integration,简称 CI)。持续集成是一种开发实践,开发人员会频繁地(比如每天)将代码集成到主分支。每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽早地发现集成错误。 

持续交付

要使用 GitHub Actions 进行持续交付,你需要创建一个名为 .github/workflows 的目录,并在其中添加一个 YAML 文件来定义你的工作流程。

持续部署

总结

二、GitHubAction的使用

持续集成流程

1.开启github共享项目

2.在项目库根路径下的.github/workflows目录中创建一个.yml 文件(或者 .yaml)

name: Java CI with Maven  # 工作流程的名称

on:  # 触发工作流程的事件
  push:  # 当有新的推送到以下分支时
    branches: [ "master" ]  # master分支
  pull_request:  # 当有新的拉取请求到以下分支时
    branches: [ "master" ]  # master分支

jobs:  # 工作流程中的任务
  build:  # 任务的名称

    runs-on: ubuntu-latest  # 任务运行的环境,这里是最新版本的Ubuntu

    steps:  # 任务中的步骤
    - uses: actions/checkout@v3  # 使用actions/checkout@v3来检出仓库代码
    - name: Set up JDK 17  # 步骤的名称,这里是设置JDK 17
      uses: actions/setup-java@v3  # 使用actions/setup-java@v3来设置JDK
      with:  # 步骤的参数
        java-version: '17'  # JDK的版本
        distribution: 'temurin'  # JDK的发行版
        cache: maven  # 缓存Maven依赖
    - name: Build with Maven  # 步骤的名称,这里是使用Maven构建项目
      run: mvn -B package --file pom.xml  # 运行Maven命令来构建项目

    # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
    - name: Update dependency graph  # 步骤的名称,这里是更新依赖图
      uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6  # 使用advanced-security/maven-dependency-submission-action来提交依赖图

3.推到开发分支

4../github/workflows/拉回本地,修改后并重新推送

原理概述

name

Workflow的名字,随便可以设置,就是工作流的名字。如果省略该字段,默认为当前 workflow 的文件名。

name: hello-github-actions

on

触发的事件,可以是一个事件数组。
在代码仓库Push时触发:

#push时触发
on: push

可以用数组指定多个条件触发:

#push和merge时触发
on: [push, merge]

还可以对条件进行限制触发:

#当master分支push时触发,可以限定分支或标签。
on:
  push:
    branches:
      - master

完整的事件列表,请查看官方文档。除了代码库事件,GitHub Actions 也支持外部事件触发,或者定时运行。

jobs

job

jobs表示要执行的一项或多项任务。jobs可以包含一个或多个job,一个job就是一个任务,这个任务可以包含多个步骤(steps):

jobs:
  job1:
    ...
  job2:
    ...     

需要注意的是每一个Job都是并发执行的并不是按照申明的先后顺序执行的, 如果多个job 之间存在依赖关系,那么你可能需要使用 needs :

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

这里的needs声明了job2 必须等待 job1 成功完成,job3必须等待 job1 和 job2依次成功完成。因此,这个 workflow 的运行顺序依次为:job1、job2、job3。needs字段指定当前任务的依赖关系,即运行顺序。 

job->runs-on

runs-on字段指定运行所需要的虚拟机环境。它是必填字段,目前可用的虚拟机如下:

  • ubuntu-latest,ubuntu-18.04或ubuntu-16.04。
  • windows-latest,windows-2019或windows-2016。
  • macOS-latest或macOS-10.14。
    指定job的运行环境:
jobs:
  job1:
    runs-on: ubuntu-18.04
  job2:
    runs-on: macos-10.15
  job3:
    runs-on: windows-2019    

github 会提供一个配置很不错的服务器做为 runner,Windows 和 Linux 虚拟机的硬件规格:

  • 2 核处理器。
  • 7 GB 内存。
  • 14 GB 固态硬盘空间。

macOS 虚拟机的硬件规格:

  • 3 核处理器。
  • 14 GB 内存。
  • 14 GB 固态硬盘空间。

如果你有网络时延的需求,(比如推送及拉取镜像时产生的网络时延),你也可以自建runner 。

.job->env

使用env可以给该任务或者是步骤配置环境变量:

 env:
   name: "zhangsan"
 run: |
   echo $name

环境变量可以配置在以下地方:

  • jobs->job->env
  • jobs->job->steps.env
job->steps

steps字段指定每个 Job 的运行步骤,每个job由多个step构成,它会从上至下依次执行。steps可以包含一个或多个步骤,每个 step 步骤可以有:

  • name:步骤名称,步骤的名称。
  • env:该步骤所需的环境变量。
  • id : 每个步骤的唯一标识符
  • uses : 使用哪个action,这个表示使用别人预先设置好的Actions,比如因为我代码中要用到python,所以就用了actions/setup-python@v1来设置python环境,不用我自己设置了。
  • with: 指定某个action 可能需要输入的参数。
  • run: 执行哪些指令,具体运行什么命令行代码。
  • continue-on-error : 设置为 true 允许此步骤失败job 仍然通过。
  • timeout-minutes : step 的超时时间。

例如:

    steps:  # 任务中的步骤
    - uses: actions/checkout@v3  # 使用actions/checkout@v3来检出仓库代码
    - name: Set up JDK 17  # 步骤的名称,这里是设置JDK 17
      uses: actions/setup-java@v3  # 使用actions/setup-java@v3来设置JDK
      with:  # 步骤的参数
        java-version: '17'  # JDK的版本
        distribution: 'temurin'  # JDK的发行版
        cache: maven  # 缓存Maven依赖
    - name: Build with Maven  # 步骤的名称,这里是使用Maven构建项目
      run: mvn -B package --file pom.xml  # 运行Maven命令来构建项目

Action

Github Actions 是GitHub的持续集成服务。持续集成由很多操作组成,比如登录远程服务器,发布内容到第三方服务等等,这些相同的操作完全可以提取出来制作成脚本供所有人使用。GitHub允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用该脚本,这个脚本就是一个Action。如果你需要某种功能的Action可以从GitHub社区共享的action官方市场查找,也可以自己编程Action开源出来供大家使用。既然 actions 是代码仓库,当然就有版本的概念,用户可以引用某个具体版本的 action。 下面都是合法的 action 引用:

actions/setup-node@74bc508 # 指向一个 commit
actions/setup-node@v1.0    # 指向一个标签
actions/setup-node@master  # 指向一个分支

GitHub Actions 中使用密文

在持续集成的过程中,我们可能会使用到自己的敏感数据,这些数据不应该被开源并泄露。那么如何才能安全的使用这些敏感数据呢?GithubActions提供了Secrets变量来实现这一效果。我们可以在 github repo 上依次点击 Settings -> Secrets-> Actions->New repository secret创建一个敏感数据例如:OSS_KEY_ID,OSS_KEY_SECRET, 然后我们就可以在GithubAction脚本中使用这一变量了:

-  name:  setup  aliyun  oss
    uses:  manyuanrong/setup-ossutil@master
    with:
        endpoint:  oss-cn-beijing.aliyuncs.com
        access-key-id:  ${{  secrets.OSS_KEY_ID  }}
        access-key-secret:  ${{  secrets.OSS_KEY_SECRET  }}

这里的secret就是一种context,描述 CI/CD 一个workflow 中的上下文信息,使用${{ expression }}语法表示。更多context信息可以参考官方文档

问题解决

报403Resource not accessible by integration

参考解决方案

快速解决 Resource not accessible by integration

报404"The Dependency graph is disabled for this repository. Please enable it before submitting snapshots.",

这个错误信息表示你正在尝试提交依赖关系快照,但是这个仓库的依赖关系图已经被禁用了。你需要先启用它,然后再提交快照。

你可以按照以下步骤来启用仓库的依赖关系图:

1. 打开你的 GitHub 仓库。
2. 点击仓库的 "Settings"(设置)选项卡。
3. 在左侧的导航栏中,点击 "Security & analysis"(安全与分析)。
4. 在 "Dependency graph"(依赖关系图)部分,点击 "Enable"(启用)。

完成以上步骤后,你应该就可以提交依赖关系快照了。如果问题仍然存在,你可能需要联系 GitHub 的支持团队以获取更多的帮助。

持续交付流程

 1.找到华为云docker登录指令

2。隐私数据处理

3.设置docker

      name: docker push
      run: |
        ${{ secrets.HUAWEI_DOCKERLOGIN }}
        docker build . -t ${{ secrets.HUAWEI_DOCKERREPOSITORY }}
        docker push ${{ secrets.HUAWEI_DOCKERREPOSITORY }}

 4.推送

持续部署流程

deploy:  # 定义一个名为 "deploy" 的工作
  needs: [build]  # 这个工作需要在 "build" 工作完成后才能开始
  runs-on: ubuntu-latest  # 这个工作将在最新版本的 Ubuntu 虚拟环境中运行
  steps:  # 定义这个工作的步骤
    - name: deploy  # 定义一个名为 "deploy" 的步骤
      uses: appleboy/ssh-action@master  # 使用 appleboy/ssh-action 这个 GitHub Action
      with:  # 为这个 Action 提供参数
        host: ${{ secrets.HUAWEI_HOST }}  # SSH 主机地址
        username: ${{ secrets.HUAWEI_USERNAME }}  # SSH 用户名
        password: ${{ secrets.HUAWEI_PWD }}  # SSH 密码
        script: |  # 要在 SSH 会话中执行的脚本
          ${{ secrets.HUAWEI_DOCKERLOGIN }}  # 登录到 Docker
          docker stop $(docker ps --filter ancestor=${{ secrets.HUAWEI_DOCKERREPOSITORY }} -q)  # 停止所有使用指定 Docker 镜像的容器
          docker rm -v $(docker ps --filter ancestor=${{ secrets.HUAWEI_DOCKERREPOSITORY }} -q)  # 删除这些容器
          docker rmi -f $(docker images ${{ secrets.HUAWEI_DOCKERREPOSITORY }} -q)  # 删除指定的 Docker 镜像
          docker pull ${{ secrets.HUAWEI_DOCKERREPOSITORY }}  # 从 Docker 仓库拉取最新的镜像
          docker run -d -p 3080:8080 ${{ secrets.HUAWEI_DOCKERREPOSITORY }}  # 运行新的 Docker 容器,将容器的 8080 端口映射到主机的 3080 端口

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

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

相关文章

实现HBase表和RDB表的转化(附Java源码资源)

实现HBase表和RDB表的转化 一、引入 转化为HBase表的三大来源:RDB Table、Client API、Files 如何构造通用性的代码模板实现向HBase表的转换,是一个值得考虑的问题。这篇文章着重讲解RDB表向HBase表的转换。 首先,我们需要分别构造rdb和hba…

1.文本的方式读写文件

文章目录 写入文件代码运行结果 读出文件代码运行结果 文件打开模式标记(查表) 写入文件 ------读写文件一共五步:------ 第一步:包含头文件 第二步:创建流对象 第三步:指定方式打开文件 第四步&#xff1…

三.使用java的API文档

在Java中,API是指“应用程序接口”(Application Programming Interface)。Java API是Java编程语言中提供的类和接口的集合,用于开发各种类型的应用程序。类比C的STL(标准模板库)。 通俗理解就当做些封装好…

【django framework】ModelSerializer+GenericAPIView接口数据流

GenericAPIView数据从序列化到最终返回响应的数据流 // 以ModelSerializergenerics.CreateAPIView为例 程序终归是为了处理数据,怎么处理,以怎样的顺序和方法去处理,就涉及到了具体的业务流程。当我们是用了一个牛掰的框架,发现原…

uniapp 写安卓app,运行到手机端 调试

手机 设置》关于手机》点击版本号 4-5次,弹出手机锁屏页面,输入手机锁屏密码 2.手机 设置中 》搜索 开发人员选项 》 调试》打开USB调试 同页面 找到 选择USB配置》选择 MIDIhbuilder 编辑器 点击 》运行》运行到手机或模拟器》运行到Android App基座 》…

Linux内存管理--系列文章貮

接上文,用户态写完,本章写内核态内存空间。 3.2内核态内存 大家会发现用户态空间不管32还是64位,这种内存分布是相差不大的。是因为使用虚拟内存的系统,会让应用程序感到和别的程序是相互独立的,互不干扰&#xff0c…

网络编程套接字——实现简单的UDP网络程序

目录 1、预备知识 1.1、认识端口号 1.2、端口号 vs 进程pid 1.3、认识TCP协议 1.4、认识UDP协议 1.5、网络字节序 2、socket编程接口 2.1、socket常见API 2.2、sockaddr结构 3、实现一个简易的UDP服务器和客户端通信 log.hpp UdpServer.hpp UdpClient.cc Main.cc…

pytorch CV入门 - 汇总

初次编辑:2024/2/14;最后编辑:2024/3/9 参考网站-微软教程:https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorch 更多的内容可以参考本作者其他专栏: Pytorch基础:https…

力扣热题100_矩阵_240_搜索二维矩阵 II

文章目录 题目链接解题思路解题代码 题目链接 240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入&#xf…

计算机网络 |内网穿透

其实内网穿透,也挺好玩的,如果在大学的时候,那个时候讲计算机网络的老师能横向延展,估计课也会更有趣不少,本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说,怪可惜的 回到正题,内网…

提高安全投资回报:威胁建模和OPEN FAIR™风险分析

对大多数人和企业来说,安全意味着一种成本。但重要的是如何获得适合的量,而不是越多越好。然而,你如何决定什么时候可以有足够的安全性,以及你如何获得它?则完全是另一回事。 该篇文章是由The Open Group安全论坛主办&…

k8s之图形界面DashBoard【九】

文章目录 9. DashBoard9.1 部署Dashboard9.2 使用DashBoard 镇场 9. DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard&…

leetcode 热题 100_环形链表 II

题解一: 哈希表:遍历链表,用哈希表存储遍历过的链表节点,判断链表节点是否在哈希表中存在,如果存在说明链表出现过,第一个重复出现的节点即为开始入环的第一个节点。 import java.util.HashSet;public cla…

第八阶段:uni-app小程序 --首页开发(2)

一:分析页面布局 1.1: 功能 搜索框: 轮播图: 分类的导航区: 楼层区: 二: 利用命令创建home分支 git branch git checkout -b home git branch 三: 配置网络请求(main.js 入口函数&#x…

python问题:vscode切换环境,pip安装库网络错误

python问题:vscode切换环境,pip安装库网络错误 vscode切换环境pip安装库网络错误 记录一下遇见的python问题。 vscode切换环境 在vscode上面的搜索框输入 > select interpreter然后选择需要的环境。 pip安装库网络错误 用requirements.txt来安装…

CentOS部署 JavaWeb 实现 MySql业务

一、项目打war包 在eclispe或idea中找到项目,右键打war包。 二、上传项目到linux 2.1云服务器虚拟机均可 以tomcat为例 /usr/local/tomcat/webapps 将war包通过ssh连接上传到webapps目录下。 如果是root目录则不需要项目名即 ip或域名端口直接访问&#xff08…

linux下重启ORACLE

切换到oracle用户 su - oracle 登录oracle sqlplus / as sysdba 启动数据库 startup 退出数据库 exit 启动监听 lsnrctl start FINISH

Docker使用(二)Docker安装和常见典型操作

Docker使用(二)Docker安装和常见典型操作 二、软件安装 1、Docker安装 (1)环境准备 [rootlocalhost ~]# uname -r 3.10.0-327.el7.x86_64 # cat /etc/os-release (2)卸载旧版本 $ sudo yum remove docker \ ​ docker-cli…

OpenCV4.9.0开源计算机视觉库在 Linux 中安装

返回目录:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 环境变量参考 下一篇:将OpenCV与gcc和CMake结合使用 引言: OpenCV是一个开源的计算机视觉库,由英特尔公司所赞助。它是一个跨…

KBP210-ASEMI新能源专用整流桥KBP210

编辑:ll KBP210-ASEMI新能源专用整流桥KBP210 型号:KBP210 品牌:ASEMI 封装:KBP-4 正向电流(Id):2A 反向耐压(VRRM):1000V 正向浪涌电流:6…