Wercker로 Java 구축

11051 단어 DockerwerckerJava
wercker는 최근에 인기 있는 클라우드 CI 도구입니다. docker 이미지에서 CI를 이동할 수 있어서 직관적이고 알기 쉽습니다.github의privete 창고도 무료로 합작할 수 있어서 개인적으로 감사합니다.
나도 개인적으로 몇 가지 언어를 사용했는데, 여기서 나는 웹 페이지에 자바 프로그램을 구축하는 일련의 절차를 쓰고 싶다.

용례


여기에 아래의 용례에 따라 실제 설정례를 기술한다.
  • Maven으로 Java 프로젝트를 관리하고 CI를 실시합니다.
  • clean && package
  • sonar:sonar
  • docker image에 CI 환경 등록
  • 이번에는 Amazon ECR
  • Workflows


    이번에는 다음과 같다.
  • build
  • 시작할 때 가장 먼저 실행되는pipeline입니다.이번에는 특별한 처리 없이 정보의 표시 등
  • maven
  • 마벤트에 대한 각종 처리 실시
  • 성공/실패 시 슬랙 알림
  • docker(master만 해당)
  • ECR에 docker image의push
  • 구현

    Pipeline: build


    기본 pipeline이라서 그대로 남겼고 약간의 메시지만 보냈어요.실제로 후속 처리에 필요한 서류의 제작과 복사 등이 있다면 여기서 한다.
    wercker.yml
    box: busybox
    build:
      steps:
        - script:
            name: echo
            code: |
              echo " ${WERCKER_GIT_REPOSITORY}"
    

    Pipeline: maven


    마벤트를 실행합니다.자바와 마븐 명령을 사용할 수 있도록 박스에서 마븐을 지정했습니다.
    wercker.yml
    maven:
      box: maven:3.5.2-jdk-8-alpine
      steps:
        - java/maven:
            goals: clean package
            cache_repo: true
        - java/maven:
            goals: sonar:sonar
            maven_opts: -Dsonar.host.url=${SONAR_URL} -Dsonar.login=${SONAR_LOGIN_KEY}
            cache_repo: true
        - script:
            name: copy to output
            code: |
              cp target/sada4j-*.jar $WERCKER_OUTPUT_DIR/sada4j.jar
      after-steps:
        - slack-notifier:
            url: ${SLACK_WEBHOOK_URL_NOTIFY}
            channel: ${SLACK_ROOM_NOTIFY}
            notify_on: failed
            username: wercker maven notify
    
    이곳에서 집행하는 일에 관하여 요점을 발췌하다.

    java/maven step의 마벤트 실행 사용하기


    wercker에서 마벤트 실행용 Step을 미리 정의했습니다. 마벤트를 실행할 때 step에서 자바/maven을 지정하면 마벤트의 실행 환경을 자동으로 구축합니다.
    지정할 수 있는 옵션 등 자세한 내용은 아래 문서를 참고하십시오.
    https://github.com/wercker/step-maven

    환경 변수 사용


    Worker에서 환경 변수를 사용할 수 있습니다.
    http://devcenter.wercker.com/docs/environment-variables
    Environment 클래스는 다음 세 가지 유형을 정의할 수 있습니다.필요에 따라 설정 범위를 조정합니다.
  • Organization Level
  • Application Level
  • Pipeline Level
  • 또한wercker 표준이 지원하는 환경 변수는 다음과 같습니다.
    http://devcenter.wercker.com/docs/environment-variables/available-env-vars

    $WERCKER_OUTPUT_DIR에 실행 결과 저장하기


    wercker에서는 docker container에서 CI 프로세스를 수행하는 경우가 있으며, 서로 다른 Pipeline 사이에서는 파일을 계승할 수 없습니다.
    후속 Pipeline에서도 파일을 사용할 수 있는 경우 ${WERCKER_OUTPUT_DIR}에 지정된 디렉토리에 파일을 배치해야 합니다.
    상기 예에서 후속적인 docker 이미지 생성 처리를 위해 ${WERCKER_OUTPUT_DIR}에 docker 이미지에 포함된 파일 그룹을 설정합니다.

    after-steps 기반 Slack 알림


    after-steps를 사용하여 Piperline에서 올바른 이동과 부정확함 모두에 대해 수행해야 하는 Step을 정의할 수 있습니다.
    위의 예에서 Slack-notifier step을 사용하여 Slack 알림을 수행합니다.

    slack-notifiernotify_on: failed라면 step 처리가fail로 바뀌었을 때만 알림을 보낼 수 있습니다.

    Pipeline: docker


    Amazon ECR에서 docker image push를 만듭니다.
    Wercker에서 인터넷/docker-push 이 step를 사용하면 임의의 docker 이미지 push를 docker repository에 저장할 수 있습니다.
    wercker공식 문서에서 다음과 같은 docker repository에 대한 예를 기술하였다.
  • Docker Hub
  • Quary.io
  • Google Container Registry
  • ECR의 push 방법을 예로 들어 보겠습니다.
    wercker.yml
    docker:
      box: openjdk:8-jdk-alpine
      steps:
        - internal/docker-push:
            aws-access-key: ${AWS_ACCESS_KEY_ID}
            aws-secret-key: ${AWS_SECRET_ACCESS_KEY}
            aws-region: ${AWS_REGION}
            aws-registry-id: ${AWS_REGISTRY_ID}
            aws-strict-auth: false
            repository: sada4j
            tag: latest
            ports: 8080
            working-dir: ${WERCKER_SOURCE_DIR}
            entrypoint: java -jar sada4j.jar
    

    통용되는 말


    wercker의 docker push에 따라 Docker file을 사용한 docker build의 정의를 기술할 수 없습니다.
    다음 규칙으로 docker image를 만듭니다.
  • box로 지정된 docker 이미지가base 이미지가 됨
  • box에 있는 파일과 함께 ADD or COPY
  • box의 상태가 그대로 docker Image
  • 로 변한다고 생각하는 것이 가장 좋다
  • 다음 명령은wercker로 지정됩니다.yml에 명확하게 기술해야 한다
  • CMD
  • ENTRYPOINT
  • EXPOSE
  • ENV
  • VOLUME
  • AUTHOR
  • 옵션 지정에 대한 자세한 내용은 다음을 참조하십시오.
    http://devcenter.wercker.com/docs/steps/internal-steps#docker-push
    위와 같은 규격이기 때문에 운용에 있어 다음과 같은 사항을 주의해야 한다.
  • box에 존재하는 불필요한 파일 제거
  • 가장 빠른 방법은 이번 예와 같이 포장과 docker push를 다른 Pipeline으로 정의하고 ${WERCKER OUT DIR}를 통해 필요한 최소한의 파일만 전달하는 것이다.
  • Dockerfile/docker-compose.yml와 별거하다
  • 「Can I Build Dockerfiles?」 「Currently, no.」 http://devcenter.wercker.com/docs/faq/can-i-build-dockerfiles
  • 그래서 기본적으로 중복 기술입니다.좋은 해결책이 없을까...
  • Amazon ECR 고유의 말


    ECR push에 대해 다음 값을 설정합니다.
  • aws-access-key
  • aws-secret-key
  • aws-region
  • aws-registry-id
  • 디지털 계정.
  • repository (option)
  • tag (option)
  • 정보는 웹 페이지입니다.yml에 직접 쓰기를 원하지 않기 때문에wercker의 환경 변수로 설정해야 합니다.
    총괄적으로 말하면 사용자의 상황에 따라 자바의 빌딩에서 docker repository의push까지 진행할 수 있다.

    기타 Tips


    wercker-cli


    워커의 압도적인 승리는 다른 CI 사아스에 비해 로컬환경에서 동작 확인을 위해 사용한 도구의 충실함이었다.
    웹 페이지에서wercker-cli라는 명령행 도구를 제공하여 로컬 환경에서도 서버의 행동을 재현하고 실행할 수 있습니다.
    $ wercker build --pipeline maven
    --> No Docker host specified, checking: /var/run/docker.sock
    --> Executing pipeline
    --> Running step: setup environment
    Pulling from library/openjdk: latest
    Digest: sha256:9745ed74401b23fb845b4eb7ae07ecb7dc2d40bece6bdb089975a20f76766401
    Status: Image is up to date for openjdk:latest
    --> Copying source to container
    --> Running step: wercker-init
    --> Running step: maven
    02:19:34:  Hello from the Maven Wercker Step
    (snip.)
    
    또한 위커 서버에 대한 구축 지시 등도 후술한 API에서 동일하게 조작할 수 있다.
    자세한 내용은 아래 사이트와 명령의 도움말 등을 참조하세요.
    http://www.wercker.com/cli
    또한 현재는 OSX 및 Linux 버전만 제공됩니다.

    API


    다음과 같은 API를 제공합니다.애플리케이션 설정, 빌딩 지시 등을 할 수 있다.
    http://devcenter.wercker.com/docs/api/endpoints

    Wercker Source IP


    CI/CD 스트림 때문에 Wercker와 특정 사내 도구가 결합해서 사용해야 하는 상황이 발생할 수 있습니다.
    이때 Wercker의 Source IP 주소를 지정하여 특정 IP 연결만 허용할 수 있습니다.
    위커의 Source IP 주소가 다음과 같은 형태로 공개됐기 때문에 참조만 가능합니다.
    https://s3.amazonaws.com/status.wercker.com/worker_ips/production/public.json

    box에서 ECR에 등록된 docker image 사용


    wercker.yml의box가 지정한 곳은 다음과 같습니다.
      box:
        id: <docker image name>
        aws-access-key: ${AWS_ACCESS_KEY_ID}
        aws-secret-key: ${AWS_SECRET_ACCESS_KEY}
        aws-region: ${AWS_REGION}
        repository: <docker image name>
        aws-registry-id: ${AWS_REGISTRY_ID}
    

    좋은 웹페이지 즐겨찾기