Documents

Jenkins CI 구축

GitHub에 Webhook 설정

  1. GitHub에 webhook 등록

    Hooks
    1. repo에 Settings-Hooks 에서 Add webhook 으로 추가

      Add webhook
      • Payload URL에 $JENKINS_BASE_URL/github-webhook/ 을 입력한다.
        (URL은 반드시 슬래시(/)로 끝나야 한다)

    2. webhook을 호출할 이벤트를 선택한다.

      Set pushes event

      여기서는 remote에 push 이벤트를 받기위해 Pushes 만 선택하였다.

Jenkins에 pipeline 설정

  1. Jenkins에 GitHub plugin 설치

  2. Jenkins에 실행시킬 pipeline을 추가한다.

    Add new item
  3. webhook을 받기 위한 repo를 GeneralGitHub project-Project url 에 추가해준다.

    Set github project url
  4. 해당 작업를 실행시키기 위해 Build Triggers 설정을 한다.

    Check build trigger
    Example 1. Webhook 설정 관련 경고

    Project url 설정을 한 뒤에 아래와 같이 트리거 설정에 경고문이 추가되었다.

    warn message

    아래 링크를 통해 자세한 에러 메시지를 확인할 수 있다.

    There are no credentials with admin access to manage hooks on GitHubRepositoryName

    위와 같은 에러 메시지가 나왔는데, 우선 webhook을 받는데는 문제 없으니 다음 스텝을 진행하였다.

  5. Pipeline 스크립트 설정

    pipeline script
    Jenkinsfile 작성법
    Declarative Pipeline

    pipeline : 보다 쉽게 작성 할 수 있게, 커스텀 되어 있음. Groovy-syntax기반 - Groovy 문법을 잘 몰라도 작성 가능

    Scripted Pipeline

    node : Groovy기반, Declarative보다 효과적으로 많은 기능을 포함하여 작성 가능. 하지만 작성 난이도가 높음 - Groovy 문법을 잘 알아야 함

Jenkinsfile
void setBuildStatus(String message, String state) {
  step([
    $class: "GitHubCommitStatusSetter",
    reposSource: [$class: "ManuallyEnteredRepositorySource", url: "https://github_url/org/your_repo"],
    contextSource: [$class: "ManuallyEnteredCommitContextSource", context: "ci/jenkins/build-status"],
    errorHandlers: [[$class: "ChangingBuildStatusErrorHandler", result: "UNSTABLE"]],
    // 아래 값을 Display URL for Blue Ocean 플러그인 설치 후 활성화 한다.
    // statusBackrefSource: [$class: "ManuallyEnteredBackrefSource", backref: "${env.RUN_DISPLAY_URL}"],
    statusResultSource: [
      $class: "ConditionalStatusResultSource",
      results: [
        [$class: "AnyBuildResult", message: message, state: state]]
      ]
  ]);
}

pipeline {
  agent {
    docker { image 'openjdk:11' }
  }

  stages {
    stage('Checkout') {
      steps {
        git branch: 'feature/your_branch',
            credentialsId: 'credentials_id',
            url: 'git@github_url:org/your_repo.git'
      }
    }

    stage('Environment') {
      steps {
        sh 'chmod 755 ./gradlew'
        sh 'java -version'
        sh 'printenv|sort'
      }
    }

    stage('Clean') {
       steps {
         sh './gradlew clean'
       }
    }

    stage('Test') {
       steps {
         sh './gradlew test' // unit test
       }
    }

    stage('Build') {
       steps {
         sh './gradlew build -x test'
       }
    }
  }

  post {
    success {
      setBuildStatus("Build succeeded", "SUCCESS");
    }
    failure {
      setBuildStatus("Build failed", "FAILURE");
    }
  }
}

참고할 사항

  1. Build Now 버튼을 통해 한번 실행하여 webhook을 받을 수 있도록 해준다.

  2. checkout 받은 마지막 브랜치가 설정되고, 이 브랜치에 변경이 없으면 빌드가 실행되지 않는다.

URL 바뀌면 변경되어야 할 곳

  • GitHub > Settings > Developer settings > OAuth Apps 에서 URL 변경

    • Homepage URL

    • Authorization callback URL

  • GitHub > 각 repo > Settings > Hooks 에서 Webhooks 설정 변경

    • Payload URL

  • Jenkins > configure 에서 URL 변경

    • Jenkins Location > Jenkins URL

트러블슈팅

GitHub Commit Status Setter 실패

ERROR: [GitHub Commit Status Setter] ...
  • state를 설정하는 계정에 권한이 없어서 발생한 이슈.

  • Settings-Collaborators & teams 에서 계정 추가 및 Write 권한 설정

GitHub commit Status Setter 성공 응답은 받았지만 git status 안 생기는 이슈

아래와 같이 repos에 아무런 정보가 들어가지 않는 경우.

[Set GitHub commit status (universal)] SUCCESS on repos [] (sha:baf9f33) with context:ci/jenkins/build-status

Manage Jenkins > Configure System > GitHub > GitHub Servers 설정이 있어야 함

Polling has not run yet.

  • GitHub에서 Webhook이 제대로 오는가 확인

Method POST required

  • GitHub Webhook에 Service Timeout 발생

  • /github-webhook/ URL 접속하니 Method POST required 에러 스택트레이스 발생

  • GitHub 플러그인 설치 필요

  • 20001 포트로 되어 있었는데 Jenkins를 80 포트로 열고 GitHub에 payload url 변경하니 동작함

기타 Jenkins 설정

PR 생성시 빌드하기

기존 Github Pull Request Builder Plugin은 deprecated 되었으므로, Github Branch Source Plugin을 사용할 것

참고 링크

블루오션 URL 설정

  1. Display URL for Blue Ocean 플러그인 설치

    • 설치되면 빌드시에 RUN_DISPLAY_URL, RUN_CHANGES_DISPLAY_URL, JOB_DISPLAY_URL 환경변수가 추가된다.

    • RUN_DISPLAY_URL 환경변수에 블루오션 빌드 결과 화면이므로 이 값을 사용한다.

  2. setBuildStatus 안에 아래 설정 값 추가

    statusBackrefSource: [$class: "ManuallyEnteredBackrefSource", backref: "${env.RUN_DISPLAY_URL}"],

Jenkins GitHub 서버 설정

Webhook을 받으려면 서버 설정 및 Manage hooks 설정이 필요한 줄 알았지만, 해당 item에 GitHub url 설정해주면 해결되므로 이곳에 남겨둔다.

  1. Jenkins에 GitHub plugin 설치

  2. Jenkins 설정에서 GitHub Credentials 및 Manage hook 설정을 한다.

    1. GitHub 탭안에서 고급 을 선택하면 Additional action 설정이 노출된다.

    2. Convert login and password to token 을 선택하여 Credentials 을 추가한다. (github_url/settings/tokens 에 추가된다)

      Create credentials
    3. GitHub Server에 등록하려는 서버와 Credentials을 설정한다.

      Credentials added
    4. GitHub ServerManage hooks 를 체크한다.

      Check manage hook checkbox