방법: Phylum 확장을 통한 문제 분류

확장 개발



Phylum 커뮤니티 에디션의 출시와 함께 소프트웨어 공급망 확장에 대한 지원이 추가되었습니다. 이는 Phylum이 제공하는 것 위에 자동화 및 사용자 정의 계층을 가능하게 하는 제품에 대한 스크립팅 가능한 확장입니다.

동기 부여



더 나은 자동화는 개발 속도를 유지하고 주요 문제를 놓치지 않도록 하는 데 매우 중요합니다. 즉, 이는 DevOps의 전체 초석입니다. 강력한 자동화(및 이를 지원하는 도구)가 없으면 CI/CD는 더 이상 "연속"되지 않습니다. 이를 염두에 두고 우리는 오케스트레이션, 조사 결과 관리 및 분류 자동화(무엇보다도)를 촉진하는 데 도움이 되는 도구 개발을 가능하게 하는 자동화 프레임워크를 개발했습니다. 따라서 우리는 "자동화 우선"이 되기 위해 노력하고 보다 능동적인 솔루션을 설계하는 데 도움이 되는 더 나은 도구를 제공합니다.

이 비전을 가능하게 하는 올바른 도구를 선택하는 데 몇 가지 기본 원칙이 적용되었습니다. 확장 프로그램을 관리하는 메커니즘은 유연해야 하며 보안 제어를 제공해야 합니다(소프트웨어 공급망 보안 회사로서 우리는 커뮤니티의 도구도 적절하게 제공되기를 원합니다). 보안) 및 샌드박싱이며 사용이 간편해야 합니다.

압형



이를 염두에 두고 Deno를 자동화 도구의 기본 프레임워크로 활용하기로 결정했습니다. 강력한 권한 관리 시스템이 있는 샌드박스에서 실행되고 기능이 풍부한 표준 라이브러리와 함께 제공되며 웹 어셈블리 실행 기능을 통해 많은 언어를 지원합니다. 또한 Rust와의 최고 수준의 통합을 제공하고(Deno 내장형 샌드박스 자체가 크레이트로 제공됨) 쉽게 확장할 수 있습니다.

움직이는 확장 프로그램



API 자체has relatively robust documentation가 비정상적으로 복잡하지 않다는 점을 감안할 때 특히 이 연습을 위해 특별히 집중하지 않고 확장 프레임워크로 실제로 수행할 수 있는 작업에 더 많은 시간을 할애할 것입니다.

이를 위해 우리는 경고 도구를 구축하는 연습을 통해 작업할 것입니다. 최종 결과는 문제를 필터링할 수 있는 확장이 되고 REST API를 통해 Jira에 중요한 경고를 푸시할 수 있습니다. 이것도 quite well documented 이며 확장 프레임워크가 도움이 될 수 있는 곳을 보여주는 좋은 예가 되어야 합니다.

시작하기



이 문제에 대한 작업을 시작하면서 먼저 매니페스트를 추가하여 확장 기능이 제대로 작동하는 데 필요한 리소스를 설명합니다.

name = "jira"
description = "blindly put critical issues into jira!"
entry_point = "main.ts"
[permissions]
  env = ["JIRA_USER_EMAIL", "JIRA_USER_TOKEN"]
  net = ["example-domain.atlassian.net"]


여기서 example-domain는 적절한 하위 도메인으로 대체되어야 합니다.

다음으로 main.ts 에서 시작하여 확장의 진입점(위)으로 식별한 실제 확장을 빌드하기 시작합니다. 여기서 우리는 다음과 같이 시작할 것입니다:
  • 사용자가 제공한 잠금 파일을 구문 분석합니다.
  • 로드된 패키지에 대한 분석을 수행합니다.
  • 심각도가 critical인 반환된 문제를 수집합니다.

  • 
    import { PhylumApi } from "phylum";
    
    
    // First, we will check to ensure that we have the appropriate arguments -
    // for this example, we will assume that it takes the form:
    // phylum jira <ecosystem> <lockfile-path>
    // NOTE: the phylum CLI itself utilizes the first two of those arguments before
    //       calling into Deno, so `Deno.args[0]` will be the value provided for 
    //       <ecosystem>, and `Deno.args[1]` will contain <lockfile>.
    if(Deno.args.length < 2) {
      console.error("Usage: phylum jira <ecosystem> <lockfile>");
      Deno.exit(1);
    }
    
    const ecosystem = Deno.args[0];
    const lockfile = Deno.args[1];
    // Parse the provided lockfile
    const lockData = await PhylumApi.parseLockfile(lockfile, ecosystem);
    
    // Perform analysis
    const jobId = await PhylumApi.analyze(ecosystem, lockData.packages);
    const status = await PhylumApi.getJobStatus(jobId);
    
    let criticalIssues = {};
    // Now, we will loop through the packages and check the issues that came back:
    for(const package of status.packages) {
      // Issues are as follows:
      // { 
      //   tag: "<unique issue ID>", 
      //   title: "issue title", 
      //   description: "issue description",
      //   severity: "low | medium | high | critical",
      //   domain: "malicious_code | vulnerability | author | license | engineering" 
      // }
      const issues = package.issues.filter(issue => issue.severity === 'critical');
      if(issues.length)
        criticalIssues[`${package.name}:${package.version}`] = issues;
    }
    
    
    


    이제 Phylum API에서 반환된 각 중요한 문제에 대해 Jira 문제를 생성하기 위해 docs for the Jira API we will be hitting을 다시 참조할 수 있습니다. 실제로는 기존 문제를 가져와 중복 제거(만들려는 문제가 기존 패키지/버전에 대해 이미 존재하는 경우)하고, 중요한 문제가 있는 50개 이상의 패키지가 있는 상황에 대해 페이지를 매길 수 있습니다. 하지만 이 예제를 간단하게 유지하기 위해 일괄 생성을 시도할 것입니다.

    
    import { encode } from "https://deno.land/std/encoding/base64.ts";
    
    // ...
    
    let bodyData = {
      issueUpdates: []
    };
    
    // First we will loop through our packages with critical issues, and generate
    // an entry for each:
    for(const packageId of Object.keys(criticalIssues)) {
       // Populate whatever fields are appropriate given the package/version
       // tuple provided as the key, and the issue information as the value
    }
    
    const email = Deno.env.get("JIRA_USER_EMAIL");
    const token = Deno.env.get("JIRA_USER_TOKEN");
    
    if(!email || !token) {
      console.error("Please ensure that you provide the user email and token via env!")
      Deno.exit(2);
    }
    
    const encodedToken = encode(`${email}:${token}`);
    
    const result = await fetch("https://example-domain.atlassian.net", {
      method: "POST",
      headers: {
        'Authorization': `Basic ${encodedToken}`,
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(bodyData)
    });
    
    if(200 !== result.status) {
      console.error(`Request to create issues failed! Got a ${result.status} back.`);
      Deno.exit(3);
    }
    
    const data = result.json();
    
    if(data.errors.length > 0) {
      // Handle errors
    }
    
    

    phylum extension install ./jira-extension가 이어지고 이제 실행됩니다!

    또한 이 문서(및 더 많은 문서)on our site를 볼 수 있으며 여기에서 당사 제품의 액세스the free, community version도 할 수 있습니다.

    좋은 웹페이지 즐겨찾기