通过 Github Action 发布项目到 Aliyun 阿里云 ECS

本贴最后更新于 1435 天前,其中的信息可能已经时移俗易

通过 Github Action 发布项目到 Aliyun 阿里云 ECS,非常适合团队项目或是个人的小项目,操作简单、便于维护。

本文将通过最详细的描述,从每个步骤的源头开始讲起,保证小白也能成功。

通过 Github 的 Action 发布到 ECS 有几个关键点:

  1. 项目构建环境的初始化,以及项目的编译

这一步可以利用 Action 的构建模板,选择合适的基础环境,然后再定制化编译脚本完成初始化和编译流程。

  1. Action 的编译环境,如何安全的连接到 ECS 完成发布

项目完成编译后,需要把文件上传到服务器,并完成服务的重启,此时需要通过 SSH 等服务。

本文以 SSH 为主进行介绍,SSH 链接到 ECS,建议通过密钥形式,安全性更高。

下面是一份我的个人项目中的一份脚本,供大家参考:

name: Build And Deploy To Aliyun ECS
on:
  push:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          persist-credentials: false
          ref: master
          submodules: true
      - name: Install and Build
        run: |
          yarn install
          yarn build          
      - name: Deploy to aliyun server
        uses: easingthemes/ssh-deploy@v2.0.7
        env:
          SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SERVER_ACCESS_TOKEN }}
          ARGS: "-avzr --delete"
          SOURCE: "dist/"
          REMOTE_HOST: ${{ secrets.ALIYUN_SERVER_HOST }}
          REMOTE_USER: "root"
          TARGET: "/root/web"

分部分介绍:

第一部分:

name: Build And Deploy To Aliyun ECS

这个是任务的名称,参考作用。

第二部分:

on:
push:
branches: [ master ]

这部分是触发器,当发生哪些行为时,触发 Github Action 的执行。
如上配置,则是当 master 分支,发生 push 时,触发执行。
你同样可以切换到其他的分支或其他的行为,比如新 tag 的 push 等等,具体请参考:
https://docs.github.com/cn/free-pro-team@latest/actions/reference/events-that-trigger-workflows

第三部分

jobs:

这里就开始正式的构建项目了,jobs 就是工作流程,工作流程运行包括一项或多项作业。 作业默认是并行运行。
我们这里定义了一项作业,即 build。

runs-on: ubuntu-latest
steps:

这里定义了我们这项作业的运行环境,机器可以是 GitHub 托管的运行器或自托管的运行器。
可选的 GitHub 运行器有 windows、ubuntu 和 macos,你也可以构建自托管的运行器,满足您高度的自定义运行环境需求。
我的项目是 NodeJS 编写的,默认的 ubuntu 运行器包含 NodeJS 环境,所以我这里直接采用了 GitHub 提供的运行器。

steps 则是作业的步骤,每个步骤可以是运行命令或是其他操作。

- name: Checkout
  uses: actions/checkout@v2
  with:
  persist-credentials: false
  ref: master
  submodules: true

这是我们作业的第一个步骤,这个步骤的任务是把我们的源码 checkout 下来,此处选择的分支是 master。

- name: Install and Build
  run: |
     yarn install
     yarn build

这是作业的第二个步骤,NodeJS 项目的构建环境初始化和编译。

- name: Deploy to aliyun server
  uses: easingthemes/ssh-deploy@v2.0.7
  env:
    SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SERVER_ACCESS_TOKEN }}
    ARGS: "-avzr --delete"
    SOURCE: "dist/"
    REMOTE_HOST: ${{ secrets.ALIYUN_SERVER_HOST }}
    REMOTE_USER: "root"
    TARGET: "/root/web"

这是作业的最后一个步骤,项目编译完成后,将会在项目目录的 dist 下生成最终文件,我们只需要把这个目录下的所有问题发布到 ECS 即可。
这里使用的是 SSH 链接到了 ECS。
先详细介绍一下几个关键参数:

ARGS: "-avzr --delete"
SOURCE: "dist/"
TARGET: "/root/web"

这三个参数,将本地的 dist 目录下的所有文件覆盖到了云端的/root/web 目录

SSH_PRIVATE_KEY: ${{ secrets.ALIYUN_SERVER_ACCESS_TOKEN }}
REMOTE_HOST: ${{ secrets.ALIYUN_SERVER_HOST }}
REMOTE_USER: "root"

这三个参数是 SSH 的链接参数,user 即链接服务的用户名(阿里云一般是 root),host 即服务器地址(可以是 IP 也可以是域名)
SSH_PRIVATE_KEY 链接私钥
其中 HOST 和 KEY 两个我们采用了环境变量的方式引用,对应 secrets 的环境变量,你可以在项目的如下图所示位置进行配置:

gaecs1.png

我们配置了两个参数,HOST 比较简单,关于私钥的配置,请参考如下步骤:

(其实是 SSH 免密码登录的配置,熟悉的同学可以掠过)

  1. 我们需要创建一个私钥

我们可以利用阿里云控制台进行操作(同样,也可以用 linux 的命令行进行操作)

进入阿里云的 ECS 控制台,在左侧菜单找到 < 网络与安全 > < 密钥对 >

点击创建密钥对,如下填写,名称和其他信息可以随意:
gaecs2.png

创建成功后,就会自动下载私钥文件,我们保存到本地即可。

  1. 利用私钥生成公钥

Windows 可以使用 WSL,Linux 的进入终端

输入如下命令,即可生成公钥

ssh-keygen -y -f /path/to/private_key > /path/to/public_key.pub
  1. 将公钥写入.ssh

将生成的公钥里面的内容,追加到 ECS 的~/.ssh/authorized_keys 中即可。

  1. 更新 ssh 配置,允许 root 登录

编辑/etc/ssh/sshd_config

修改如下配置:

PermitRootLogin yes

然后执行:

service sshd restart

应用配置

  1. 更新 GitHub 配置

进入 Secrets 配置,点击,如下图所示填写

名称填写我们在脚本里写的变量名:ALIYUN_SERVER_ACCESS_TOKEN

值,填写私钥的内容。
gaecs3.png
创建完成后,记得删掉私钥,并清空回收站,不要让任何人获取到私钥内容。

至此,一切大功告成!

  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2031 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7483 引用 • 34021 回帖 • 196 关注
  • 安全

    安全永远都不是一个小问题。

    200 引用 • 816 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 37 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    207 引用 • 358 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 157 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 652 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 211 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    676 引用 • 535 回帖 • 1 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 199 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    19 引用 • 7 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖 • 4 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 608 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1234 回帖 • 429 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    343 引用 • 1769 回帖 • 1 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 514 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    192 引用 • 511 回帖 • 2 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    165 引用 • 594 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 530 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 29 关注