어떻게 Jenkins에서 데이터를 공유합니까?

본문은 최초로 나의 blog에 발표되었다.최신 기사를 받고 싶으시면 sign up to my newsletter하세요.
지난 두 달 동안 저는 상당히 많은 시간을 Jenkins 파이프라인에서 보냈습니다. 저는 재미있는 문제를 해결해야 합니다. 본문에서 여러분과 공유하겠습니다.
우리는 응용 프로그램에 대해 일반적인 소스 코드 스캔과 바이너리 스캔을 실행하지만, 트리거 과정은 약간 수동적이다.나는 가능한 한 두 번의 스캐닝을 자동화하고, 가능한 한 많은 생각을 자동화했지만, 설령 그것이 내가 아는 다른 부서보다 훨씬 낫다 하더라도, 이것은 가장 좋은 것은 아니다.
불행하게도, 그것들을 일반적인 CI/CD 파이프에 넣을 방법이 없다. 그 중 하나는 스캐닝 속도가 매우 느리고, 이런 지연이 있기 때문에 개발자는 나에게 최악의 스캐닝을 할 수 있고, 다른 하나는 비동기적이며, 일반적인 CI/CD가 터치하는 것을 받아들이지 않는다.
가령 나의 자동화 정도가 나의 수요를 충족시킬 수 있다고 가정한다.
그러나 수요와 기대가 바뀌었기 때문에 우리는 더 좋은 것이 필요하다.
나는 이 일에 대해 이미 약간의 경험을 가지고 있기 때문에, 나는 자발적으로 새로운 해결 방안을 시도한다.당시 나는 이런 상황에서 시험 비행이 내가 대부분을 건설해야 한다는 것을 의미하는지 몰랐다.

문제 진술
  • 우리는 Jenkins에 계획된 파이프라인을 가지고 몇 개의 응용 프로그램의 각종 소프트웨어 구성 요소를 두 번 스캔해야 한다.
  • 스캔은 가능한 한 병행해야 한다
  • 검색에 새 구성 요소 추가
  • 는 쉬울 것 같습니다.
    우리가 최종적으로 구축한 것은 실행할 때마다 다른 일회성 작업을 만들고 즉시 실행하는 계획 작업이다.하나의 작업은 그것들을 만들고, 하나의 응용 프로그램의 모든 구성 요소는 하나의 작업을 한다.
    스케줄링 작업 흐름 (다른 작업을 만들 수 있는 스케줄링 작업) 은 이미 다른 부서의 어떤 사람이 개발했고, 그는 나에게 나머지 일을 완성하도록 지도했다.벤자민은 나에게 큰 도움을 주었고, 나에게 젠킨스에 관한 많은 지식을 가르쳐 주었다.
    나는 단지 일정 안배 업무 절차를 조금만 수정할 수 있을 뿐이다. 이 작은 부분이 바로 내가 오늘 주목한 내용이다.

    docker 이미지 간에 데이터 공유
    생성된 파일을 Jenkins 파일과 호출된 워크플로우 간에 공유해야 합니다.파일이 동적으로 생성되기 때문에 Bitbucket URL을 하나의 매개 변수로 간단하게 전달할 수 없습니다.만약 내가 서류를 제출했다면, 나는 URL을 전달할 수 있을 것이다.이것은 내가 첫 번째 교체에서 이미 한 일이지만, 제출한 서류가 많을 수도 있기 때문에, 나는 분명히 제출하는 서류를 사용하고 싶지 않다.
    불행하게도, 나는 파일 시스템에서 파일을 생성하는 위치를 간단하게 볼 수 없다. 작업 흐름의 다른 부분이 서로 다른 docker 이미지에서 실행되기 때문에, 나는 이런 행위를 변경할 권리가 없다.
    두 가지 이유로 파일 생성도 위임할 수 없습니다.어쨌든, 나는 스케줄링 업무 절차를 수정할 권리가 없다. 더 중요한 것은, 거기에 속하지 않는 책임을 부여하는 것은 아무런 의미가 없다.
    생성된 내용을 (상당히 긴) 텍스트 매개 변수로 공유하는 것이 옵션일 수도 있습니다. 마지막 옵션을 보존했습니다.내가 어떤 다른 방식으로 문제를 해결할 희망이 있기 전에, 나는 이 옵션을 시도하고 싶지 않다.Groovy가 65536개의 문자를 유니코드 문자열로 제한하는 것은 장기적으로 보면 충분하다고 생각합니다.
    stash/unstash 젠킨스 로드
    나는 stash/unstash를 사용하도록 건의받았다.우선 나는 곤혹스러웠다.git를 어떻게 처리해야 하나요?그래, 한번 해 보자.그리고 나서 나는 그것도a pair of commands in Jenkins terminology라는 것을 깨달았다. 그것은git처럼 널리 알려지지 않았다.결국 Jenkins 파이프를 배치하는 사람은git를 사용하는 사람보다 적다.
    이런 용법은 상당히 간단한 것 같아서 같은 파이프의 작업 사이에서 작업을 공유하는 간단한 방법이다.중요한 것은 우리가 하나의 노드의 상하문에 처해 있지만, 나의 경우, 이것은 허용된다.주의해야 할 주요 문제는 왠지 모르게 나는 다른 작업 흐름과 stash 이름을 공유해야 한다는 것이다. 이 작업 흐름은 같은 이름으로 unstash 명령을 호출할 것이다. 
    이것은git un/stash에 비해 뚜렷한 차이가 있음을 의미합니다. 마지막으로 저장한 항목을 간단하게 unstash 저장할 수 있습니다.젠킨스에서, 너는 반드시 이름을 제공해야 한다.잘못된 이름을 제공하면 이상이 발생합니다.
    그러나 이름은 매우 짧아서, 내 주 작업과 스케줄러 사이에서 상하문 매개 변수로 공유하기 쉽다.
    나는 내가 찾은 예에 따라 한다. 나도 예외가 아니다.
    샴페인?!
    아직.
    나는 스케줄링 작업 흐름에서 파일을 복사하거나, 실제로는 파일 이름을 바꾸면 충분하다.
    나는 절대로 젠킨스의 전문가가 아니라는 것을 다시 한 번 강조해야 한다.그래서 Stackoverflow에 가서 스파게티를 복제할 준비를 하고 텍스트 파일을 어떻게 복제하는지 확인했습니다.
      src = new File('src.txt')
      dst = new File('dst.txt')
      dst << src.text
    
    소용없어!사실상 원본 파일이 존재하지 않아 이상이 발생했습니다.왜?나는 당시에 이해하지 못했다.나는 그것이 어디에 있는지, 어디에서 사라졌는지 모르겠다.
    어쨌든 unstash는 성공했지만 문서는 쓸모가 없었다.나는 현재 디렉터리를 열거해 보았고, 나는 더 높은 단계, 더 깊은 단계의 파일을 열거해 보았지만, 아무것도 없었다.절망했어.
    // Listing all the files and subdirectories in a given path. 
    // I didn'have the rights to call the eachFileRecurse call
    local = new File('.')
    local.eachFile {
        println(file)
    }
    
    그리고 나는 다시 내 동료에게 연락했다.그는 내가 Jenkins 명령을 사용하느냐, Java/Groovy 종류를 사용하느냐에 따라 현재의 작업 디렉터리가 완전히 달라질 수 있다고 내게 말했다.stash/unstash는 Groovy가 아니라 Jenkins의 일부이기 때문에 readFilewriteFile를 사용해서 사본을 만들어야 합니다.
    봐라, 그것이 곧 작용할 것이다.나는 파일을 아무 문제 없이 읽을 수도 있고, 허가 문제 없이 새 파일을 쓸 수도 있다.
     writeFile(file:fileName, text:readFile("unstashedFile"))
    

    결론
    나에게 있어서 가장 중요한 것은 양호한 합작은 없어서는 안 된다는 것이다. 우리는 시종일관 특정 기술에 대해 더 경험이 있는 사람의 지식에 의존해야 한다.그들이 말한 것이 놀랄 것 같아도.예를 들어 File 클래스로 파일을 읽으면 readFile() 클래스로 파일을 읽으면 로컬 디렉터리가 다르다고 누가 생각하겠는가.사실 가장 가능성이 높은 것은 그들이 놀라운 말을 했을 때 우리가 더욱 관심을 가져야 한다는 것이다.
    기술적인 측면에서 관건적인 학습을 고려하여 저는 Jenkins 파이프의 서로 다른 작업 사이, 서로 다른 Docker 이미지 슬롯stashunstash 사이에서 파일을 공유할 수 있다는 것을 알게 되었습니다. 저는 파이프의 다른 부분에서 이름을 공유할 수 있거나 우리가 계산하거나 이전에 알 수 있는 이름만 확보할 수 있습니다.
    가장 흥미로운 것은, 젠킨스에서, 나는 가능한 한 많은 젠킨스 동사를 사용해야 한다. 그것들을 본체 자바와 Groovy 클래스, 특히 파일 시스템에 불필요하게 혼합하지 말고.그렇지 않으면, 나는 결국 파일을 읽을 수 없거나, 쓰려고 하는 곳이 아니라 다른 곳에 쓸 수 없을 수도 있다.
    요컨대, 나는 이 프로젝트를 매우 즐겼다. 나는 CI/CD 분야에서 발생할 수 있는 일에 대한 이해가 다음 단계에 이르렀다. 여전히 높은 단계에 이르지 못했다.

    좋은 웹페이지 즐겨찾기