Java의 지속적인 통합

27836 단어 antjavaci
제가 알기로는 Gradle, 심지어 Maven 모두 자바로 구축하는 방법입니다.그들은 관례에 심각하게 의존하는 것 같다. 이것은 매우 좋다.그러나 이 약속에 (또는 내가 한 것처럼) 추가할 필요가 있다면, 플러그인을 구축하든지, 구축하는 과정에서 추가 Apache Ant 작업과 목표를 수행하는 방법은 두 가지밖에 없는 것 같다.그래서 내가 보기에 좋은 사람Apache Ant은 여전히 건재하다.

프로젝트


이 시리즈의 다음 호에서 연구하고자 하는 바와 같이, 나는 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 filebuild.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 에서 자동으로 제공됩니다.
  • 코드 덮어쓰기 측정에 포함NetBeans으로 확장됩니다.

  • 패키지: JAR 파일 JaCoCo 과 배포 복사 및 붙여넣기를 위한 zip 파일 등 플러그인을 위한 패키지를 만듭니다.

  • 컴파일: 컴파일, 테스트와 분석이 결합된 빠른 방식.

  • 재구성: 조합을 정리하고 생성하는 단축키입니다.

  • 발표: 정리, 생성, 포장 조합의 단축키.
  • a POM for reference and deployment에서 제공하는 구축에는 확장을 위해 덮어쓰는 빈 목표가 포함되어 있습니다.예를 들어 -post-clean 목표는 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%
    
    그러나 그곳에 도착하기 전에 우리는 구축 환경을 초기화해야 한다.
  • 검색이 시작되기 전에 필요한 Apache Ant 의존항Apache Ivy 자체를 포함합니다.
  • 검색에 사용할 수 없는 의존 항목(예: Apache Ivy 또는 Apache Ivy을 검색합니다.
  • 필요한 환경 변수를 설정합니다(예: build.bat.
  • 편광 모드 색산 Apache Ivy 종속성


    실행Apache Ant 전에 관련 이 완료되었습니다.
  • 필요하면 먼저 자체 다운로드Apache Ivy.
  • 의존 항목을 검색하기 위해 실행합니다.
  • 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\ 를 설정하는 것입니다.
  • 이로 인해 서로 다른 프로젝트, 심지어 서로 다른 지점에서 서로 다른 버전(예를 들어 Apache Ant을 사용하는 것이 매우 까다롭다.
  • CI 플랫폼은 수동 설치를 수행할 수 없는 특정 개발자이기 때문에 서로 다른 의존항의 정확한 버전이 이미 그곳에서 사용할 수 있는지 확인해야 한다.또는 설치해서 스크립트를 작성해야 합니다...
  • 따라서 이 프로젝트의 유일한 진정한 선결 조건은 Java 8이다.그것은 같은 컴퓨터에 다른 버전을 설치할 수 있는 적합한 설치 프로그램이 있다.레지스트리를 사용하여 설치 위치를 찾고 환경 변수 %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 명성이 좋지 않은데, 나는 왜 그런지 이해할 수 있다.주요 실패는 차세대 구축 도구에서 약속한 첫 번째라고 생각합니다.
  • 과 특정 생태계의 긴밀한 통합(이 예는 Java)이다.
  • 다중 플랫폼 설명(및 실행).
  • 이것은 처음이기 때문에, 그것은 불가피하게 최악이다.특히 핵심 개념을 이해할 때 너무 많고 복잡하다.그 시간 후에 당신은 정말로 이것에 대해 무엇을 해야 한다고 생각할 것이다. (그 과정에서 돌파적인 변화가 필요하다.)그러나 이런 개념들은 이해의 관건이다. antcontrib와 같은 저렴한 해결 방안 (나는 심지어 이 프로젝트에 연결하고 싶지 않다) 은 구축을 엉망으로 만들 뿐이다.
    한편, 많은 사람들이 Apache Ant 때문에 원망하는 것 같다the types to understand and use.그러나 어떤 언어와 마찬가지로 개발자는 그나 그녀가 그의 인간 동료를 위해 코드를 작성했다는 것을 기억할 책임이 있다.JSON(또는 YAML)이 아닌 XML을 선택하겠습니다. 강력한 기능과 표현력이 있기 때문에 감사합니다.
    본고의 첫머리에서 말한 바와 같이 자바 세계는 현재 FileListFileSet 등 도구의 약속에 심각하게 의존하고 있는 것 같다. 이것은 매우 좋다.그러나 그 약속Apache Ant보다 한 걸음 더 나아가야 한다면, 이 도구들을 위한 플러그인보다 훨씬 편리한 길을 걸어야 한다.
    우리는 곧 다시 만날 것이다The Angle Bracket Tax.

    좋은 웹페이지 즐겨찾기