使用阿里云效API操作流水线

使用阿里云效(Alibaba Cloud DevOps)API操作流水线时,需要注意以下几个方面:

  1. 认证与授权
    确保你已经获取了正确的访问凭证(AccessKey ID 和 AccessKey Secret),并且这些凭证具有足够的权限来执行你需要的操作。可以通过阿里云的RAM(资源访问管理)控制台管理和分配这些权限。

  2. API 调用限制
    阿里云效API通常有调用频率限制(QPS)。确保在设计你的应用程序时考虑到这些限制,以避免超出配额导致的调用失败。

  3. 错误处理
    在使用API时,要做好错误处理和异常捕获。阿里云效API会返回详细的错误信息,包括错误代码和错误消息。需要根据这些信息来诊断问题并采取适当的措施。

  4. API版本
    确保你使用的API版本是最新的,并且在代码中指定了正确的版本。如果API有更新或废弃,需及时更新你的代码。

  5. 参数验证
    在调用API前,确保所有必需参数都已正确设置,并且这些参数的值符合API文档中的要求。

  6. 安全性
    在代码中不要硬编码敏感信息如AccessKey ID和AccessKey Secret。可以使用环境变量或其他安全存储方式来管理这些信息。

  7. 调试和日志
    启用详细的日志记录和调试信息,以便在出现问题时能够快速定位和解决问题。

  8. 资源管理
    确保在使用API创建或修改资源时,有相应的清理逻辑,以避免不必要的资源浪费。

注意事项:

  1. 阿里云子账户需要给策略权限: AliyunRDCFullAccess
  2. 子账号需要加入云效企业内部,并给足操作权限

文档: 云效API接口云效错误码

示例代码

  1. 使用python 创建 Pipeline_sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import os
import sys

from typing import List

from alibabacloud_devops20210625.client import Client as devops20210625Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
from alibabacloud_devops20210625 import models as devops_20210625_models
from alibabacloud_tea_console.client import Client as ConsoleClient

ORGANIZATION_ID = [云效企业ID]


class Pipeline:

    def __init__(self):
        self.organization_id = ORGANIZATION_ID
        pass

    @staticmethod
    def create_client() -> devops20210625Client:
        """
        使用AK&SK初始化账号Client
        @return: Client
        @throws Exception
        """
        # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
        # 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html。
        config = open_api_models.Config(
            # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
            access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
            access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
        )
        # Endpoint 请参考 https://api.aliyun.com/product/devops
        config.endpoint = f'devops.cn-hangzhou.aliyuncs.com'
        return devops20210625Client(config)

    """
    create_pipeline
    """

    @staticmethod
    def create_pipeline(name: str, yaml_file_path: str) -> None:
        # 读取 YAML 文件内容
        with open(yaml_file_path, 'r') as file:
            content = file.read()

        client = Pipeline.create_client()
        create_pipeline_request = devops_20210625_models.CreatePipelineRequest(
            name=name,
            content=content
        )
        runtime = util_models.RuntimeOptions()
        headers = {}
        try:
            # 复制代码运行请自行打印 API 的返回值
            response = client.create_pipeline_with_options(ORGANIZATION_ID, create_pipeline_request, headers,
                                                           runtime)
            # 如果API调用成功,这里将处理并打印返回的数据
            if response:
                print("Pipeline created successfully.")
                # 假设返回的数据结构中包含一个status或类似字段来表示操作状态
                print("Response Data:", response)
                # print(response.body.__dict__)
                # 提取并打印 pipelinId
                pipelinId = response.body.pipelin_id
                print(pipelinId)
        except Exception as error:
            # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            # 错误 message
            print(error.message)
            # 诊断地址
            print(error.data.get("Recommend"))
            UtilClient.assert_as_string(error.message)

    @staticmethod
    def delete_pipeline(pipelin_id: str) -> None:
        client = Pipeline.create_client()
        runtime = util_models.RuntimeOptions()
        headers = {}
        try:
            # 复制代码运行请自行打印 API 的返回值
            response = client.delete_pipeline_with_options(ORGANIZATION_ID, pipelin_id, headers, runtime)
            # 如果API调用成功,这里将处理并打印返回的数据
            if response:
                print("Pipeline created successfully.")
                # 假设返回的数据结构中包含一个status或类似字段来表示操作状态
                print("Response Data:", response)
        except Exception as error:
            # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            # 错误 message
            print(error.message)
            # 诊断地址
            print(error.data.get("Recommend"))
            UtilClient.assert_as_string(error.message)

    @staticmethod
    def get_pipelines_list() -> None:
        client = Pipeline.create_client()
        list_pipelines_request = devops_20210625_models.ListPipelinesRequest(
            max_results=10,
            next_token='123'
        )
        runtime = util_models.RuntimeOptions()
        headers = {}
        try:
            # 复制代码运行请自行打印 API 的返回值
            response = client.list_pipelines_with_options(ORGANIZATION_ID, list_pipelines_request, headers, runtime)
            # 如果API调用成功,这里将处理并打印返回的数据
            if response:
                print("Pipeline created successfully.")
                # 假设返回的数据结构中包含一个status或类似字段来表示操作状态
                print("Response Data:", response)
        except Exception as error:
            # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            # 错误 message
            print(error.message)
            # 诊断地址
            print(error.data.get("Recommend"))
            UtilClient.assert_as_string(error.message)
def read_and_format_json(json_file_path):
    """
    读取 JSON 文件并格式化其内容。
    
    参数:
    json_file_path (str): JSON 文件的路径。
    
    返回:
    str: 格式化后的 JSON 字符串。
    """
    try:
        # 读取 JSON 文件内容
        with open(json_file_path, 'r', encoding='utf-8') as file:
            params = json.load(file)
        formatted_params = json.dumps(params, indent=4)

        print(formatted_params)
        return formatted_params
    except FileNotFoundError:
        print(f"错误: 文件 {json_file_path} 未找到.")
        return None
    except json.JSONDecodeError:
        print(f"错误: 解析 JSON 文件 {json_file_path} 时出错.")
        return None
    except Exception as e:
        print(f"错误: 发生了意外错误: {e}")
        return None
        
    @staticmethod
    def run_pipeline(json_file_path: str, pipeline_id: str) -> None:
        formatted_params = Pipeline.read_and_format_json(json_file_path)
        client = Pipeline.create_client()
        start_pipeline_run_request = devops_20210625_models.StartPipelineRunRequest(
            # params='''{"envs": {
            #                         "UPDATE": "ALL",
            #                         "IMAGES":"sjdlkfjslkdajf"
            #                     }}'''
            params=formatted_params
        )
        runtime = util_models.RuntimeOptions()
        headers = {}
        try:
            resp = client.start_pipeline_run_with_options(ORGANIZATION_ID, pipeline_id,start_pipeline_run_request, headers, runtime)
            ConsoleClient.log(UtilClient.to_jsonstring(resp))
        except Exception as error:
            # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            # 错误 message
            print(error.message)
            # 诊断地址
            print(error.data.get("Recommend"))
            UtilClient.assert_as_string(error.message)


if __name__ == '__main__':

    # 创建一个测试流水线
    # Pipeline.create_pipeline( name='测试流水线test4', yaml_file_path='pipeline_content.yaml')
    # 删除指定的流水线
    # Pipeline.delete_pipeline('3263926')
    # 执行指定的流水线
    Pipeline.run_pipeline("pipeline_params.json","3260926")
    # 获取流水线列表
    # Pipeline.get_pipelines_list()

传参文件 pipeline_params.json

{
    "envs": {
        "UPDATE": "ALL",
        "IMAGES": "sjdlkfjslkdajf"
    }
}

流水线yaml配置 pipeline_content.yaml

文件可以再流水线使用yaml模式编辑后替换

stages:
  vm_deploy_stage:
    name: "部署"
    jobs:
      vm_deploy_job:
        name: "主机部署`测试主机"
        component: "VMDeploy"
        with:
          downloadArtifact: false
          useEncode: false
          machineGroup: "eSa9wUssQfX799kg"
          run: "/home/test.sh"
          artifactDownloadPath: ""
          executeUser: "root"
          artifact: ""
### 实现阿里云流水线 RuoYi-SpringBoot 项目自动化部署 #### 准备工作 为了在阿里云流水线上实现RuoYi-SpringBoot项目的自动化部署,需先完成一些准备工作。确保已创建好阿里云账号并开通了服务;同时,在本地环境中准备好待部署的Spring Boot应用源码以及Dockerfile文件用于构建镜像[^1]。 #### 创建仓库与分支策略 将RuoYi-SpringBoot工程推送到GitLab或其他支持Webhook功能的版本控制系统中去,并设置合理的分支管理策略以便于后续触发CI/CD流程。对于主要开发工作的master/main分支建议开启保护模式防止误操作影响生产环境稳定性[^2]。 #### 构建自定义Maven命令 针对特定需求定制maven打包指令,比如指定JDK版本、跳过测试用例执行等参数优化编译率。此部分可通过`.mvn/jvm.config` 和 `.mvn/mvn.config` 文件来配置全局变量或者通过pipeline脚本动态传递给maven插件使用[^3]。 ```bash # .mvn/jvm.config -Xms512m -Xmx1024m # .mvn/mvn.config -DskipTests=true clean package ``` #### 编写Pipeline YAML配置文件 编写适用于当前场景下的持续集成管道描述文档(通常是yaml格式),明确定义各个阶段的任务列表及其依赖关系。下面是一个简单的例子展示了如何利用官方提供的Java模板快速搭建起一套完整的CICD体系结构: ```yaml version: 1.0 stages: - compile - test - build_image - deploy jobs: maven_compile_job: stage: compile steps: - mvn clean install -Dmaven.test.skip=true unit_test_job: stage: test script: - mvn test docker_build_push_job: image: registry.cn-hangzhou.aliyuncs.com/cloudnative/docker:latest stage: build_image only: changes: - '**/*.java' services: - docker:dind before_script: - export DOCKER_BUILDKIT=1 script: - echo "$DOCKER_PASSWORD" | docker login --username="$DOCKER_USERNAME" --password-stdin $REGISTRY_URL - cd ./ruoyi-cloud/ - docker build -t ${IMAGE_NAME}:${CI_COMMIT_REF_SLUG} . - docker push ${IMAGE_NAME}:${CI_COMMIT_REF_SLUG} kubernetes_deploy_job: type: deploy environment: name: production url: http://${K8S_SERVICE_IP}/api/v1/namespaces/${NAMESPACE}/services/${SERVICE_NAME}:http/proxy/ when: manual dependencies: - docker_build_push_job script: - apk add curl - curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl - chmod +x ./kubectl - mv ./kubectl /usr/local/bin/ - mkdir -p ~/.kube - echo "${KUBECONFIG}" >~/.kube/config - kubectl apply -f deployment.yaml ``` 上述代码片段实现了从源码拉取到最终发布上线整个过程中涉及到的关键环节控制逻辑表达[^4]。 #### Kubernetes集群中的资源对象声明 最后一步是在目标Kubernetes集群内部署应用程序所需的各类资源配置清单,如Deployment、Service、Ingress等API对象的具体属性设定。这通常保存在一个名为`deployment.yaml` 的文本文件里供kubctl工具读取解析后提交至apiserver处理请求。 ```yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: ruoyi-springboot-app name: ruoyi-springboot-deployment spec: replicas: 3 selector: matchLabels: app: ruoyi-springboot-app template: metadata: labels: app: ruoyi-springboot-app spec: containers: - envFrom: - secretRef: name: db-secret image: 'registry.cn-hangzhou.aliyuncs.com/my-repo/ruoyi-springboot:${TAG}' livenessProbe: failureThreshold: 3 initialDelaySeconds: 40 periodSeconds: 10 successThreshold: 1 tcpSocket: port: 9090 name: ruoyi-springboot-container ports: - containerPort: 9090 --- apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-wz9hjg**** labels: app: ruoyi-springboot-service name: ruoyi-springboot-service spec: externalTrafficPolicy: Cluster healthCheckNodePort: 30727 loadBalancerID: lb-wz9hjg**** ports: - nodePort: 30727 port: 80 protocol: TCP targetPort: 9090 selector: app: ruoyi-springboot-app sessionAffinity: None type: LoadBalancer ``` 以上就是关于如何借助阿里云平台实施RuoYi-SpringBoot项目的自动部署方案介绍[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值