【问题标题】:How to structure GitHub actions如何构建 GitHub 操作
【发布时间】:2022-12-09 00:40:30
【问题描述】:

我来自 Travis,是 GitHub 操作的新手,尽管阅读了大量文档和示例,但仍有一些方面我不理解。

通常,我有两种工作:验证和部署。

  • 对于推送到 main 或拉取请求,运行验证脚本(单元测试、lint、生成文档等)。这是推送到 main 或 PR 时应该始终首先运行的内容。
  • 对于推送到某些分支机构,在验证作业成功完成后运行部署作业。不同的分支应该触发不同的部署目标(开发、暂存、生产……)

我知道我可以创建一个包含多个作业的工作流,这样一个作业可以是“验证”并执行这些步骤,一个作业可以是“部署”并执行这些作业。但是触发器是不同的。部署作业应该只针对 _some 分支运行,并且似乎无法在其中使用 on 指令工作,仅适用于整个工作流程文件?

我知道我可以使用 if 来检查诸如针对 /ref/heads/master 等的分支,但我认为这非常丑陋,考虑到 on: branches: xxx 等有一个触发机制。然后诉诸于而是在步骤中使用 if 条件的单个作业。我对吗?

那么,我是否应该创建verify.ymldeploy-dev.ymldeploy-staging.ymldeploy-production.yml? 我也明白我可以创建一个带有输入的可重用工作流,这样我就可以创建一个 deploy.yml 工作流,它是从 deploy-dev.yml 等传递过来的,输入像 STAGE=dev。 但是我是否需要为我的每个工作流程重复 actions/checkoutactions/setup-node 等,或者不同的工作流程文件之间是否存在任何关系?

什么是最好的结构 1) 始终运行测试等 2) 在测试运行后根据目标分支部署到不同的环境。

  • 多个工作流文件(设置代码有重复步骤?)
  • run:步骤中包含多个作业和条件的一个工作流
  • 还有别的吗?

【问题讨论】:

    标签: github-actions


    【解决方案1】:

    听起来您想设置 GitHub Actions 工作流程以根据推送到的分支或创建的拉取请求运行不同的作业和步骤。这可以通过 GitHub Actions 实现,您可以通过几种不同的方式构建工作流程来实现这一点。

    一种选择是创建包含多个作业的单个工作流文件,并使用 if 关键字指定每个作业应在何时运行。例如,您可以有一个为所有分支运行的“验证”作业,以及一个仅为特定分支运行的“部署”作业。这是一个看起来如何的示例:

    name: CI/CD
    
    on: [push]
    
    jobs:
      verification:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
          - name: Run verification tests
            run: make verify
    
      deployment:
        runs-on: ubuntu-latest
        if: startsWith(github.ref, 'refs/heads/deploy-')
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
          - name: Deploy to dev
            run: make deploy-dev
    

    在此示例中,“验证”作业针对所有分支运行,但“部署”作业仅针对以“deploy-”开头的分支运行。您可以调整 if 条件以匹配您要部署到的分支。

    另一种选择是为每个部署目标创建单独的工作流文件,并使用 on.branches 关键字指定哪些分支应触发工作流。例如,您可以创建一个只为 dev 分支运行的 deploy-dev.yml 工作流文件,以及一个只为 staging 分支运行的 deploy-staging.yml 工作流文件。这是一个看起来如何的示例:

    # deploy-dev.yml
    
    name: Deploy to dev
    
    on:
      push:
        branches: [dev]
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
          - name: Deploy to dev
            run: make deploy-dev
    
    
    # deploy-staging.yml
    
    name: Deploy to staging
    
    on:
      push:
        branches: [staging]
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout code
            uses: actions/checkout@v2
          - name: Deploy to staging
            run: make deploy-staging
    

    使用这种方法,您可以为每个部署目标创建单独的工作流文件,并使用 on.branches 关键字指定哪些分支应触发每个工作流。这是使您的工作流文件井井有条且更易于理解的有用方法。

    最终,适合您工作流程的最佳结构将取决于您的具体需求和偏好。您可能想尝试不同的方法,看看哪种方法最适合您。

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2021-08-16
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2021-04-25
      相关资源
      最近更新 更多