본문 바로가기

Beautiful Cards

ONE CARD FOR EVERY PROBLEM
From cards designed for blog posts, to product cards or user profiles, you will have many options to choose from. All the cards follow the Now UI Kit style principles and have a design that stands out. We have gone above and beyond with options for you to organise your information.
DEVELOPE/DevOps

Jenkins Manster, Slave on kubernetes

by gabstory의 닉네임 2023. 2. 14.

Jenkins Master

Jenkins 서버이자 Master node는 Jenkins Pipeline으로 정의된 모든 흐름을 관장하는 컨트롤 서버라고 할 수 있다. Jenkins Slave들에게 각각의 할 일을 정해주고 분배합니다.

 

Jenkins Slave(Agent)

Jenkins Job이 구동되는 Node(Pod)이며 JNLP(Jave Netwoork Launching Protocol)을 이용하여 Jenkins Master와 통신합니다.

 

 

 

 

설치

Kubernetes yml파일은 회사 보안 이슈로 공개하지 않겠습니다. 

 

 

첫 화면에 접속하면 InitialAdminPassword을 요청합니다. 가이드대로 k9s 또는 kubectl exec -it (pod 이름) /bin/bash을 이용하여 pod에 접속한 후 cat /var/jenkins_home/secrets/initialAdminPassword을 확인하여 기입합니다.

 

 

플러그인 설치시 Proxy 설정이 필요한 경우도 있습니다. 회사 Proxy 설정이 있다면 기입하세요.

 

 

 

Jenkins - github 연동

Github organization이 있다는 가정하에 설명하겠습니다.

Github에 접속하여 Profile -> Settings -> Developer settings -> Personal access tokens을 클릭하여 적절한 권한을 추가한 후 AccessToken을 발급 받습니다. (참고) 

 

이후 Jenkins 페이지에 들어가서 Jenkins 관리 -> 시스템 설정을 클릭합니다.

 

 

 

Credentials -> Add 버튼을 클릭하여 새로운 인증 방법을 생성합니다.

Kind는 Secret text을 선택하고 위에서 생성한 Github AccessToken을 추가합니다. (다른 종류의 인증 처리는 제대로 동작하지 않았습니다.)

 

Jenkins - Kubernetes 연동

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: jenkins-admin
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["*"]

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-admin

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins-admin
subjects:
  - kind: ServiceAccount
    name: jenkins-admin
    namespace: default
    
---    

apiVersion: v1
kind: Service
metadata:
  name: jenkins-jnlp-svc
  labels:
    app: jenkins
spec:
  type: NodePort
  ports:
    - port: 50000
      targetPort: 50000
  selector:
    app: jenkins

 

Kubernetes에 Jenkins을 설치할때 NodePort 형태로 제공하는 JNLP Service와 ServiceAccount을 함께 생성해야합니다.

이렇게 생성한 ServiceAccount는 Kubernetes Cluster내에서 Pod 생성/관리하는데 사용되며 JNLP(Java Network Launching Protocol)는 Master와 Slave 통신을 위해 사용됩니다. 

Jenkins Tunnel 옵션은 k8s 설정기준으로 jenkins-jnlp-svc:50000이됩니다.

 

 

 

 

 

Jenkins - Github 조직 하위에 존재하는 Repository 연동

github branch source 플러그인을 이용하면 Github 조직 하위에 존재하는 Repository을 연동할 수 있습니다.

Jenkins 페이지에 접속한 후 새로운 Item 버튼 - 그룹핑한 이름을 기입한 후 Organization Folder 클릭합니다.

API endpoint을 기입한 후 Credentials을 통해 인증을 완료합니다. 현재는 ID/Password을 이용한 새로운 Credentials을 생성하여 사용했습니다.

Owner영역은 Github의 조직이름입니다.

 

 

 

스크롤을 밑으로 내리면 Pipeline jenkinsfile 부분이 있습니다. 이옵션은 Github Repository에 선언한 파일이름이 매칭되면 Repository을 연동 / 활용한다는 의미입니다.

현재는 Jenkinsfile-k8s으로 지정되어 있으니 이파일이 포함된 Repository만 로딩하게됩니다.

 

 

빌드 실패시 Rebuild을 위하여 GIthub에 comment에 명령어?와 비슷한 Action을 할때가 있습니다.

이기능을 활용하기 위해서는 GitHub PR Comment Build Plugin 플러그인 설치 후 Github → Settings → Hooks → Webhooks을 등록해야합니다. 이때 꼭 Issue comments 옵션은 선택해야합니다.

이후 정규식 패턴으로 어떤 Comment을 등록할지 설정합니다.

 

 

Jenkinsfile 생성

pipeline을 이용하여 사용할 Agent container을 선언한 후 stage을 설정하는 방법입니다.

agent 부분은 kubernetes로 선언하고 사용할 docker image(gradle)을 이용해 container을 생성합니다.

이후 stage / step에서 위에서 선언한 container을 기입하여 스크립트를 작성하면 됩니다.

 

 

pipeline {
    agent {
        kubernetes {
            label "jenkins-agent"
            cloud "kubernetes"
            yaml '''
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  labels:
    job: jenkins-agent
spec:
  containers:
  - name: gradle-container
    image: gradle:7.4.2-jdk11
    imagePullPolicy: IfNotPresent
    tty: true
    command: ['cat']
    resources:
    requests:
      cpu: 2000m
      memory: 1Gi
    limits:
      cpu: 2000m
      memory: 1Gi
'''
        }
    }
    stages {
        stage("jenkins-agent") {
            steps {
                container("gradle-container") {
                    checkout scm
                    sh 'cd $WORKSPACE'
                    sh 'rm gradle.properties'
                    sh 'mv jenkins.gradle.properties gradle.properties'
                    sh './gradlew clean check --continue'
                    sh './gradlew test '
                }
            }
        }
    }
 
    post {
      failure {
        publishHTML allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: "", reportFiles: "**/index.html", reportName: "Test Report"
      }
    }
}

 

 

 

 

대부분의 설정 정보를 제거하니 이해하는데 어려움이 있을것 같네요.🙈

참고 : https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.10/html/images/images-other-jenkins-kubernetes-plugin_images-other-jenkins

'DEVELOPE > DevOps' 카테고리의 다른 글

JDBC Flow (HikariCP, hibernate, JPA, DataSource)  (0) 2023.01.30
kubernetes 동작  (0) 2021.06.20

댓글