GitHub Action - 如何在多个环境上部署发布?

5
在我的情况下,有四个基于Windows的环境,Dev、QA、UAT和Prod,这些环境都是自托管的运行程序。一旦构建完成,应该成功地按照DevQAUATPROD的顺序将软件包部署到每个环境中。下面的工作流程只针对Dev环境编写了构建和部署软件包的部分。现在需要进一步在QA、UAT和Prod环境部署发行版,那么相同的部署部分应该在QA、UAT和Prod上重复吗?没有“类”这样的概念,其中发布部署步骤可以通过参数多次调用吗? 工作流程-API

构建部分

name: PASH-API-Build-Deployment 
on: 
 push:
    branches: [dev]
    paths: 
    - "Pash.Web/**" 
jobs:
 build:
    runs-on: dev-build
    strategy:
      matrix:
        node-version: 3.1.301
    env:
      api-project:  "./Pash.Web/PASH.Api/PASH.Api.csproj"
      test-project:  "./Pash.Web/PASH.Api.Test/PASH.Api.Test.csproj"
      upload-artifacts-path: "./pashdotnetcorewebapp"
      artifact-package-zip-directory-path: "_PASH-API-CI/Pash-drop"
      
    steps:
    - name: Generate build number
      id: buildnumber
      uses: einaregilsson/build-number@v3 
      with:
        token: ${{ secrets.github_token }}
    - name: Print build number - env
      run: |
       echo "::set-output name=VAR-BUILD-NUMBER::${env:BUILD_NUMBER}"
       echo Build Id first way = ${env:BUILD_NUMBER}
       echo Build Id second way = ${{ steps.buildnumber.outputs.build_number }}
    
    - uses: actions/checkout@v2

    - name: Setup .NET Core - ${{ matrix.node-version }}
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: ${{ matrix.node-version }}

    - name: Install dependencies
      run: dotnet restore ${{env.api-project}}

    - name: Build
      run: dotnet build ${{env.api-project}} --configuration Release --no-restore

    - name: Test
      run: dotnet test ${{env.test-project}} --no-restore --verbosity normal

    - name: Publish
      run: dotnet publish ${{env.api-project}} -c Release -o pashdotnetcorewebapp

    - name: publish artifacts
      uses: actions/upload-artifact@v2
      with:
       name: pash-api-artifact-${{ steps.buildnumber.outputs.build_number }}
       path: ${{ env.upload-artifacts-path }}

    - name: Store Build Number on Build Server 
      run: echo ${{ steps.buildnumber.outputs.build_number }} > ${{github.workspace}}/buildnumberapi.txt
    
    - name: Publish Upload Build File 
      uses: actions/upload-artifact@v2
      with:
        name: buildnumberapi
        path: ${{github.workspace}}/buildnumberapi.txt

部署部分

  deploy:
    needs: [build]
    runs-on: dev-deploy

    env:
      deploy-powershell-script:  "D:\\github-deploy-ps.ps1"
      stop-powershell-script:  "D:\\stop-website-ps.ps1"
      pool-name: "PASHAPIPool"
      site-name: "PASHServicesAPISite"

    steps:
    #- name: Print Build Number from BUILD job
      #run: echo ${{ needs.build.output.VAR-BUILD-NUMBER}}

    - name: Download Build File
      uses: actions/download-artifact@v2
      with:
        name: buildnumberapi
        path: ${{github.workspace}}

    - name: Print build ID
      run: |
        $varbuildnumber = cat ${{github.workspace}}/buildnumberapi.txt
        echo The result is $varbuildnumber
        echo "::set-output name=var-build-number::$varbuildnumber"
      id: selectbuildID

    - name: Download Release Artifacts
      uses: actions/download-artifact@v2
      with:
        name: pash-api-artifact-${{steps.selectbuildID.outputs.var-build-number}}
        path: ${{github.workspace}}/${{ env.artifact-package-zip-directory-path }}
 
    - name: Run Powershell commands to deploy release
      run: |
        & '${{env.deploy-powershell-script}}' ${{env.pool-name}} ${{env.site-name}} ${{env.physical-path}} ${{ env.port-name}} 

现在的问题是,在QA、UAT和Prod中,是否应该在同一个工作流程中再次重复相同的部署部分。这似乎不是一个好选择?我对GitHub Actions还很新,您的建议将非常有帮助。
2个回答

6

有这样一个概念,叫做复合操作

你所需要的就是创建一个带参数步骤的文件。

例如octocat/say-hello/action.yml

inputs:
  name: 
    description: 'Your name'
    default: 'No name provided'
runs:
  using: "composite"
  steps: 
    - run: echo Hello ${{ inputs.name }}.
      shell: bash
    - run: echo "Nice to meet you!"
      shell: pwsh

然后在您的工作流程中使用:

jobs:
  build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v2
    - uses: octocat/say-hello@v1
      with: 
        name: OctoCat

您的 envs 应该是可用的。请检查以下内容:

  • 复合操作
inputs:
  name: 
    description: 'Your name'
    default: 'No name provided'
  upload-artifacts-path: 
    description: 'Path'
    default: "some/path"
runs:
  using: "composite"
  steps: 
    - run: echo Hello ${{ inputs.name }}.
      shell: bash
    - run: echo "Nice to meet you!"
      shell: bash
    - run: echo "$deploy_powershell_script"
      shell: bash
    - run: echo "$stop_powershell_script"
      shell: bash
    - run: echo "${{ inputs.upload-artifacts-path }}"
      shell: bash
    
  • 工作流文件
name: composite
on:
  workflow_dispatch:

env:
  deploy_powershell_script:  "D:\\github-deploy-ps.ps1"


jobs:
  build:
    runs-on: windows-latest

    env:
      stop_powershell_script:  "D:\\stop-website-ps.ps1"
      upload_artifacts_path: "./pashdotnetcorewebapp"
      
    steps:
    - uses: actions/checkout@v2
    - uses: ./.github/actions/say-hello
      with: 
        name: OctoCat
        upload-artifacts-path: "$upload_artifacts_path"
    - run: echo "$deploy_powershell_script"
      shell: pwsh
    - run: echo "$upload_artifacts_path"
      shell: pwsh
    - name: Dump steps context
      env:
        STEPS_CONTEXT: ${{ toJson(steps) }}
      run: echo "$STEPS_CONTEXT"
  • 日志
Run ./.github/actions/say-hello
  with:
    name: OctoCat
    upload-artifacts-path: $upload_artifacts_path
  env:
    deploy_powershell_script: D:\github-deploy-ps.ps1
    stop_powershell_script: D:\stop-website-ps.ps1
    upload_artifacts_path: ./pashdotnetcorewebapp
Hello OctoCat.
Nice to meet you!
D:\github-deploy-ps.ps1
D:\stop-website-ps.ps1
./pashdotnetcorewebapp

我在这里测试了访问变量和作业级别定义的环境变量在组合动作中是否可用的几个方面。

但是,如果您想将输入定义为环境变量,则需要针对每个步骤分别进行映射


感谢您的建议,这提供了清晰度。此外,如何在组合操作中设置整个工作流程或作业的环境变量。在上面定义的部署部分中定义的环境变量应该移动到组合操作中,并且应该全局定义。我按照部署部分的方式进行了定义,但它没有起作用。有什么想法吗? - fortanu82
@fortanu82,太棒了。如果我的回复对您有帮助,您可以考虑给我点赞吗? - Krzysztof Madej
有没有想过如何在抽象部分中使用一些操作来实现这个目标?你的示例仅在组合体内使用了shell脚本。如果我想在抽象部分中使用一些操作(例如azure/setup-kubectl和azure/k8s-set-context),该怎么办?似乎这是不可能的,也不受GHA支持? - shemekh
你说得对 - 目前不支持这个。 - Krzysztof Madej

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接