使用 github 操作时是否可以使用静态 ip

is it possible to use static ip when using github actions

现在我正在使用 github 操作作为我的项目 CI,我想在使用 github 操作构建我的项目时进行一些单元测试。当我使用单元测试时,项目必须使用数据库,现在我的数据库有一个白名单,只有白名单中的 IP 可以连接我的数据库,但是现在当我 运行 在 GitHub Actions 中进行单元测试时,我不知道 GitHub Actions IP 地址。是否可以使用静态 ip 或任何其他方式来解决问题?我不希望任何 IP 都可以连接我的数据库,它可能有安全问题。有什么建议吗?

目前只有在您可以控制其 IP 地址的 VM 上自托管 运行ner 才有可能。

另请参阅:

或者,您的 GitHub 操作工作流程可能能够将防火墙设置作为 运行 的一部分进行调整。

或者您可以使用 SQL Server LocalDB 或 SQLLite 之类的东西在 运行ner 上本地连接到数据库。或者在云环境中启动一个临时数据库,将其打开给 运行 用户,然后将其丢弃。

或者您可以使用 VPN 客户端将操作连接到您的环境 运行。您可以在 运行ner 上安装任何您想要的东西。

如果您的数据库恰好是 Redis 或 PostgreSQL,GitHub Actions 包含一个名为 Service Containers 的内置功能,用于在 CI 中启动一个临时数据库以用于测试目的。

这些数据库是短暂的:使用它的作业完成后,托管数据库的服务容器将被销毁。如果需要,您可以 运行 容器中的数据库或直接在虚拟机上。

有关详细信息,请参阅 GitHub 操作文档中的 Creating PostgreSQL service containers

如果您恰好在使用其他数据库,您可以自己安装并运行进行更多手动安装。

您可以在工作流程中使用 public-ip action 动态检索 Github Action runner 的 IP 地址,并在单元测试步骤前后更新 EC2 服务器的安全组入口规则。

这将允许您在工作流程中使用 Github 的托管运行器,而不是托管您自己的运行器。

注意:您还需要 set AWS credentials 在您的运行器上具有更新关联的 EC2 安全组的权限。此外,您需要确保 RDS 实例位于 public 子网中,并附加了 Internet 网关和安全组。

您的工作流程应如下所示:

deploy:
    name: deploy
    runs-on: ubuntu-latest
    env:
      AWS_INSTANCE_SG_ID: <your-rds-subnet-sg-id>
    steps:
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: <your-ci-aws-access-key>
          aws-secret-access-key: <your-ci-aws-secret-key>
          aws-region: <your-rds-aws-region>
      - name: get runner ip addresses
        id: ip
        uses: haythem/public-ip@v1.2
      - name: whitelist runner ip address
        run: |
          aws ec2 authorize-security-group-ingress \
            --group-id $AWS_INSTANCE_SG_ID \
            --protocol tcp \
            --port 22 \
            --cidr ${{ steps.ip.outputs.ipv4 }}/32
      - name: connect to your rds instance and run tests
        run: |
          ...run tests...
      - name: revoke runner ip address
        run: |
          aws ec2 revoke-security-group-ingress \
            --group-id $AWS_INSTANCE_SG_ID \
            --protocol tcp \
            --port 22 \
            --cidr ${{ steps.ip.outputs.ipv4 }}/32