| 지난 몇 년 동안이 플러그인은 많은 릴리스를 보았습니다. 관련된 모든 분들께 감사드립니다! 불행히도, 나는 더 이상 기여할 시간이 많지 않습니다. 실제로 이것은 훨씬 적은 활동, 문제에 대한 응답 성 및 내 끝에서 새로운 릴리스를 의미합니다. |
| 저는 프로젝트의 유지 보수 및 구현을 기꺼이받을 기고자를 적극적으로 찾고 있습니다. 관심이 있고이 플러그인이 계속 번창하는 것을보고 싶다면 메일을 쏴라. |
플러그인은화물 개미 작업을 활용하여 주어진 Gradle 빌드의 로컬 및 원격 컨테이너에 대한 웹 응용 프로그램을위한 배포 기능을 제공합니다. 플러그인은 전쟁 및 귀 유물을 지원합니다.
이 플러그인의 일반적인 사용 사례는 개발 중 배포를 지원하는 것입니다. 화물은 핫 배치를 사용하여 시간이 지남에 따라 컨테이너를 실행하는 JVM 프로세스의 Permgen 메모리가 채워집니다. 인공물을 지속적으로 배포하면 불가피하게 java.lang.OutOfMemoryError 로 이어집니다. 화물은 소위화물 데몬을 통해 컨테이너 관리 기능 (원격 컨테이너의 시작/정지)을 지원합니다. 그러나 지속적인 배포 시나리오에서는 종종 더 복잡한 작업을 수행해야합니다.
플러그인의 기능을 사용하려면 바이너리 아티팩트를 빌드 스크립트 클래스 경로에 추가하고 플러그인을 적용해야합니다.
플러그인 용기는 빌드 스크립트의 클래스 경로에 정의되어야합니다. Gradle 플러그인 포털에서 사용할 수 있습니다. 다음 코드 스 니펫은 buildscript 구문으로 검색하는 방법에 대한 예를 보여줍니다.
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0'
}
}
JAR 파일에는 두 개의 플러그인이 있습니다.
| 플러그인 식별자 | 의존합니다 | 유형 | 설명 |
|---|---|---|---|
| com.bmuschko.cargo-base | - | Cargobaseplugin | 화물 맞춤형 작업 유형, 사전 구성 클래스 경로 및 배포를 제공합니다. |
| com.bmuschko.cargo | com.bmuschko.cargo-base | 카르고 플러그 린 | 일련의 로컬 및 원격화물 작업을 제공하고 구성을위한 확장을 노출시킵니다. |
com.bmuschko.cargo 플러그인을 사용하면 신속하게 시작하는 데 도움이됩니다. 단일 컨테이너 제품 만 처리하면 필요한 경우 선호하는 옵션입니다. 대부분의 플러그인 사용자는이 옵션을 사용합니다. 화물 플러그인을 사용하려면 빌드 스크립트에 다음 코드 스 니펫을 포함시킵니다.
apply plugin: 'com.bmuschko.cargo'
배포 작업을 완전히 제어 해야하는 경우 com.bmuschko.cargo-base 플러그인을 사용해야합니다. 단점은 각 작업이 빌드 스크립트에서 개별적으로 구성되어야한다는 것입니다. 화물 기본 플러그인을 사용하려면 빌드 스크립트에 다음 코드 스 니펫을 포함시킵니다.
apply plugin: 'com.bmuschko.cargo-base'
com.bmuschko.cargo-base 플러그인은 이미화물의 종속성을 설정했습니다. 그렇게하려면 라이브러리의 기본 버전을 선택합니다. 또는화물 라이브러리의 사용자 정의 버전을 정의 할 수 있습니다. 그렇게하려면 dependencies 폐쇄에서 cargo 구성 이름을 사용하고 아래를 명심하십시오.
dependencies {
def cargoVersion = '1.9.10'
cargo "org.codehaus.cargo:cargo-core-uberjar:$cargoVersion",
"org.codehaus.cargo:cargo-licensed-dtds:$cargoVersion",
"org.codehaus.cargo:cargo-ant:$cargoVersion"
}
cargo 플러그인은 다음과 같은 작업을 사전 정의합니다.
| 작업 이름 | 의존합니다 | 유형 | 설명 |
|---|---|---|---|
| CargodeployRemote | - | CargodeployRemote | 배포 가능한 원격 컨테이너를 배포합니다. |
| CargoundeployRemote | - | CargoundeployRemote | 원격 컨테이너에서 배포 할 수있는 배치를 배포합니다. |
| CargoredeployRemote | - | CargoredeployRemote | 배치 가능한 원격 컨테이너를 재배치합니다. |
| Cargorunlocal | - | Cargorunlocal | 로컬 컨테이너를 시동하고 배포 가능한 것을 배포하고 사용자가 CTRL + C를 눌러 중지 할 때까지 기다립니다. |
| Cargostartlocal | - | Cargostartlocal | 로컬 컨테이너를 시작하고 배포 가능한 것을 배포 한 다음 다른 작업을 수행합니다 (예 : 테스트 실행). |
| CargoredeployLocal | - | CargoredeployLocal | 로컬 컨테이너에 배포 가능한 것을 재배치합니다. |
| Cargostoplocal | - | Cargostoplocal | 로컬 컨테이너를 중지합니다. |
| CARGOCONFIGURELOCAL | - | CARGOCONFIGURELOCAL | 로컬 컨테이너를 구성합니다. |
화물 플러그인은 전쟁 플러그인과 동일한 레이아웃을 사용합니다.
화물 플러그인은 cargo 폐쇄에서 다음 컨벤션 속성을 정의합니다.
containerId : 타겟팅하는 컨테이너 ID. 화물 웹 사이트의 지원 컨테이너 목록을 참조하십시오.port : TCP 포트 컨테이너가 응답합니다 (기본값은 8080). cargo 내에서는 deployable 폐쇄에서 1..N 배포 아티팩트의 선택적 특성을 정의 할 수 있습니다. 각 배포 아티팩트는 자체 폐쇄로 지정됩니다.
file : Project.Files (Object ...)로 전달할 수 있고 임의의 아티팩트, 폭발 된 전쟁 디렉토리 및 종속성 구성을 포함한 단일 파일 또는 디렉토리로 분해 할 수있는 모든 유형 (컨테이너에 기본적으로 프로젝트/모듈 인 Artifact -WAR 또는 EAR 파일).context : URL 컨텍스트 컨테이너가 웹 응용 프로그램을 처리하고 있습니다 (기본값으로 전쟁/귀 이름). Gradle 프로젝트/모듈에 의해 정의 된 아티팩트를 배포하려면 deployable 클로저를 정의 할 필요가 없습니다.
cargo 내에서 원격 컨테이너의 속성을 remote 이라는 클로저에서 정의 할 수 있습니다.
protocol : 원격 컨테이너의 프로토콜 (기본값으로 http ).hostname : 원격 컨테이너의 호스트 이름.username : 원격 컨테이너의 사용자 이름 자격 증명 (선택 사항).password : 원격 컨테이너의 비밀번호 자격 증명 (선택 사항). cargo 내에서는 로컬 컨테이너의 속성을 local 이라는 폐쇄로 정의 할 수 있습니다.
jvmArgs : 로컬 컨테이너에 대한 JVM 주장.outputFile : 로컬 컨테이너의 로그 파일 (콘솔에 쓰기에 대한 기본값).logFile : 로컬 컨테이너의화물 로그 파일 (콘솔에 쓰기에 대한 기본값).logLevel : 컨테이너를 (선택 사항)로 실행하는 로그 레벨. 유효한 수준은 low medium 및 high .homeDir : 지역 컨테이너 설치의 홈 디렉토리.configHomeDir : 로컬 컨테이너 구성의 홈 디렉토리.configFile : 컨테이너 구성에 추가하려는 구성 파일. configFile 은 클로저 자체이며 files 과 toDir 속성을 제공해야합니다. FileCollection files 속성으로 사용해야하며 toDir String 이어야합니다. 여러 구성 파일 대상은 둘 이상의 configFile 폐쇄를 만들어 정의 할 수 있습니다.rmiPort : 예를 들어이 서버와 통신 할 때 사용할 포트 (예 : 예를 들어 시작하고 중지하는).startStopTimeout : 컨테이너가 성공적으로 시작되었는지 또는 중지되었는지 (기본값 120000ms)를 결정하는 시간 초과 (MS).extraClasspath : 로컬 컨테이너 클래스 경로에 추가 요소를 제공하는 FileCollection (선택 사항).sharedClasspath : 로컬 컨테이너가 아닌 응용 프로그램 클래스 경로에 추가 요소를 제공하는 FileCollection (선택 사항). local 및 remote 내에서 컨테이너 별 특성을 정의 할 수 있습니다. 이러한 특성은화물 홈페이지에서 찾을 수 있습니다. 다음 예제는 로컬 Tomcat 컨테이너의 AJP 포트를 설정하는 방법을 보여줍니다.
cargo {
local {
containerProperties {
property 'cargo.tomcat.ajp.port', 9099
}
}
}
로컬 컨테이너는 통과 된 시스템 속성을 사용할 수 있습니다. 다음 예는 myproperty 라는 단일 시스템 속성을 설정하는 방법을 보여줍니다.
cargo {
local {
systemProperties {
property 'myproperty', 'myvalue'
}
}
}
Zip 설치기화물을 사용하기로 결정한 경우 컨테이너를 자동으로 다운로드합니다. Closure installer 에서 속성을 정의 할 수 있습니다. 설치 프로그램은 "로컬"화물 작업에만 적용됩니다.
installUrl : 컨테이너 분포를 다운로드하려는 URL.downloadDir : Target Directory로 컨테이너 배포를 다운로드하십시오.extractDir : 다운로드 된 컨테이너 분포를 추출하는 디렉토리.화물 홈페이지의 개별 구성 속성을 참조하십시오. 이러한 모든 속성은 프로젝트 속성에 의해 상환 될 수 있습니다. 프로젝트 속성의 이름은화물 매뉴얼과 동일합니다.
컨테이너 분포를 해결할 때 Gradle 종속성 캐시의 이점을 얻으려면 설치자를 구성 할 때 URL 대신 구성을 사용할 수 있습니다.
configurations {
tomcat
}
dependencies {
tomcat "org.apache.tomcat:tomcat:9.0.14@zip"
}
cargo {
local {
installer {
installConfiguration = configurations.tomcat
}
}
}
cargo {
containerId = 'tomcat6x'
port = 9090
deployable {
context = 'myawesomewebapp'
}
remote {
hostname = 'cloud.internal.it'
username = 'superuser'
password = 'secretpwd'
}
local {
homeDir = file('/home/user/dev/tools/apache-tomcat-6.0.32')
outputFile = file('build/output.log')
startStopTimeout = 60000
containerProperties {
property 'cargo.tomcat.ajp.port', 9099
}
}
}
화물 배치 작업을 실행할 때 프로젝트의 아티팩트를 자동으로 조립하고 싶습니다.
작업 cargoRunLocal 작업은 assemble 작업에 자동으로 의존하지 않습니다. 그 이유는 프로젝트의 아티팩트를 배포하고 싶지 않거나 프로젝트가 전쟁이나 귀 파일을 생성하지 않기 때문입니다. 대신 하나 이상의 외부 아티팩트를 배포 할 수 있습니다. 워크 플로가 "코드 컴파일"처럼 보이면 "아티팩트 생성"및 "배포"는화물 배치 작업이 assemble 작업에 따라 다릅니다. 다음은 다음과 같습니다.
cargoRunLocal.dependsOn assemble
나는 멀티 프로 젝트 빌드 작업을하고 있습니다. 모든 웹 프로젝트에 동일한화물 구성을 적용 할 수 있습니까?
Gradle은 특정 기준에 따라 서브 프로젝트를 필터링 할 수 있습니다. 빌드의 루트 프로젝트에서 관련 구성을 주입하려면 전쟁 플러그인을 적용하는 모든 하위 프로젝트를 식별해야합니다 (물론 동일한 개념은 귀 프로젝트에 대해 작동). 다음 코드 스 니펫과 같이 configure 메소드를 사용하여화물 플러그인과 구성을 적용하십시오.
def webProjects() {
subprojects.findAll { subproject -> subproject.plugins.hasPlugin('war') }
}
gradle.projectsEvaluated {
configure(webProjects()) {
apply plugin: 'com.bmuschko.cargo'
cargo {
containerId = 'tomcat7x'
remote {
hostname = 'localhost'
username = 'manager'
password = 'manager'
}
}
}
}
컨테이너에 여러 아티팩트를 배치하고 싶습니다. 어떻게해야하나요?
별도의 deployable 폐쇄로 각 아트팩트를 지정합니다. 각 폐쇄는 고유 한 URL 컨텍스트를 할당해야합니다. 다음 예제는 세 가지 다른 아티팩트가있는화물 설정이 로컬 Tomcat에 배치 된 방법을 보여줍니다.
cargo {
containerId = 'tomcat6x'
port = 9090
deployable {
file = file('/home/foo/bar/web-services.war')
context = 'web-services'
}
deployable {
file = file('/home/foo/bar/web-app.war')
context = 'web-app'
}
deployable {
file = file('/home/foo/bar/enterprise-app.ear')
context = 'enterprise-app'
}
local {
homeDir = file('/home/user/dev/tools/apache-tomcat-6.0.32')
}
}
화물을 사용하고 싶은 컨테이너를 자동으로 설치할 수있는 방법이 있습니까?
화물을 사용하면 로컬 디스크에 자동으로 다운로드 및 설치되는 컨테이너를 정의 할 수 있습니다. installer 클로저를 지정하기 만하면됩니다. 다음 코드 스 니펫 다운로드, 설치 및 사용 Tomcat 7 :
cargo {
containerId = 'tomcat7x'
local {
installer {
installUrl = 'http://apache.osuosl.org/tomcat/tomcat-7/v7.0.27/bin/apache-tomcat-7.0.27.zip'
downloadDir = file("$buildDir/download")
extractDir = file("$buildDir/extract")
}
}
}
로컬 컨테이너에 구성 파일을 추가하고 싶습니다. 어떻게해야하나요?
로컬 컨테이너의 경우 런타임에서 파일을 사용하려는 소스 파일과 디렉토리를 정의하는 configFile 이라는 클로저를 사용할 수 있습니다. 파일을 둘 이상의 대상으로 복사 해야하는 경우 여러 구성 configFile 폐쇄 만 생성합니다.
cargo {
containerId = 'jboss5x'
local {
configFile {
files = project.files('src/main/jboss5/login-config.xml')
toDir = 'conf'
}
configFile {
files = project.files('src/main/jboss5/login-config.xml', 'src/main/jboss5/sample-users.properties')
toDir = 'conf/props'
}
}
}
이진 파일을 추가하려면 대신 file 폐쇄를 사용해야합니다.
cargo {
containerId = 'glassfish3x'
local {
file {
file = file('../config/db/mysql-connector-java-5.1.23-bin.jar')
toDir = 'lib'
}
}
}
둘 이상의 컨테이너에 대한 내화물 작업을 설정하고 구성하고 싶습니다. 이 작업을 수행 할 수 있습니까?
전적으로. 화물 기본 플러그인은 배포 작업을 설정하는 데 필요한 모든 작업을 제공합니다. 하나 이상의 작업을 생성하고 필수 속성을 구성하는 것입니다. 다음 예는 Tomcat 및 Jetty를위한 로컬 컨테이너 작업을 설정하는 방법을 보여줍니다.
apply plugin: 'com.bmuschko.cargo-base'
task myTomcatRun(type: com.bmuschko.gradle.cargo.tasks.local.CargoRunLocal) {
containerId = 'tomcat7x'
homeDir = file('/home/user/dev/tools/apache-tomcat-7.0.42')
}
task myJettyRun(type: com.bmuschko.gradle.cargo.tasks.local.CargoRunLocal) {
containerId = 'jetty9x'
homeDir = file('/home/user/dev/tools/jetty-distribution-9.0.4.v20130625')
}
여러 원격 컨테이너에 롤링 배포를위한 배포 작업을 만들고 싶습니다. 어떻게해야하나요?
Gradle을 사용하면 빌드 스크립트 로직을 기반으로 작업을 동적으로 생성 할 수 있습니다. 다음 예제는 세 가지 Tomcat 배포 작업을 작성하는 방법과 간단한 데이터 구조를 통해이를 구성하는 방법을 보여줍니다. 스크립트가 끝나면 모든 원격 컨테이너에 배포를 트리거하는 다른 작업도 추가합니다.
class RemoteContainer {
String name
String hostname
Integer port
String username
String password
}
def remoteContainers = [new RemoteContainer(name: 'tomcat1', hostname: 'remote-tomcat1',
port: 9090, username: 'admin', password: 's3cr3t'),
new RemoteContainer(name: 'tomcat2', hostname: 'remote-tomcat2',
port: 8050, username: 'deployer', password: 'qwerty'),
new RemoteContainer(name: 'tomcat3', hostname: 'remote-tomcat3',
port: 8888, username: 'su', password: 'powerful')]
apply plugin: 'com.bmuschko.cargo-base'
remoteContainers.each { config ->
task "deployRemote${config.name.capitalize()}"(type: com.bmuschko.gradle.cargo.tasks.remote.CargoDeployRemote) {
description = "Deploys WAR to remote Tomcat '${config.name}'."
containerId = 'tomcat7x'
hostname = config.hostname
port = config.port
username = config.username
password = config.password
}
}
task deployToAllRemoteTomcats {
dependsOn remoteContainers.collect { "deployRemote${it.name.capitalize()}" }
description = 'Deploys to all remote Tomcat containers.'
group = 'deployment'
}
원격 배치 전에 컨테이너를 다시 시작하고 싶습니다. 이 작업을 수행 할 수 있습니까?
예, 이것은화물 데몬 기능의 도움으로 가능합니다. 화물 데몬 JVM 프로세스를 설정하고 컨테이너 구성을위한화물 온라인 문서를 참조하십시오. 이 플러그인을 사용하면 사용자 정의 작업을 사용하여 컨테이너를 시작하고 중지 할 수 있습니다. 다음 예제는 중지, 시작 후 아티팩트를 재배치합니다.
apply plugin: 'com.bmuschko.cargo'
cargo {
...
}
ext.tomcat7HandleId = 'tomcat7'
task cargoDaemonStop(type: com.bmuschko.gradle.cargo.tasks.daemon.CargoDaemonStop) {
handleId = tomcat7HandleId
}
task cargoDaemonStart(type: com.bmuschko.gradle.cargo.tasks.daemon.CargoDaemonStart) {
handleId = tomcat7HandleId
}
cargoDaemonStart.mustRunAfter cargoDaemonStop
cargoRedeployRemote.dependsOn cargoDaemonStop, cargoDaemonStart