Java의 지속적인 통합
프로젝트
이 시리즈의 다음 호에서 연구하고자 하는 바와 같이, 나는 Salesforce CLI 을 사용하여 Salesforce 프로젝트를 위한 구축을 만들어야 한다.어떤 구축 도구도 이런 환경이 진정으로 고유한 것이 없다. Salesforce는 어떻게 간단한 구축을 실현하는지 보여주는 데 열중한다by batching command lines executions.나는 이것이 내가 창설할 수 있을 것이라고 생각하지 않는다. 그리고 내가 그곳에 도착할 때 상세하게 설명할 것이기 때문에, 나는 사용하기로 결정했다 Apache Ant.실행과 출력에 대해 적당한 제어를 하기 위해서, 나는 Salesforce CLI 명령을 Ant 임무에 봉인하기로 결정했다.따라서
exec
프로젝트.개미sfdx/ 마카토이사
Salesforce DX CLI의 Ant 작업 봉인
이 프로젝트의 주요 내용은 다음과 같습니다.
ant-sfdx (
build.xml
). The build file
build.bat
는 로컬에서 파일 생성을 수행하는 데 도움이 됩니다.The script file (
.travis.yml
). CI 구성 파일 파일 생성
목표가 개의 임무를 만드는 것을 감안하면 나도 이 프로젝트에서 그것을 사용하는 것은 자연스러운 것 같다. 단지 더 많은 경험을 얻기 위해서라면.나는 또한 Apache Ant를 사용하기로 결정했다. 그것은 가장 좋은 Java IDE이기 때문이 아니라 NetBeans에 좋은 지원을 제공하고 Apache Ant를 바탕으로 완전하고 확장 가능한 구축을 만들 수 있기 때문이다.
사실, 만약 내가 단지 내
build.xml
에서 Apache Ant 제공한 구축 파일을 가져왔을 뿐이라면, 나는 자동으로 컴파일과 테스트 프로젝트에 필요한 모든 목표를 얻을 것이다.<import file="nbproject/build-impl.xml" />
내 구축은 다음과 같은 목표를 제공했다(지금까지는 잘 알고 있을 것이다).청결: NetBeans에 의해 자동으로 제공됩니다.
번역: NetBeans 에 의해 자동으로 제공됩니다.
테스트: NetBeans 에서 자동으로 제공됩니다.
패키지: JAR 파일 JaCoCo 과 배포 복사 및 붙여넣기를 위한 zip 파일 등 플러그인을 위한 패키지를 만듭니다.
컴파일: 컴파일, 테스트와 분석이 결합된 빠른 방식.
재구성: 조합을 정리하고 생성하는 단축키입니다.
발표: 정리, 생성, 포장 조합의 단축키.
tmp\
디렉터리의 완벽한 확장점을 삭제하는 것이다.<target name="-post-clean" depends="clean.tmp" />
<target name="clean.tmp">
<delete dir="./tmp" includeemptydirs="true" quiet="true" failonerror="false" />
</target>
확장점을 찾기 위해 포함된 전체 파일 (1700여 줄 XML!) 을 읽을 수 있습니다.또는 NetBeans 자체를 사용하여 탐색할 수 있습니다. NetBeans또한 를 사용하여 코드 분석을 수행할 수 있습니다.
<target name="analyze.pmd">
<taskdef name="pmd" classname="net.sourceforge.pmd.ant.PMDTask">
<classpath>
<fileset dir=".tmp/pmd-bin-6.21.0/lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</taskdef>
<pmd failOnRuleViolation="true" cacheLocation="tmp/obj/pmd.cache">
<fileset dir="src/main">
<include name="**/*.java" />
</fileset>
<sourceLanguage name="java" version="1.8"/>
<ruleset>.ruleset.xml</ruleset>
<formatter type="text" toConsole="true" />
<formatter type="html" toFile="tmp/pmd-results.html" />
<formatter type="xml" toFile="tmp/pmd-results.xml" />
</pmd>
</target>
패키지 대상을 완전히 만들어야 하지만, 무엇을 해야 하는지 알면 매우 간단합니다.<target name="package" depends="jar,package.pom">
<copy todir="tmp/out/bin/" preservelastmodified="true">
<resources>
<file file="tmp/bin/ant-sfdx.jar" />
<file file="ivy.xml" />
</resources>
</copy>
<zip destfile="tmp/out/bin/ant-sfdx.zip" compress="true" level="9" filesonly="true">
<resources>
<file file="tmp/bin/ant-sfdx.jar" />
<file file="ivy.xml" />
<file file="${ivy.runtime.classpath}" />
</resources>
<zipfileset dir="docs" prefix="docs" />
</zip>
</target>
<target name="package.pom">
<ivy:makepom ivyfile="ivy.xml" pomfile="tmp/out/bin/pom.xml" conf="default,compile">
<mapping conf="default" scope="default" />
<mapping conf="test" scope="test" />
<mapping conf="compile" scope="compile" />
</ivy:makepom>
</target>
보시다시피 PMD에 대한 인용이 있습니다. Apache Ivy 을 사용할 때 선택한 의존 관계 관리자입니다.나는 그것의 학습 곡선이 약간 가파르다는 것을 발견했지만, 최종적으로 양호한 집적 기술이 강하다는 것을 증명했다.프로젝트의 종속성은 XML 파일에 설명되어 있습니다(물론입니다!)Apache Ant, 구축의 일부는 이러한 의존 항목 검색, 그와 관련된 각종 클래스 경로 업데이트, 의존 항목 변경 시 최신 상태를 유지하기 위한 tmp\
프로젝트의 기초로 하는 속성 파일 업데이트를 포함한다.<target name="prepare.dependencies">
<ivy:retrieve pattern="ivy/lib/[conf]/[artifact].[ext]" log="quiet" />
<pathconvert property="ivy.compile.classpath" dirsep="/" pathsep=":">
<path>
<fileset dir="${basedir}/ivy/lib/compile" includes="**/*.jar" />
</path>
<map from="${basedir}${file.separator}" to="" />
</pathconvert>
<pathconvert property="ivy.test.classpath" dirsep="/" pathsep=":">
<path>
<fileset dir="${basedir}/ivy/lib/test" includes="**/*.jar" />
</path>
<map from="${basedir}${file.separator}" to="" />
</pathconvert>
<uptodate property="prepare.ivy.nbproject.isuptodate" srcfile="ivy.xml" targetfile="nbproject/project.properties" />
<propertyfile file="nbproject/project.properties" unless:set="prepare.ivy.nbproject.isuptodate">
<entry operation="=" key="ivy.compile.classpath" value="${ivy.compile.classpath}" />
<entry operation="=" key="ivy.test.classpath" value="${ivy.test.classpath}" />
</propertyfile>
</target>
NetBeans 스크립트 파일
스크립트 파일의 핵심은
ivy.xml
실행입니다.CALL "%ANT_HOME%\bin\ant.bat" -noclasspath -nouserlib -noinput -lib "ivy\lib\test" -Dverbosity=%VERBOSITY% -f %PROJECT% %TARGET%
그러나 그곳에 도착하기 전에 우리는 구축 환경을 초기화해야 한다.build.bat
.편광 모드 색산 Apache Ivy 종속성
실행Apache Ant 전에 관련 이 완료되었습니다.
IF NOT EXIST ivy MKDIR ivy
PUSHD ivy
IF NOT EXIST ivy.jar (
powershell.exe -NoLogo -NonInteractive -ExecutionPolicy ByPass -Command "& { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest https://repo1.maven.org/maven2/org/apache/ivy/ivy/$Env:_IVY_VERSION/ivy-$Env:_IVY_VERSION.jar -OutFile ivy.jar; }"
)
POPD
"%JAVA_HOME%\bin\java.exe" -jar ivy\ivy.jar -retrieve "ivy\lib\[conf]\[artifact].[ext]"
아파치 개미 일반 의존 항목
초기화된 나머지 부분은
%ANT_HOME%
디렉터리에서 발생합니다.의존 항목의 버전은 build\
파일에 설명되어 있기 때문에 이러한 정의는 스크립트 (플랫폼) 를 뛰어넘어 다시 사용할 수 있습니다._ANT_VERSION=1.9.14
_CLOC_VERSION=1.82
_IVY_VERSION=2.5.0
_PMD_VERSION=6.21.0
이 파일은 build\versions.env
파일의 환경 변수로 쉽게 읽을 수 있습니다.IF EXIST build\versions.env (
FOR /F "eol=# tokens=1* delims==" %%i IN (build\versions.env) DO (
SET "%%i=%%j"
ECHO SET %%i=%%j
)
ECHO.
)
케이스와 같은 효과는 build\SetEnv.bat
파일에 있습니다.if [-f ./build/versions.env]; then
# xargs does not support the -d option on BSD (MacOS X)
export $(grep -a -v -e '^#' -e '^[[:space:]]*$' build/versions.env | tr '\n' '\0' | xargs -0 )
grep -a -v -e '^#' -e '^[[:space:]]*$' build/versions.env | tr '\n' '\0' | xargs -0 printf "\$%s\n"
echo
fi
그런 다음 로컬 설치 Apache Ivy 의 올바른 버전 (관례에 따라 build/.bashrc
폴더에 설치) 을 쉽게 수행하고 적절한 환경 변수를 설정할 수 있습니다.SET ANT_HOME=%CD%\.tmp\apache-ant-%_ANT_VERSION%
IF NOT EXIST "%ANT_HOME%\bin\ant.bat" (
IF NOT EXIST .tmp MKDIR .tmp
powershell.exe -NoLogo -NonInteractive -ExecutionPolicy ByPass -Command "& { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest http://mirrors.ircam.fr/pub/apache//ant/binaries/apache-ant-$Env:_ANT_VERSION-bin.zip -OutFile .tmp\apache-ant-$Env:_ANT_VERSION-bin.zip; }"
IF ERRORLEVEL 1 GOTO ERROR_ANT
powershell.exe -NoLogo -NonInteractive -ExecutionPolicy ByPass -Command "Expand-Archive -Path .tmp\apache-ant-$Env:_ANT_VERSION-bin.zip -DestinationPath .tmp -Force"
IF ERRORLEVEL 1 GOTO ERROR_ANT
)
ECHO SET ANT_HOME=%ANT_HOME%
보다 전통적인 방법은 모든 사람이 설치
를 선결 조건으로 요구하는 것이다. 그러나:.tmp\
를 설정하는 것입니다.%ANT_HOME%
를 초기화하는 것이 중요합니다.SET JAVA_HOME=
FOR /F "tokens=1,2*" %%i IN ('REG QUERY "HKLM\SOFTWARE\JavaSoft\Java Development Kit\1.8" /V JavaHome') DO (
IF "%%i"=="JavaHome" (
SET "JAVA_HOME=%%k"
)
)
IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
FOR /F "tokens=1,2*" %%i IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit\1.8" /V JavaHome') DO (
IF "%%i"=="JavaHome" (
SET "JAVA_HOME=%%k"
)
)
)
따라서 이 작업은 우리가 이전에 동등한 장에서 본 것보다 많지만, 최종 개발자는 저장소를 직접 복제하고 로컬에서 구축을 실행할 수 있다.그나저나 이게 바로 CI 플랫폼이 하는...아파치 개미 CI 구성 파일
우리는 이전에 모든 주요 문제를 해결했기 때문에 이 설정은 매우 수월해야 한다고 나는 생각한다.Apache Ant(예, 동일) 구성은 간단합니다.
install:
- . build/.bashrc
- if [! -d ivy]; then mkdir ivy; fi
- if [! -f ivy/ivy.jar]; then wget -nv -O ivy/ivy.jar https://repo1.maven.org/maven2/org/apache/ivy/ivy/$_IVY_VERSION/ivy-$_IVY_VERSION.jar; fi
- $JAVA_HOME/bin/java -jar ivy/ivy.jar -retrieve "ivy/lib/[conf]/[artifact].[ext]"
script:
- $ANT_HOME/bin/ant -noclasspath -nouserlib -noinput -lib "ivy/lib/test" -logger org.apache.tools.ant.listener.AnsiColorLogger -f build.xml release
나는 또한 이 프로젝트를 선택하여
를 위한 설정을 만들었는데, 여기에는 Travis CI 형식이 있다.steps:
- task: BatchScript@1
inputs:
filename: build\SetEnv.bat
arguments: /useCurrentJavaHome
modifyEnvironment: True
workingFolder: $(Build.Repository.LocalPath)
- script: |
IF NOT EXIST ivy MKDIR ivy
PUSHD ivy
IF NOT EXIST ivy.jar (
powershell.exe -NoLogo -NonInteractive -ExecutionPolicy ByPass -Command "& { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest https://repo1.maven.org/maven2/org/apache/ivy/ivy/$Env:_IVY_VERSION/ivy-$Env:_IVY_VERSION.jar -OutFile ivy.jar; }"
IF ERRORLEVEL 1 GOTO END_ERROR
)
POPD
"%JAVA_HOME%\bin\java.exe" -jar ivy\ivy.jar -retrieve "ivy\lib\[conf]\[artifact].[ext]"
- task: Ant@1
inputs:
buildFile: 'build.xml'
options: -noclasspath -nouserlib -noinput -lib ivy/lib/test -Dverbosity=verbose
targets: release
publishJUnitResults: true
testResultsFiles: '$(Build.Repository.LocalPath)\tmp\obj\test\results\**\TEST-*.xml'
antHomeDirectory: '$(ANT_HOME)'
jdkVersionOption: 1.8
약속한 바와 같이 이것은 내가 특정한 CI 플랫폼에 국한되지 않는다는 것을 나타낸다. 만약에 구축된 모든 논리가 이 프로필에 있다면 나는 새로운 CI 플랫폼을 시도하는 것이 얼마나 고통스러울지 상상할 수 없다.만약 내가 %JAVA_HOME%
부분에 Azure Pipelines 관련 명령을 포함하기로 결정한다면, 그것은 심지어 매우 많이 단축될 수 있다.나는 당시에 내가 반드시 이렇게 하지 않을 이유가 있을 것이라고 확신한다.보충 설명으로
azure-pipeline.yml
환경 변수를 덮어쓰지 않도록 특수한 build\SetEnv.bat
파라미터를 만들고 사용해야 합니다. 등록표 설치 검사는 /useCurrentJavaHome
에서 작업할 수 없습니다.어쩐지 우리가 지금 도처에 Docker 같은 도구가 필요하더라니. 등록표가 없어졌기 때문에...아파치 상춘등 Ant를 빌드 도구로 사용
Azure Pipelines 명성이 좋지 않은데, 나는 왜 그런지 이해할 수 있다.주요 실패는 차세대 구축 도구에서 약속한 첫 번째라고 생각합니다.
한편, 많은 사람들이 Apache Ant 때문에 원망하는 것 같다the types to understand and use.그러나 어떤 언어와 마찬가지로 개발자는 그나 그녀가 그의 인간 동료를 위해 코드를 작성했다는 것을 기억할 책임이 있다.JSON(또는 YAML)이 아닌 XML을 선택하겠습니다. 강력한 기능과 표현력이 있기 때문에 감사합니다.
본고의 첫머리에서 말한 바와 같이 자바 세계는 현재 FileList나 FileSet 등 도구의 약속에 심각하게 의존하고 있는 것 같다. 이것은 매우 좋다.그러나 그 약속Apache Ant보다 한 걸음 더 나아가야 한다면, 이 도구들을 위한 플러그인보다 훨씬 편리한 길을 걸어야 한다.
우리는 곧 다시 만날 것이다The Angle Bracket Tax.
Reference
이 문제에 관하여(Java의 지속적인 통합), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mcartoixa/continuous-integration-for-java-1127텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)