簡體   English   中英

在更改代碼的目錄中執行 github 操作工作流/作業

[英]Execute github actions workflow/job in directory where code was changed

我正在嘗試實施github 操作工作流,該工作將計划和應用我的 terraform 代碼更改,僅用於進行更改的目錄。 我目前面臨的問題是我無法弄清楚如何切換目錄,以便從代碼已更新/更改的目錄執行 terraform 計划。

我有一個 monorepo 設置,如下所示:

repo
  tf-folder-1
  tf-folder-2
  tf-folder-3

每個文件夾包含一個獨立的 terraform 配置。 因此,例如,我只想在 tf-folder-1 中的文件發生更改時運行工作流 這樣的工作流需要切換到工作目錄 tf-folder-1 然后運行terraform plan/apply

jobs:
  terraform:
    name: "Terraform"
    runs-on: ubuntu-latest
  defaults:
    run:
      working-directory: ./tf-folder-1
  steps:
    - name: Checkout
      uses: actions/checkout@v3     

    - name: Configure AWS credentials from Test account
      uses: aws-actions/configure-aws-credentials@v1
      with:
        role-to-assume: arn:aws:iam::000000000000000:role/deploy-role
        aws-region: eu-west-2

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v2
    ...

到目前為止,我有上面的 terraform 作業,但它只針對靜態定義的工作目錄運行。 它不適用於在特定文件夾中發生更改時應該運行工作流的用例。 有人可以建議如何修復此管道嗎?

謝謝

GitHub 操作具有路徑過濾功能,您可以在處理由pushpush_request事件觸發的工作流時加以利用。

例如,假設您有一個包含tf_1tf_2和 tf_3 目錄的tf_3 當目錄tf_1發生更改時,您可以執行以下操作。

name: Demonstrate GitHub Actions on Monorepo 
on:
  push:
    branches:
      - master
    paths:
      - 'tf_1/**'

defaults:
  run:
    working-directory: tf_1 

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

有關路徑過濾的更多詳細信息,請參閱GitHub Actions 語法文檔

您可以使用 GitHub 操作來輸出文件已更改/修改的目錄,例如: Changed-files ,甚至使用git diff執行 shell 步驟的計算。

如果您使用 GHA 建議您可以將輸入dir_names設置為true ,這將 output 唯一更改的目錄而不是文件名,根據結果您可以更改目錄以運行您的 Terraform 操作。

這是根據已更新的目錄數量運行多個作業的解決方案。

在下面的代碼片段中,您可以看到將檢查哪些目錄已更新的directories作業,然后是 output 一個數組或開關,然后用於 terraform 作業的matrix策略。

jobs:
  directories:
    name: "Directory-changes"
    runs-on: ubuntu-latest
    steps:
      - uses: theappnest/terraform-monorepo-action@master
        id: directories
        with:
          ignore: |
            aws/**/policies
            aws/**/templates
            aws/**/scripts
      - run: echo ${{ steps.directories.outputs.modules }}
    outputs:
      dirs: ${{ steps.directories.outputs.modules }}
  
  terraform:
    name: "Terraform"
    runs-on: ubuntu-latest
    needs: directories
    strategy:
      matrix:
        directories: ${{ fromJson(needs.directories.outputs.dirs) }}
    defaults:
      run:
        working-directory: ${{ matrix.directories }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2
        with:
          cli_config_credentials_token: ${{ secrets.TF_CLOUD_TEAM_API_TOKEN_PREPROD }}

      - name: Terraform Format
        id: fmt
        run: terraform fmt -check

      - name: Terraform Init
        id: init
        run: terraform init
      
      - name: Terraform Validate
        id: validate
        run: terraform validate -no-color

      - name: Terraform Plan
        id: plan
        if: github.event_name == 'pull_request'
        run: terraform plan -no-color -input=false
        continue-on-error: true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM