Jenkins 샘플 플러그인을 움직여보십시오.

요약



Jenkins의 플러그인은 쉽게 만들 수 있다는 소문을 들었으므로 튜토리얼을 시도했습니다.
htps : // 우우키. 지킨킨 s. 이오 / ぢ sp ぁ y / 지 킨킨 S / P ㅅ 긴 + 쓰리 리

튜토리얼에서는 빌드 콘솔에 Hello world로 표시하는 플러그인을 만듭니다.
Pipeline용의 함수도 만들어 줍니다.

환경



macOS Sierra v.10.12.6

절차



maven 설치


$ brew install maven
$ mvn -v
Apache Maven 3.5.2 (...)
Maven home: ...
Java version: 1.8.0_144, ...
...

Maven은 3 이상, JDK는 6.0 이상이 필요합니다.

Jenkins의 플러그인 개발에서는 압도적으로 Maven이 사용되는 것 같습니다.
gradle에서도 (+groovy에서도) 개발할 수 있는 것 같습니다만 지금은 지시대로 Maven로 진행합니다.
htps : // m / 445 / / ms / 0 0 16d9c38d949114 에b

maven 설정 파일 설정



아래의 설정 파일을 만들어 두면 플러그인 작성 명령을 칠 때 짧아지므로 편리합니다.

~/.m2/settings.xml
<settings>
  <pluginGroups>
    <pluginGroup>org.jenkins-ci.tools</pluginGroup>
  </pluginGroups>

  <profiles>
    <!-- Give access to Jenkins plugins -->
    <profile>
      <id>jenkins</id>
      <activation>
        <activeByDefault>true</activeByDefault> <!-- change this to false, if you don't like to have it on per default -->
      </activation>
      <repositories>
        <repository>
          <id>repo.jenkins-ci.org</id>
          <url>https://repo.jenkins-ci.org/public/</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>repo.jenkins-ci.org</id>
          <url>https://repo.jenkins-ci.org/public/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <mirrors>
    <mirror>
      <id>repo.jenkins-ci.org</id>
      <url>https://repo.jenkins-ci.org/public/</url>
      <mirrorOf>m.g.o-public</mirrorOf>
    </mirror>
  </mirrors>
</settings>

샘플 플러그인 만들기


$ mvn archetype:generate -Dfilter=io.jenkins.archetypes:plugin템플릿이 준비되어 있으므로 사용합니다.
이번에 사용하고 싶은 것은 3개 표시 중 3번째, hello-world-plugin입니다.
위의 명령을 치면 대화식으로 설정을 진행할 수 있습니다.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> io.jenkins.archetypes:empty-plugin (Skeleton of a Jenkins plugin with a POM and an empty source tree.)
2: remote -> io.jenkins.archetypes:global-configuration-plugin (Skeleton of a Jenkins plugin with a POM and an example piece of global configuration.)
3: remote -> io.jenkins.archetypes:hello-world-plugin (Skeleton of a Jenkins plugin with a POM and an example build step.)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 3
Choose io.jenkins.archetypes:hello-world-plugin version:
1: 1.1
2: 1.2
3: 1.3
Choose a number: 3: 1
[INFO] Using property: groupId = unused
Define value for property 'artifactId': hello-jenkins-plugin-world
Define value for property 'version' 1.0-SNAPSHOT: :
[INFO] Using property: package = org.jenkinsci.plugins.sample
Confirm properties configuration:
groupId: unused
artifactId: hello-jenkins-plugin-world
version: 1.0-SNAPSHOT
package: org.jenkinsci.plugins.sample
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: hello-world-plugin:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: unused
[INFO] Parameter: artifactId, Value: hello-jenkins-plugin-world
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.jenkinsci.plugins.sample
[INFO] Parameter: packageInPathFormat, Value: org/jenkinsci/plugins/sample
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.jenkinsci.plugins.sample
[INFO] Parameter: groupId, Value: unused
[INFO] Parameter: artifactId, Value: hello-jenkins-plugin-world
[INFO] Project created from Archetype in dir: ~/project/jenkins-plugins/hello-jenkins-plugin-world
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:46 min
[INFO] Finished at: 2018-02-25T23:00:51+09:00
[INFO] Final Memory: 15M/177M
[INFO] ------------------------------------------------------------------------
  • hello-world-plugin의 버젼으로 어느 것을 선택해야할지는 잘 모르기 때문에, 일단 1.3으로 진행해 둔다.
  • groupId가 공란이 되어 버렸지만 공개시에는 삭제하는 것 같기 때문에 문제 없음. artifactId가 플러그인 이름 (하이픈으로 구분).

  • 샘플 플러그인 빌드


    $ cd hello-jenkins-plugin-world$ mvn install이것으로 빌드가 행해져 플러그인의 실체인 ./target/hello-jenkins-plugin-world.hpi 가 생성되었습니다!

    샘플 플러그인 디버깅 실행



    다음 명령은 Jenkins가 플러그인을 설치 한 상태에서 시작합니다.
    $ export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n"
    $ mvn hpi:run
    작업이 정의되지 않은 상태이므로 브라우저에서 프리 스타일 및 파이프 라인 작업을 적절한 이름으로 하나씩 만듭니다.
    내용은 비어 있습니다.

    프리 스타일 작업에서 샘플 플러그인 거동




    "Say hello world"라는 절차가 추가되었습니다.

    적당한 이름을 넣어 둡니다. 적용하고 저장한 후 빌드를 실행합니다.
    콘솔을 확인합니다.

    「Hello, 호게호게!」라고 방금 전 넣은 이름 앞에 메시지가 표시되게 되었습니다!


    프랑스어에 특징적인 문자가 들어가면 경고됩니다.
    !

    프랑스어 이름이므로 체크를 넣습니다.

    이 상태에서 빌드를 하면 프랑스어로 인사되었습니다!

    파이프라인 작업에서 샘플 플러그인 거동



    파이프라인 작업에서 이 플러그인을 사용하고 싶습니다.
    파이프라인 빌드 스크립트에서 이 플러그인을 사용하기 위해 greet이라는 함수를 사용할 수 있도록 정의되어 있습니다.

    HelloWorldBuilder.java
        @Symbol("greet")
        @Extension
        public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {
        ...
    }
    

    빌드 스크립트는 메시지만 표시하고, Apply& 저장하고 빌드합니다.
    node {
       greet 'hogehoge'
    }
    

    실행 결과 콘솔 화면:

    파이프라인에서도 샘플 플러그인이 제대로 작동하는지 확인할 수 있었습니다.

    프랑스어 플래그를 붙이면 이런 느낌입니다:
    node {
       greet name:"hogehoge", useFrench:true
    }
    

    실행 결과 콘솔 화면:

    파이프라인에서도 프랑스어로 인사할 수 있었습니다!

    감상



    일단 샘플 플러그인을 움직일 수 있었습니다.
    maven은 xml 기반으로 gradle에 비하면 기술량이 많아 보기 어려운 것이 난점이네요.
    다른 플러그인이나 레퍼런스를 보면 뭔가 만드는 것은 그만큼 장애물이 높지 않을 것이라고 느꼈습니다.

    좋은 웹페이지 즐겨찾기