热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用GithubActions部署reactapp到GithubPages

使用GithubActions部署react-app到GithubPages-前言-学以致用之前一直忙于开发,总是零散的去看一些东西,想想学东西了么?额好像学了,又好像没有学

前言-学以致用

之前一直忙于开发,总是零散的去看一些东西,想想学东西了么?额... 好像学了,又好像没有学,不知道你们有没有这种感觉,所以新年初始,换一种学习方法,本着学以致用去完整的学一些东西,正好之前想接触CI,CD 这里的知识,所以就从最常见的github开始吧,毕竟免费又常用。

初始化项目

创建github代码仓库,clone 项目到本地,进入目录初始化项目

npx create-react-app

然后按照命令提示输入完成初始化,推送项目到github。

配置github actions

目标是实现推送代码到master分支, 自动开始构建项目,部署到Gthub Pages。
按照文档先跑起来第一个流程,让自己看到效果,在去学习语法内容,这样更能激发兴趣,免得直接看文档看睡着了...

  1. 在目录外层增加 .gihub/workflows文件夹,创建第一个first-demo.yml文件,拷贝示例内容.
name: GitHub Actions Demo
on: [push]
jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "? The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "? This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "? The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v2
      - run: echo "? The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "?️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "? This job's status is ${{ job.status }}."
  1. 提交代码,点击gihub仓库上方的Actions按钮,查看效果,第一个工作流程就完成了。

开始编写自己的yml文件,实现自动构建

快速过一遍文档,学习一下语法,实现自己想要的工作流程。从demo可以看到主要有流程有这么几步

  1. name 工作流程的名称。 GitHub 在仓库的操作页面上显示工作流程的名称。
  2. on 触发流程的事件,具体可以触发的事件有这些,我们所要实现的是提交代码,所以用 push.
  3. jobs 要按顺序运行作业.

目标明确后,开始编写yml

 # 显示得workflow名称
 name: First GitHub Actions Demo
 on: 
   # 推送到master分支开始打包
   push:
     branches:
       - master

 jobs:
   # 开始打包
   Build:
     runs-on: ubuntu-latest
     steps:
     - name: checkout code
       # 迁出触发的流程的版本 能让下面的工作流程访问
       uses: actions/checkout@v2
       # setup-node 可以提供node环境,指定node版本以及 npm /yarn缓存
     - name: actions/setup-node@v2
       uses: actions/setup-node@v2   
       with:
         node: 16.14
     # 初始用的npm 打包时间太长了,就想着用yarn 结果没仔细看文档,yarn 不用安装 ubuntu 上面有的 
     # - name: install yarn 
     #  uses: npm install yarn     
     # - run: yarn install
     # - run: yarn build
     # 简写为
     - run: yarn install && yarn build

好了提交代码看Actions(这是上面没有优化时的流程)。

到此已经完成了提交代码自动打包的过程了,但是一看打包时间好家伙一分半,这要是实际开发大量依赖加入,那不得半个小时么?打开流程一看大部分时间都是在下载依赖,所以是不是可以添加缓存呢?一搜索果然有cache,麻溜的按照文档添加进入,
一看时间46s,哈哈果然有效。到此yml内容为

name: First GitHub Actions Demo
on: 
  push:
    branches:
      - master

jobs:
  Build:
    runs-on: ubuntu-latest
    steps:
    - name: checkout code
      uses: actions/checkout@v2
    - name: actions/setup-node@v2
      uses: actions/setup-node@v2   
      with:
        node: 16.14
    # 配置依赖缓存
    - name: yarn cache
      id: yarn-cahce-dir-path
      run: echo "::set-output name=dir::$(yarn cache dir)"
    - uses: actions/cache@v2
      id: yarn-cache
      with: 
        path: ${{ steps.yarn-cahce-dir-path.outputs.dir }}
        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
        restore-keys: | 
          ${{ runner.os }}-yarn-
    - run: yarn install && yarn build

部署页面到Github Pages

  1. 首先需要设定一个分支,当做站点的根目录,具体设置文档,设置完成后会告诉你网站访问地址(ps: 一定要把仓库设置为Public,不然无法进行设置)。

  1. 按照文档编辑.yml,增加发布流程
 # 上面的步骤拿过来
 # 新增 deploy
  - name: deploy
    uses: JamesIves/github-pages-deploy-action@v4.2.3
    with:
      branch: gh-pages # 部署的分支名 有一定要独立一个分支,第一次设置为master 好家伙构建完成后,直接把我的项目文件清除了,只剩下打包的文件了。
      folder: build   # build后文件目录

效果

到这里基本的目标已经实现了,但是当我看公司内部的流程时,install, build, deploy流程是分开的,这样有利于增加一些校验,lint规则等流程,所以我在思考怎么拆分流程呢,第一次我简单的拆分

name: First GitHub Actions Demo
on: 
  push:
    branches:
      - master
      - dev

jobs:
  Build:
    runs-on: ubuntu-latest
    steps:
      uses: actions/checkout@v2
      uses: actions/setup-node@v2   
      with:
        node: 16.14
    - name: yarn cache
      id: yarn-cahce-dir-path
      run: echo "::set-output name=dir::$(yarn cache dir)"
    - uses: actions/cache@v2
      id: yarn-cache
      with: 
        path: ${{ steps.yarn-cahce-dir-path.outputs.dir }}
        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
        restore-keys: | 
          ${{ runner.os }}-yarn-   
    - run: yarn install
    - run: yarn build
  Deploy:
    - name: depploy
      uses: JamesIves/github-pages-deploy-action@v4.2.3
      width:
        branch: gh-pages
        folder: build
        clean: true
        clean-exclude: |
          special-file.txt
          some/*.txt
        ssh-key: ${{ secrets.PAGE_ACCESS_TOKEN }}    

我想着这样应该就可以了,一提交代码直接GG,第一是没有Deploy没有等待build完成,第二是两个job之间的文件不能够直接用,又翻了下文档才发现官方给了这两个 actions/upload-artifact@v2 actions/download-artifact@v2 可以在不同job之间公用文件,所以又改了改,build阶段上传打包好的文件,deploy阶段下载打包好的文件进行部署(注意deploy也要使用checkout@v2)。
最终结果

name: First GitHub Actions Demo
on: 
  push:
    branches:
      - master
      - dev

jobs:
  Build:
    runs-on: ubuntu-latest
    steps:
    # 步骤名称
    - name: checkout code
      uses: actions/checkout@v2
    - name: actions/setup-node@v2
      uses: actions/setup-node@v2   
      with:
        node-version: '16.14'
        cache: 'yarn'
        cache-dependency-path: '**/yarn.lock'
    # 缓存 有需要可以开启 同时 setu node 也可以进行缓存
    # - name: yarn cache
    #   id: yarn-cahce-dir-path
    #   run: echo "::set-output name=dir::$(yarn cache dir)"
    # - uses: actions/cache@v2
    #   id: yarn-cache
    #   with: 
    #     path: ${{ steps.yarn-cahce-dir-path.outputs.dir }}
    #     key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
    #     restore-keys: | 
    #       ${{ runner.os }}-yarn-    
    - run: yarn install && yarn build  
    # 上传打包好的文件,所以下一步可以使用
    - name: upload files 
      uses: actions/upload-artifact@v2
      with: 
        name: build-pages
        path: build
        retention-days: 1
  Deploy: 
    needs: Build # 确保build 阶段完成
    runs-on: ubuntu-latest
    steps:
      - name: checkout code
        uses: actions/checkout@v2
      - name: download build files
        uses: actions/download-artifact@v2
        with:
          name: build-pages
          path: build
      - name: deploy
        uses: JamesIves/github-pages-deploy-action@v4.2.3
        with:
          branch: gh-pages
          folder: build 
          token: "${{ secrets.DEPLOY_TOKEN }}"  

提交代码,查看运行结果,完成拆分。

到这里可以愉快的访问你的网站了。

结尾

写作思路是按照当时完成的思路一步一步的去完成这个流程来的,所以有些功能可能还没想到,同时如果流程有什么可以优化的地方,欢迎各位大佬指教。当然,完整的流程还欠缺很多,目前只是先完成简单的打包构建流程,接下来还需要去学习gitlab 的CI、CD,完成后会在水一篇文章。在之后才会去看一些部署项目相关的内容。比如Docker,Nginx等,希望能在空闲之余学会整个流程。加油!


推荐阅读
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • Vue 3.0 翻牌数字组件使用指南
    本文详细介绍了如何在 Vue 3.0 中使用翻牌数字组件,包括其基本设置和高级配置,旨在帮助开发者快速掌握并应用这一动态视觉效果。 ... [详细]
author-avatar
HGFHE
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有