Project Icon

ec2-github-runner

GitHub Actions自托管EC2运行器自动化部署方案

ec2-github-runner项目提供GitHub Actions工作流程解决方案,实现按需启停AWS EC2实例作为自托管运行器。该方案支持访问VPC私有资源、自定义硬件配置,有助于优化CI/CD流程和成本控制。项目包含IAM设置、EC2镜像制作、VPC配置等完整步骤,并提供详细使用说明和示例。适用于需要特定环境或资源访问的GitHub Actions工作流程。

GitHub Actions的按需自托管AWS EC2运行器

⚠️ 如果您喜欢这个项目,请考虑在俄罗斯占领者发动的战争中支持乌克兰。任何帮助都将不胜感激!

<图片>

(图片由Nina Dzyvulska提供)


awesome-runners

在需要时立即启动您的EC2自托管运行器。 在其上运行作业。 最后,完成后停止它。 这一切都可以作为GitHub Actions工作流程的一部分自动完成。

GitHub Actions自托管EC2运行器

请参阅下方图中所示工作流程的YAML代码。

目录

使用场景

访问VPC中的私有资源

该操作可以在您需要的VPC的任何子网中启动EC2运行器 - 无论是公共还是私有子网。 通过这种方式,您可以轻松地从GitHub Actions工作流程访问VPC中的任何私有资源。

例如,您可以访问私有子网中的数据库以运行数据库迁移。

自定义硬件配置

GitHub为其Linux虚拟机提供了一种固定的硬件配置:2核CPU、7 GB RAM、14 GB SSD磁盘空间。

您的某些CI工作负载可能需要比GitHub托管的运行器提供的更强大的硬件。 在此操作中,您可以为运行器配置AWS提供的任何EC2实例类型。

例如,您可以为某些计算密集型工作负载运行c5.4xlarge EC2运行器。 或者为处理大型数据集的工作负载运行r5.xlarge EC2运行器。

节省成本

如果您的CI工作负载不需要GitHub托管运行器的性能,并且执行时间超过几分钟, 您可以考虑在AWS的更便宜、性能较低的实例上运行它。

根据GitHub的文档,您无需为自托管运行器处理的作业付费:

自托管运行器可以免费用于GitHub Actions,但您需要负责维护运行器机器的成本。

因此,GitHub只会对自托管运行器的启动和停止时间收费。 EC2自托管运行器将处理其他所有事务,因此您只需向AWS支付费用,这可能比GitHub托管运行器的价格更便宜。

使用方法

如何开始

按照以下步骤准备您的工作流程,以在EC2自托管运行器上运行:

1. 准备具有AWS访问密钥的IAM用户

  1. 为新的或现有的IAM用户创建新的AWS访问密钥,并具有以下最低权限:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ec2:RunInstances",
            "ec2:TerminateInstances",
            "ec2:DescribeInstances",
            "ec2:DescribeInstanceStatus"
          ],
          "Resource": "*"
        }
      ]
    }
    

    如果您计划使用iam-role-name参数将IAM角色附加到EC2运行器,则需要允许额外的权限:

    {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "ec2:ReplaceIamInstanceProfileAssociation",
           "ec2:AssociateIamInstanceProfile"
         ],
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": "iam:PassRole",
         "Resource": "*"
       }
     ]
    }
    

    如果使用aws-resource-tags参数,还需要允许创建标签的权限:

    {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "ec2:CreateTags"
         ],
         "Resource": "*",
         "Condition": {
           "StringEquals": {
             "ec2:CreateAction": "RunInstances"
           }
         }
       }
     ]
    }
    

    上述示例策略仅作为指南提供。通过指定您使用的资源,可以并且很可能应该进一步限制这些权限。

  2. 将密钥添加到GitHub的密钥中。

  3. 使用aws-actions/configure-aws-credentials操作将密钥设置为环境变量。

2. 准备GitHub个人访问令牌

  1. 创建一个具有repo范围的新GitHub个人访问令牌。 该操作将使用此令牌在仓库级别管理GitHub账户中的自托管运行器。
  2. 将令牌添加到GitHub的密钥中。

3. 准备EC2镜像

  1. 基于您需要的任何Linux发行版创建一个新的EC2实例。
  2. 使用SSH连接到实例,安装dockergit,然后启用docker服务。 对于 Amazon Linux 2,命令如下所示:
sudo yum update -y && \
sudo yum install docker -y && \
sudo yum install git -y && \
sudo yum install libicu -y && \
sudo systemctl enable docker

对于其他 Linux 发行版,命令可能略有不同。

  1. 安装工作流程所需的其他工具。
  2. 从该实例创建新的 EC2 镜像(AMI)。
  3. 如果在创建镜像后不再需要该实例,请将其删除。

或者,您可以使用原始 EC2 AMI,并通过工作流 YAML 文件中的 pre-runner-script 设置依赖项。请参阅下面 pre-runner-script 文档中的示例。

4. 准备带有子网和安全组的 VPC

  1. 创建新的 VPC 和其中的新子网。 或使用现有的 VPC 和子网。
  2. 在 VPC 中为运行器创建新的安全组。 只允许 443 端口的出站流量,用于从 GitHub 拉取作业。 不需要入站流量。

5. 配置 GitHub 工作流

  1. 创建新的 GitHub Actions 工作流或编辑现有工作流。
  2. 使用下面的文档和示例来配置您的工作流。
  3. 请不要忘记在工作流执行结束时设置一个移除 EC2 实例的作业。 否则,EC2 实例不会被移除,即使在工作流执行完成后也会继续运行。

现在您已准备就绪!

输入参数

名称是否必需描述
mode始终必需。在此处指定要使用的模式:
- start - 启动新的运行器;
- stop - 停止先前创建的运行器。
github-token始终必需。具有 repo 作用域的 GitHub 个人访问令牌。
ec2-image-id使用 start 模式时必需。EC2 镜像 ID(AMI)。

新运行器将从此镜像启动。

该操作与 Amazon Linux 2 镜像兼容。
ec2-instance-type使用 start 模式时必需。EC2 实例类型。
subnet-id使用 start 模式时必需。VPC 子网 ID。

子网应属于与指定安全组相同的 VPC。
security-group-id使用 start 模式时必需。EC2 安全组 ID。

安全组应属于与指定子网相同的 VPC。

只应允许 443 端口的出站流量。不需要入站流量。
label使用 stop 模式时必需。分配给运行器的唯一标签名称。

标签由 start 模式下操作的输出提供。

当不再需要运行器时,使用标签从 GitHub 中移除运行器。
ec2-instance-id使用 stop 模式时必需。创建的运行器的 EC2 实例 ID。

ID 由 start 模式下操作的输出提供。

当不再需要运行器时,使用 ID 终止 EC2 实例。
iam-role-name可选。仅在 start 模式下使用。要附加到创建的 EC2 运行器的 IAM 角色名称。

这允许运行器具有在 AWS 账户内运行其他操作的权限,而无需管理额外的 GitHub 密钥和 AWS 用户。

设置此项需要启动实例的角色具有额外的 AWS 权限(见上文)。
aws-resource-tags可选。仅在 start 模式下使用。指定要添加到 EC2 实例和任何附加存储的标签。

此字段是标签对象的 JSON 字符串数组,每个对象包含 KeyValue 字段(见下面的示例)。

设置此项需要启动实例的角色具有额外的 AWS 权限(见上文)。
runner-home-dir可选。仅在 start 模式下使用。指定预安装 actions-runner 软件和脚本所在的目录。

pre-runner-script可选。仅在 start 模式下使用。指定在运行器启动前要运行的 bash 命令。这对于使用 apt-get、yum、dnf 等安装依赖项很有用。例如:
          - name: 启动 EC2 运行器
with:
mode: start
...
pre-runner-script: |
sudo yum update -y && \
sudo yum install docker git libicu -y
sudo systemctl enable docker


环境变量

除了上述输入参数外,该操作还需要以下环境变量来访问您的 AWS 账户:

  • AWS_DEFAULT_REGION
  • AWS_REGION
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

我们建议在创建自托管运行器的步骤之前使用 aws-actions/configure-aws-credentials 操作。这个操作可以完美地设置所需的环境变量。

输出

名称描述
label分配给运行器的唯一标签名称。

该标签在两种情况下使用:
- 作为后续作业的 runs-on 属性的输入;
- 当不再需要运行器时,从 GitHub 中移除它。
ec2-instance-id创建的运行器的 EC2 实例 ID。

当不再需要运行器时,使用该 ID 终止 EC2 实例。

示例

上图所示的工作流程在 do-the-job.yml 中声明如下:

name: do-the-job
on: pull_request
jobs:
  start-runner:
    name: 启动自托管 EC2 运行器
    runs-on: ubuntu-latest
    outputs:
      label: ${{ steps.start-ec2-runner.outputs.label }}
      ec2-instance-id: ${{ steps.start-ec2-runner.outputs.ec2-instance-id }}
    steps:
      - name: 配置 AWS 凭证
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
      - name: 启动 EC2 运行器
        id: start-ec2-runner
        uses: machulav/ec2-github-runner@v2
        with:
          mode: start
          github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
          ec2-image-id: ami-123
          ec2-instance-type: t3.nano
          subnet-id: subnet-123
          security-group-id: sg-123
          iam-role-name: my-role-name # 可选,需要额外权限
          aws-resource-tags: > # 可选,需要额外权限
            [
              {"Key": "Name", "Value": "ec2-github-runner"},
              {"Key": "GitHubRepository", "Value": "${{ github.repository }}"}
            ]
  do-the-job:
    name: 在运行器上执行任务
    needs: start-runner # 需要等待运行器就绪才能开始主要任务
    runs-on: ${{ needs.start-runner.outputs.label }} # 在新创建的运行器上运行任务
    steps:
      - name: Hello World
        run: echo 'Hello World!'
  stop-runner:
    name: 停止自托管 EC2 运行器
    needs:
      - start-runner # 需要获取 start-runner 作业的输出
      - do-the-job # 需要等待主要任务完成
    runs-on: ubuntu-latest
    if: ${{ always() }} # 即使前面的作业出错也需要停止运行器
    steps:
      - name: 配置 AWS 凭证
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
      - name: 停止 EC2 运行器
        uses: machulav/ec2-github-runner@v2
        with:
          mode: stop
          github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
          label: ${{ needs.start-runner.outputs.label }}
          ec2-instance-id: ${{ needs.start-runner.outputs.ec2-instance-id }}

真实用户示例

这个讨论中,你可以找到该操作用户的反馈和示例。

如果你在工作流程中使用了这个操作,也欢迎在那里添加你的使用经历 🙌

公共仓库中自托管运行器的安全性

我们建议不要在公共仓库中使用自托管运行器。

公共仓库的分支可能通过创建一个执行工作流程中代码的拉取请求,在你的自托管运行器机器上运行危险代码。

关于这个安全注意事项的更多详细信息,请查看 GitHub 文档

许可证摘要

本代码根据 MIT 许可证 提供。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号