跳过 kubernetes 服务创建,如果它已经存在 github 操作

Skipping kubernetes service creation if it already exists with github actions

我将以下 github 操作作业设置为在 EKS 上自动部署“nginx”应用程序并在推送时创建“nginx-service”服务。

我正在尝试在服务已存在时配置跳过服务创建步骤。

我的工作:

name: CD_EKS

on:
  - push

jobs:
  eks_nginx_deployment_service:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: eu-central-1

      - name: Trigger deploy
        uses: Consensys/kubernetes-action@master
        env:
          KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
        with:
          args: apply -f nginx_deployment.yaml

      - name: Get Service List
        id: get_service_list
        uses: Consensys/kubernetes-action@master
        env:
          KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
        with:
          args: get services/nginx-service -o name

      - name: Create ELB service
        if: <service doesn't exist> # <- that's my point
        uses: Consensys/kubernetes-action@master
        env:
          KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
        with:
          args: create -f nginx_loadbalancer.yaml

我尝试参考上一步(get_Service_list)的输出,没有成功。

谢谢

如果您想根据上一步的输出跳过一个步骤,请尝试以下操作:

第 1 步 - 确定要使用的输出的名称

如果你想访问ConsenSys/kubernetes-action的输出,我们首先需要确定输出的名称是什么。值得庆幸的是,ConsenSys 通过 Action:

的 YAML 定义记录了这个输出

./.action.yml

outputs:
  result:
    description: "Output of the kubectl command run"

要访问步骤的输出,GitHub 操作支持以下表达式:${{ steps.STEP_ID.outputs.OUTPUT_NAME }}

由于我们知道您要使用的步骤的 ID,并且 ConsenSys 记录了此操作的输出,因此我们知道最终表达式如下:${{ steps.get_service_list.outputs.result }}

第 2 步 - 确定适当的 'if' 语句

从第 1 步,我们能够确定 get_service_list 的输出是 kubectl 命令的输出。这意味着人们必须对 kubectl 有一点了解(在本地进行试验可以帮助解决这个问题)。由于您传递的是 get services/nginx-service -o name,我假设您正在检查名为 services/nginx-service 的项目是否存在。如果存在,kubectl get services/nginx-service -o name会输出services/nginx-service。如果它不存在,kubectl 将 return 报错。换句话说,我们可以说如果输出不等于“services/nginx-service”,运行名为“Create ELB service”的步骤.

第 3 步 - 将它们放在一起

以上两步给了我们:

  • get_service_list 步骤输出的正确名称
  • 我们要用于名为“创建 ELB 服务”的步骤的条件

将这些信息放在一起,“创建 ELB 服务”步骤可以采用以下形式:

- name: Create ELB service
  if: steps.get_service_list.outputs.result != 'services/nginx-service'
  uses: Consensys/kubernetes-action@master
  env:
    KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
  with:
    args: create -f nginx_loadbalancer.yaml

note GitHub Actions 自动假定条件 if 关键字的值是一个表达式,因此您不必将表达式括在${{ }}.

有帮助Links/Notes