【问题标题】:GitHub Action - How to deploy release on multiple environment?GitHub Action - 如何在多个环境中部署发布?
【发布时间】:2021-03-23 02:49:14
【问题描述】:

在我的例子中,有四种环境,Dev、QA、UAT 和 Prod,基于 Windows 的自托管运行器。一旦包被构建,它应该以成功的方式一个接一个地部署到每个环境中 DevQAUATPROD。以下工作流程已编写为仅为开发环境构建和部署包。现在为了进一步在 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 的新手,您的建议会很有帮助。

【问题讨论】:

    标签: github github-actions


    【解决方案1】:

    有这样的概念,叫composite action

    您只需要创建一个带有参数化步骤的文件。

    例如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
    

    您的环境应该可用。请检查:

    • 复合动作
    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
    

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

    但如果您想将输入定义为环境变量,您需要将它们映射到separately for each step

    【讨论】:

    • 感谢您的建议,这提供了清晰性。此外,如何在复合操作中设置整个工作流或作业的环境变量。上面部署部分中定义的环境变量应该移动到复合动作中,并且应该在全局范围内定义。我以与部署部分相同的方式定义,但它不起作用。任何想法。
    • @fortanu82 太棒了。如果我的回复对您有帮助,您可以考虑点赞吗?
    • 如果你想在抽象部分使用一些动作,你知道如何实现吗?您的示例仅使用复合内部的 shell 脚本。如果我想在抽象部分使用一些操作(即 azure/setup-kubectl 和 azure/k8s-set-context)怎么办?似乎这是不可能的,GHA 不支持?
    • 你说得对——目前不支持。
    【解决方案2】:

    使用 Git 操作环境见下文

    对于开发人员:

    environment: 
      name: Development
      url: 'http://dev.myapp.com'
    

    对于产品:

    environment: 
      name: Production
      url: 'http://www.myapp.com'
    

    https://github.com/n3wt0n/ActionsTest/blob/main/.github/workflows/CICD.yml

    【讨论】:

      猜你喜欢
      • 2020-04-05
      • 2022-09-27
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多