programing

Jenkins 파이프라인 스크립트에서 SQL 스크립트를 실행하려면 작업 전략이 필요합니다.

megabox 2023. 8. 12. 10:09
반응형

Jenkins 파이프라인 스크립트에서 SQL 스크립트를 실행하려면 작업 전략이 필요합니다.

Jenkins 파이프라인 스크립트의 일부로 데이터베이스(mariadb)를 초기화하기 위해 몇 가지 SQL 스크립트를 실행해야 합니다.이 일은 제가 소유한 젠킨스 노예로 운영됩니다.Jenkins 마스터 인스턴스는 유지하지만 실행되는 호스트는 유지하지 않습니다.

첫 번째 시도는 스크립트에 "Sql.newInstance(...)"와 "sql.execute(...)"를 호출하는 인라인 코드를 넣는 것이었습니다.mariadb jar가 클래스 경로에 없기 때문에 실패합니다.

그런 다음 슬레이브에 대한 CLASSPATH 환경을 설정하여 mariadb 클라이언트 jar를 추가한 다음 슬레이브의 연결을 끊고 다시 연결하려고 했습니다.이것은 아무 효과가 없는 것처럼 보였습니다.

그런 다음 @GrapeConfig/@Grab 접근법을 시도했습니다.@GrapeConfig를 사용하여 "systemClassLoader=true"를 설정했습니다."적절한 클래스 로더를 찾을 수 없습니다."와 함께 실패합니다.그래서 저는 @GrapeConfig를 제거하려고 시도했지만 "Runtime"으로 실패했습니다.예외: javax.xml.parser 클래스의 제공자입니다.SAXParserFactory를 만들 수 없습니다."

다음으로, "sh" 명령에서 "mysql"을 직접 실행하고 SQL 스크립트의 내용을 파이프로 연결하려고 합니다.이것은 그럴듯해 보이지만, 이것이 효과가 있을지 확신할 수 없습니다.

저는 이것을 하기 위한 다양한 시도에 대해 이야기하는 노트를 본 적이 있지만, 누군가가 이것을 성공적으로 했다는 것은 들어본 적이 없습니다.

비록 이것을 "자바 방식"으로 구현하는 것이 논리적인 것처럼 보이지만, 저는 단순히 실행하는 것이 더 간단하다는 것을 알게 되었습니다.sh("mysql ... < file.sql")이것은 모든 비정상적인 클래스 경로 문제를 방지합니다.데이터베이스 클라이언트를 슬레이브 상자에 설치해야 하며 데이터베이스 독립성을 허용하지 않습니다(별로 중요하지 않음).실제로 제가 한 일은 컨테이너에서 mariadb를 실행하는 것이었습니다. 그래서 결과적인 명령줄은 "와 더 비슷했습니다.docker exec -i container mysql ... < file.sql(일반적인 "-it"가 아닌 "-i"를 사용합니다. 파일을 연결하면 작동하지 않습니다.)

업데이트:

macg33zr의 팔꿈치에서 데이터베이스를 조작하기 위해 기존 Gradle 빌드 스크립트에 작업을 추가하는 것이 매우 쉽다는 것을 알게 되었습니다.필요한 작업을 완벽하게 구현하지는 못했습니다. 단순한 "선택" 문으로 작동할 수 있다는 것을 확인했을 뿐입니다.

컨테이너의 lib 디렉토리에 아티팩트를 저장해야 했기 때문에 JDBC 드라이버 jars를 별도의 Gradle 구성으로 이미 가지고 있었습니다.

다음은 필요한 부분을 잘 요약한 것입니다. https://discuss.gradle.org/t/jdbc-driver-class-cannot-be-loaded-with-gradle-2-0-but-worked-with-1-12/2277 .중요한 미묘한 점은 클래스 로더에 JDBC 드라이버 병을 추가하는 것입니다.

언급URL : https://stackoverflow.com/questions/42815377/need-a-working-strategy-to-execute-sql-scripts-in-jenkins-pipeline-script

반응형