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"
}
}
}
대부분의 설정 정보를 제거하니 이해하는데 어려움이 있을것 같네요.🙈
'DEVELOPE > DevOps' 카테고리의 다른 글
JDBC Flow (HikariCP, hibernate, JPA, DataSource) (0) | 2023.01.30 |
---|---|
kubernetes 동작 (0) | 2021.06.20 |
댓글