阿里云云效对接SDK获取流水线制品

参考文档:

API旧版 企业令牌 https://help.aliyun.com/zh/yunxiao/developer-reference/api-reference

API新版 个人令牌 https://help.aliyun.com/zh/yunxiao/developer-reference/api-reference-standard-proprietary

API 个人令牌 https://www.alibabacloud.com/help/zh/yunxiao/developer-reference/api-reference-standard-proprietary

API调试 https://api.aliyun.com/api/devops/2021-06-25/ListPipelines

API调试文档 https://api.aliyun.com/document/devops/2021-06-25/ListPipelineRuns

RAM用户权限策略添加 AliyunRDCFullAccess

v1版sdk

pom引入

复制代码
 <!--云效v1 -->
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-devops</artifactId>
      <version>1.0.7</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>4.6.0</version>
    </dependency>

工具类

复制代码
package com.vvvtimes;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

public class Yunxiaov1Api {

    private static String regionId = "cn-hangzhou";
    private static String endpoint = "devops.cn-hangzhou.aliyuncs.com";
    private static String accessKey = "aaa";
    private static String accessSecret = "bbb";
    private static String organizationId = "ccc";

    private static String pipelineId = "3646953";

    private static String pipelineRunId = "59";

    //ListOrganizations 获取组织列表
    public static String ListOrganizations() {
        IClientProfile profile = DefaultProfile.getProfile(
                regionId,
                accessKey,
                accessSecret
        );
        DefaultAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.GET);
        request.setDomain(endpoint);
        request.setVersion("2021-06-25");
        request.setUriPattern("/users/joinedOrgs");

        request.putHeadParameter("Content-Type", "application/json");


        try {
            CommonResponse response = client.getCommonResponse(request);
            return response.getData();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return null;
    }


    //ListPipelines 获取流水线列表
    //https://api.aliyun.com/api/devops/2021-06-25/ListPipelines?spm=api-workbench.API%20Document.0.0.11aa51cfP4tP38&RegionId=cn-hangzhou
    public static String ListPipelines() {
        IClientProfile profile = DefaultProfile.getProfile(
                regionId,
                accessKey,
                accessSecret
        );
        DefaultAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.GET);
        request.setDomain(endpoint);
        request.setVersion("2021-06-25");

        // 使用 putPathParameter 替换路径参数
        request.putPathParameter("organizationId", organizationId);

        request.setUriPattern("/organization/[organizationId]/pipelines");

        request.putHeadParameter("Content-Type", "application/json");

        try {
            CommonResponse response = client.getCommonResponse(request);
            return response.getData();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return null;
    }

    // ListPipelineRuns 获取流水线运行示例列表 -->API错误403
    public static String ListPipelineRuns() {
        IClientProfile profile = DefaultProfile.getProfile(
                regionId,
                accessKey,
                accessSecret
        );
        DefaultAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();

        //request.setProtocol(ProtocolType.HTTPS);
        request.setMethod(MethodType.GET);
        request.setDomain(endpoint);
        request.setVersion("2021-06-25");
        // 使用 putPathParameter 替换路径参数
        request.putPathParameter("organizationId", organizationId);
        request.putPathParameter("pipelineId", pipelineId);
        request.setUriPattern("/organization/[organizationId]/pipelines/[pipelineId]/pipelineRuns");
        request.putQueryParameter("maxResults", "10");
        request.putQueryParameter("nextToken", "aaaaaa");
        request.putHeadParameter("Content-Type", "application/json");

        try {
            CommonResponse response = client.getCommonResponse(request);
            return response.getData();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return null;
    }

    //GetPipelineRun 获取流水线单个运行示例详情 -->403
    public static String GetPipelineRun() throws Exception {
        IClientProfile profile = DefaultProfile.getProfile(
                regionId,
                accessKey,
                accessSecret
        );
        DefaultAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();

        //request.setProtocol(ProtocolType.HTTPS);
        request.setMethod(MethodType.GET);
        request.setDomain("devops.cn-hangzhou.aliyuncs.com");
        request.setVersion("2021-06-25");
        // 使用 putPathParameter 替换路径参数
        request.putPathParameter("organizationId", organizationId);
        request.putPathParameter("pipelineId", pipelineId);
        request.setUriPattern("/organization/[organizationId]/pipelines/[pipelineId]/pipelineRuns/59");

        request.putHeadParameter("Content-Type", "application/json");


        try {
            CommonResponse response = client.getCommonResponse(request);
            return response.getData();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return null;
    }

    //获取流水线制品URL
    public static String GetPipelineArtifactUrl() throws Exception {
        IClientProfile profile = DefaultProfile.getProfile(
                regionId,
                accessKey,
                accessSecret
        );
        DefaultAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();

        //request.setProtocol(ProtocolType.HTTPS);
        request.setMethod(MethodType.POST);
        request.setDomain("devops.cn-hangzhou.aliyuncs.com");
        request.setVersion("2021-06-25");
        // 使用 putPathParameter 替换路径参数
        request.putPathParameter("organizationId", organizationId);
        request.setUriPattern("/organization/[organizationId]/pipeline/getArtifactDownloadUrl");
        request.putQueryParameter("filePath", "aone2/2435041/1748354328689/Artifacts_3646953.tgz");
        request.putQueryParameter("fileName", "Artifacts_3646953.tgz");
        request.putHeadParameter("Content-Type", "application/json");


        try {
            CommonResponse response = client.getCommonResponse(request);
            return response.getData();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return null;
    }
}

示例调用

复制代码
package com.vvvtimes;

/*
/**
 * Hello world!
 *
 */
public class App {


    public static void main(String[] args) throws Exception {
        String s = Yunxiaov1Api.GetPipelineArtifactUrl();
        System.out.println(s);
    }
}

v2版sdk

pom引入

复制代码
<!--云效v2 -->
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>devops20210625</artifactId>
      <version>5.0.1</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>tea-openapi</artifactId>
      <version>0.3.8</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>tea-console</artifactId>
      <version>0.0.1</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>tea-util</artifactId>
      <version>0.2.23</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>credentials-java</artifactId>
      <version>1.0.1</version>
    </dependency>

v2工具类

复制代码
package com.vvvtimes;

import com.aliyun.devops20210625.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.Common;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

import java.util.Map;

public class Yunxiaov2Api {

    private static String endpoint = "devops.cn-hangzhou.aliyuncs.com";
    private static String accessKey = "aaa";
    private static String accessSecret = "bbb";
    private static String organizationId = "ccc";

    private static String pipelineId = "3646953";

    private static String pipelineRunId = "59";

    //ListOrganizations 获取组织列表
    public static String ListOrganizations() throws Exception {
        com.aliyun.devops20210625.Client client = Yunxiaov2Api.createClient();
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        java.util.Map<String, String> headers = new java.util.HashMap<>();
        try {

            // 复制代码运行请自行打印 API 的返回值
            ListJoinedOrganizationsResponse resp = client.listJoinedOrganizationsWithOptions(headers, runtime);

            // 将整个响应转为 JSON 字符串
            String fullJson = Common.toJSONString(resp);
            // 提取 body 并返回
            return extractPipelineBody(fullJson);
        } catch (TeaException error) {
            System.out.println(error.getMessage());
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            System.out.println(error.getMessage());
        }
        return null;
    }


    //ListPipelines 获取流水线列表
    //参考调用 https://api.aliyun.com/api/devops/2021-06-25/ListPipelines?spm=api-workbench.API%20Document.0.0.11aa51cfP4tP38&RegionId=cn-hangzhou
    public static String ListPipelines() throws Exception {
        com.aliyun.devops20210625.Client client = Yunxiaov2Api.createClient();
        com.aliyun.devops20210625.models.ListPipelinesRequest listPipelinesRequest = new com.aliyun.devops20210625.models.ListPipelinesRequest()
                .setNextToken("aaaaaaaaaa")
                .setMaxResults(30L);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        java.util.Map<String, String> headers = new java.util.HashMap<>();

        try {
            com.aliyun.devops20210625.models.ListPipelinesResponse resp = client.listPipelinesWithOptions(organizationId, listPipelinesRequest, headers, runtime);

            // 将整个响应转为 JSON 字符串
            String fullJson = Common.toJSONString(resp);

            // 提取 body 并返回
            return extractPipelineBody(fullJson);

        } catch (TeaException error) {
            System.out.println(error.getMessage());
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            System.out.println(error.getMessage());
        }
        return null;
    }

    // ListPipelineRuns 获取流水线运行示例列表 -->API错误403
    public static String ListPipelineRuns() throws Exception {
        com.aliyun.devops20210625.Client client = Yunxiaov2Api.createClient();
        com.aliyun.devops20210625.models.ListPipelineRunsRequest listPipelineRunsRequest = new com.aliyun.devops20210625.models.ListPipelineRunsRequest()
                .setMaxResults(10L)
                .setNextToken("aaaaaa");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        java.util.Map<String, String> headers = new java.util.HashMap<>();
        try {
            // 复制代码运行请自行打印 API 的返回值
            ListPipelineRunsResponse resp = client.listPipelineRunsWithOptions(organizationId, pipelineId, listPipelineRunsRequest, headers, runtime);
            // 将整个响应转为 JSON 字符串
            String fullJson = Common.toJSONString(resp);
            System.out.println(fullJson);

            // 提取 body 并返回
            return extractPipelineBody(fullJson);

        } catch (TeaException error) {
            System.out.println(error.getMessage());
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            System.out.println(error.getMessage());

        }
        return null;
    }

    //GetPipelineRun 获取流水线单个运行示例详情 -->403
    public static String GetPipelineRun() throws Exception {
        com.aliyun.devops20210625.Client client = Yunxiaov2Api.createClient();
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        java.util.Map<String, String> headers = new java.util.HashMap<>();
        try {
            // 复制代码运行请自行打印 API 的返回值
            GetPipelineRunResponse resp = client.getPipelineRunWithOptions(organizationId, pipelineId, pipelineRunId, headers, runtime);
            // 将整个响应转为 JSON 字符串
            String fullJson = Common.toJSONString(resp);
            System.out.println(fullJson);

            // 提取 body 并返回
            return extractPipelineBody(fullJson);

        } catch (TeaException error) {
            System.out.println(error.getMessage());
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            System.out.println(error.getMessage());
        }
        return null;
    }


    //获取流水线制品URL
    public static String GetPipelineArtifactUrl() throws Exception {
        com.aliyun.devops20210625.Client client = Yunxiaov2Api.createClient();
        com.aliyun.devops20210625.models.GetPipelineArtifactUrlRequest getPipelineArtifactUrlRequest = new com.aliyun.devops20210625.models.GetPipelineArtifactUrlRequest()
                .setFileName("Artifacts_3646953.tgz")
                .setFilePath("aone2/2435041/1748354328689/Artifacts_3646953.tgz");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        java.util.Map<String, String> headers = new java.util.HashMap<>();
        try {
            // 复制代码运行请自行打印 API 的返回值
            GetPipelineArtifactUrlResponse resp = client.getPipelineArtifactUrlWithOptions(organizationId, getPipelineArtifactUrlRequest, headers, runtime);
            // 将整个响应转为 JSON 字符串
            String fullJson = Common.toJSONString(resp);
            System.out.println(fullJson);

            // 提取 body 并返回
            return extractPipelineBody(fullJson);

        } catch (TeaException error) {
            System.out.println(error.getMessage());
            System.out.println(error.getData().get("Recommend"));
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            System.out.println(error.getMessage());
        }
        return null;
    }


    /**
     * <b>description</b> :
     * <p>使用凭据初始化账号Client</p>
     *
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.devops20210625.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setAccessKeyId(accessKey)     // 替换为你的 AccessKey ID
                .setAccessKeySecret(accessSecret); // 替换为你的 Secret

        config.endpoint = endpoint;
        return new com.aliyun.devops20210625.Client(config);
    }


    public static String extractPipelineBody(String fullResponseJson) {
        // 将完整 JSON 转为 Map 结构
        java.util.Map<String, Object> fullResponseMap = (Map<String, Object>) Common.parseJSON(fullResponseJson);

        // 提取 body 部分
        Object body = fullResponseMap.get("body");

        // 再转成 JSON 字符串返回
        return Common.toJSONString(body);
    }


}

v2调用示例

复制代码
package com.vvvtimes;

/*
/**
 * Hello world!
 *
 */
public class App {

    public static void main(String[] args) throws Exception {

        String s = Yunxiaov2Api.GetPipelineArtifactUrl();
        System.out.println(s);
    }
}

存在的问题

实际有两个API ListPipelineRuns GetPipelineRun调用返回403,直接从调试页面复制下载的代码也不行,估计是换接口了。

问题处理:通过给阿里云提工单发现,需要在云效的管理后台将这个RAM用户的角色从成员改成管理员才能调通。

相关推荐
百度智能云技术站1 小时前
Redis 数据恢复的月光宝盒,闪回到任意指定时间
数据库·redis
~央千澈~1 小时前
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
java·前端·数据库
茶本无香2 小时前
数据库查询性能优化:深入理解与应用物化视图
数据库·性能优化·查询·物化视图
2501_915373882 小时前
neo4j删除所有数据
数据库·neo4j
TDengine (老段)3 小时前
TDengine 运维——巡检工具(安装工具)
大数据·运维·数据库·物联网·时序数据库·tdengine·涛思数据
fruge3 小时前
ubuntu 22.04 编译安装nignx 报错 openssl 问题
数据库·ubuntu·postgresql
bingHHB4 小时前
电商售后服务系统与其他系统集成:实现售后流程自动化
大数据·运维·数据库·自动化·接口隔离原则·集成学习
全栈技术负责人4 小时前
cursor rules设置:让cursor按执行步骤处理(分析需求和上下文、方案对比、确定方案、执行、总结)
数据库·windows·microsoft
TDengine (老段)4 小时前
TDengine 运维——巡检工具(安装前检查)
大数据·运维·数据库·物联网·时序数据库·tdengine·涛思数据
smilejingwei4 小时前
SPL 轻量级多源混算实践 4 - 查询 MongoDB
数据库·mongodb·esprocspl