동일한 Jenkins 작업 공간에 여러 자식 저장소를 체크 아웃하십시오.


127

Jenkins 1.501 및 Jenkins Git 플러그인 1.1.26 사용

여러 프로젝트가있는 3 가지 git repos가 있습니다.

이제 3 git repos의 모든 프로젝트를 Jenkins 슬레이브의 동일한 작업 공간으로 체크 아웃해야합니다. 각 git repo를 다음에서 정의했습니다 : 소스 코드 관리 : 다중 SCM . 그러나 리포지토리를 체크 아웃 할 때마다 이전 리포지토리 및 관련 프로젝트가 삭제됩니다.

나는 이것을 읽었다.

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

그러나 실제로 도움이되지 않습니다. 모든 repos의 repo (선택 사항)에 대해 로컬 하위 디렉토리 에서 동일한 폴더를 지정하려고 시도했지만 동일한 결과를 제공합니다.

Jenkins를 사용하여 이것이 불가능한 경우 사전 빌드 단계 / 스크립팅을 사용하여 프로젝트를 올바른 위치로 옮길 수 있습니다. 프로젝트의 빌드 구성을 수정하는 옵션이 아닙니다.

답변:


69

Jenkins + Git Plugin을 사용하면 단일 작업 공간에서 한 번에 여러 리포를 체크 아웃 할 수 없습니다.

이 문제를 해결하기 위해 단일 리포지토리를 각각 체크 아웃 한 후 최종 프로젝트 작업 영역에 복사하는 여러 업스트림 작업이 있거나 (다양한 수준에서 문제 발생) 쉘 스크립팅 단계를 설정하여 필요한 리포지토리를 확인할 수 있습니다. 빌드시 작업 작업 공간

이전에는 Multiple SCM 플러그인이이 문제에 도움이되었지만 이제는 더 이상 사용되지 않습니다. 다중 SCM 플러그인 페이지에서 : "사용자는 https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin으로 마이그레이션해야합니다 . 파이프 라인은 여러 SCM을 더 나은 체크 아웃하는 방법을 제공하며 Jenkins에서 지원합니다. 핵심 개발 팀. "


첫 번째 접근 방식이 왜 문제가됩니까? 직업을 나누는 것은 좋은 습관처럼 보입니다.
CurtainDog

1
일반적으로 좋은 방법이지만 동일한 물리적 위치 유지 관리에서 여러 개의 체크 아웃이 필요한 경우 큰 문제가됩니다. 예를 들어, 분기 빌드를 만들려면 4 개의 작업을 복제 한 다음 각 작업의 경로를 개별적으로 변경해야합니다. 물론이를 도와주는 플러그인이 있지만 단일 작업에서 상대 경로를 체크 아웃하는 것이 더 쉽습니다. 그런 다음 설정을 변경하지 않고 원하는만큼 복제 할 수 있습니다.
CIGuy

1
더 이상 관련이 없으므로 정답에서 변경해야합니다.
Dvir669

2
파이프 라인을 사용하려면 새로운 DSL을 배워야합니다. 새로운 DSL은 우리가 원하는 매우 간단한 작업 (여러 리포지토리의 코드를 확인)에 비해 너무 많은 것입니다. Jenkins 파이프 라인 DSL 주위에 알맞은 GUI가 나타날 때까지 다중 SCM 플러그인을 사용하십시오. 나는 젠킨스 2.17으로 잘 작동하고 있다고보고 할 수 있습니다
부락 아르 슬란

2
방금 여러 repos와 동일한 문제가 발생했습니다. 새 DSL에 대해 @BurakArslan만큼 회의적이지만 파이프 라인 플러그인을 사용하고 있습니다. 실제로 생각했던 것만 큼 나쁘지 않으며 합리적으로 괜찮은 스 니펫 생성기가 제공됩니다. 2 시간 동안 만 사용한 후에는 파이프 라인 빌드 스크립트를 커밋하여 나머지 코드와 함께 사용할 수 있기 때문에 실제로는이 방법을 선호합니다.
Ben

81

다중 SCM 플러그인 사용 :

  • 체크 아웃해야하는 각 저장소 (주 프로젝트 또는 종속 프로젝트)에 대해 다른 저장소 항목을 작성하십시오.

  • 각 프로젝트에 대해 "고급"메뉴 (두 번째 "고급"메뉴에는 각 저장소에 대해 "고급"이라는 레이블이 붙은 두 개의 단추가 있음)가 있습니다. "repo의 로컬 서브 디렉토리 (선택 사항)"텍스트 필드를 찾으십시오. "작업 공간"디렉토리에 프로젝트를 복사 할 서브 디렉토리를 지정할 수 있습니다. 내 개발 컴퓨터의 파일 시스템을 매핑 할 수 있습니다.

"두 번째 고급 메뉴"는 더 이상 존재하지 않습니다. 대신 "추가"버튼 ( "추가 동작"섹션에 있음)을 사용하고 "하위 디렉토리로 체크 아웃"을 선택하십시오.

  • ant를 사용하는 경우, 이제 빌드 대상이있는 build.xml 파일이 작업 공간의 루트 디렉토리가 아닌 서브 디렉토리에있는 빌드 대상으로 "Anant 호출"구성에이를 반영해야합니다. 이를 수행하려면 "개미 호출"에서 "고급"을 누르고 build.xml이있는 서브 디렉토리의 이름을 포함하여 "빌드 파일"입력 텍스트를 채우십시오.

희망이 도움이됩니다.


3
구식이어야합니다. 여러 SCM 플러그인 작성시 GIT 스 니펫에는 선택적 하위 경로가 포함되어 있지 않습니다.
AlexeiOst

12
각 저장소에는 "추가"라는 드롭 다운 목록이 있습니다. 그것에서 "하위 디렉토리에 체크 아웃"옵션을 찾을 수 있습니다.
Gary Ye

1
여러 SCM 플러그인과 자식으로 가이드를 따라 갔지만 다른 재미있는 문제가 있습니다. 다른 리포지토리에 대해 동일한 지점 (개발)을 올바르게 체크 아웃하고 싶지 않은 것 같습니다. 해시로 커밋을 체크 아웃하려고 시도합니다 (첫 번째 저장소에서만 유효합니다). 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
Lefteris

여러 SCM 플러그인의 가장 큰 문제는 "현재 커밋 후 유형 트리거가 작동하지 않으므로 (최소한 하위 버전에서는) 'cron'유형 폴링을 구성해야합니다."
grayaii

1
파이프 라인을 사용하려면 새로운 DSL을 배워야합니다. 새로운 DSL은 우리가 원하는 매우 간단한 작업 (여러 리포지토리의 코드를 확인)에 비해 너무 많은 것입니다. Jenkins 파이프 라인 DSL 주위에 알맞은 GUI가 나타날 때까지 다중 SCM 플러그인을 사용하십시오. 나는 젠킨스 2.17으로 잘 작동하고 있다고보고 할 수 있습니다
부락 아르 슬란

41

이후 여러 SCM들 플러그인은 사용되지 않습니다.

Jenkins Pipeline을 사용하면 여러 git repos를 체크 아웃하고 gradle을 사용하여 빌드 한 후 가능

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

당신은 사용을 고려하는 것이 좋습니다 자식 서브 모듈 대신이 같은 사용자 지정 파이프 라인을.


감사합니다!!! dir블록이 중요하다, 나는 단지 내 작업의 작업 공간에서 가장 최근-복제 REPO를 보는 이유를 알아낼 수 없었다.
bonh

여러 SCM에서 "변경"개념을 어떻게 고려합니까? 작업을 구성하는 모든 저장소에서 본 변경 사항의 합계입니까? 가능하면 각 항목별로 항목을 정리하는 것이 좋을 것입니다 23 changes from repo XXX, 3 changes from repo YYY.
jxramos

20

내가 사용하는 여러 SCM들 플러그인 젠킨스와 성공적으로 힘내 플러그인과 함께.


3
고마워, 저장소 섹션에 2 비트 버킷 경로를 넣을 수 있으며 이제 repo 1 체크 아웃 "개발"분기와 repo 2 체크 아웃 "수정"분기를 어떻게 알 수 있습니까? jenkins에서 분기를 빌드하는 분기를 참조하십시오. 브랜치 지정자에서 저장소 이름과 Refsec을 어떻게 설정할 수 있습니까? 또는 나는 그것을하고있는 중이며 "여러 SCM"이라는 부울을 클릭해야합니까?
pelos

@pelos 솔루션을 찾을 수 있었습니까?
Govind 2016 년

현재 yml 파일을 사용하지 않고 일반 작업으로 두 가지 다른 워크 플로를 수행했습니다.
pelos

5

리포지토리의 관계에 따라 다른 방법은 다른 리포지토리 (리포지토리)를 git 하위 모듈 로 리포지토리 중 하나에 추가하는 것입니다. 자식 서브 모듈은 다른 저장소에 대한 참조를 만듭니다. "superproject" (공식 용어)를 --recursive복제 할 때 플래그 를 지정하지 않으면 해당 하위 모듈 저장소가 복제되지 않습니다 .

현재 프로젝트에 하위 모듈을 추가하는 명령은 다음과 같습니다.

git submodule add <repository URI path to clone>

우리는 Jenkins v1.645를 사용하고 있으며 git SCM은 수퍼 프로젝트를 위해 재귀 클론을 즉시 사용할 것입니다. Voila의 Superproject 파일과 모든 종속 (하위 모듈) repo 파일은 동일한 Jenkins 작업 작업 공간의 해당 디렉토리에 있습니다.

이것이 올바른 접근 방법이라는 것을 보증하지 않고 오히려 접근 방법입니다.


5

Jenkins : 여러 SCM-더 이상 사용되지 않습니다. GIT 플러그인-여러 repos에서 작동하지 않습니다.

코드로 스크립팅 / 파이프 라인-가는 방법입니다.


2

나는 또한이 문제가 있었다. 다른 프로젝트에서 Trigger / call 빌드를 사용하여 해결했습니다. 각 저장소마다 매개 변수를 사용하여 다운 스트림 프로젝트를 호출합니다.

주요 프로젝트 :

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

그런 다음 각 저장소마다 다음과 같은 다운 스트림 프로젝트를 호출합니다.

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

다운 스트림 프로젝트 : Linux-Tag-Checkout :

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 

1

하나의 작업 공간에서 한 번에 두 개 이상의 REPO을 점검 이다 (어쩌면 유일한 최신 버전에?) 젠킨스 + 힘내 플러그인 가능.

"소스 코드 관리"섹션에서 "Git"을 선택하지 말고 "Multiple SCMs"를 선택하고 여러 개의 git 저장소를 추가하십시오.

하나만 제외하고 "추가 동작"으로 "하위 디렉토리 체크 아웃"조치를 추가하고 개별 서브 디렉토리를 지정하십시오.


이 방법으로 바닐라 Git 플러그인 대신 (더 이상 사용되지 않는) 다중 SCM 플러그인을 사용하고 있다고 생각합니다.
로버트

0

우리는 git-repo 를 사용하여 여러 GIT 저장소를 관리하고 있습니다. git-repo가 ​​관리하는 리포지토리 전체 또는 일부를 동일한 Jenkins 작업 공간으로 체크 아웃 할 수 있는 Jenkins Repo 플러그인 도 있습니다.


이 질문에 나오는 문제를 정확히 어떻게 해결합니까? 언급 한 플러그인을 설치하고 repo 및 플러그인에 대해 읽었지만 한 프로젝트에서 실행하기 위해 두 개의 저장소를 복제하도록 Jenkins를 설정하는 방법을 볼 수 없습니다 ...
GreenAsJade

Repo를 사용하려면 매니페스트 파일 만 포함 할 특수 리포지토리를 만들어야합니다. 이 파일에서 다른 리포지토리에 대한 모든 정보를 지정합니다. 매니페스트 파일의 정확한 형식은 git-repo 프로젝트 ( gerrit.googlesource.com/git-repo/+/master/docs/… ) 의 docs / manifest-format.txt 파일에 설명되어 있습니다. 작업의 Jenkins Repo 구성시- 'manifest'저장소의 위치와 선택적으로 'manifest'파일의 이름을 지정하십시오 (여러 개가있을 수 있음). 매니페스트에 지정된 모든 리포지토리가 복제됩니다.
vladisld
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.