반응형
Pod Template 관리
- jenkins 관리 > Clouds > kubenetes > Pod Templates
- default or Add a pod template
- pod template 선택 > Add Container > container 추가 > 저장
Pipeline 형식
- pipeline: 우선 가장 먼저 pipeline을 선언, pipeline은 최상위 레벨이 되어야하며 { }으로 정의해야 한다.
pipeline {
/* insert Declarative Pipeline here */
}
pipeline은 Section, Directives, Steps 또는 assignment 문으로만 구성되야 한다.
- section
- agent: agent를 추가할 경우에 사용 (any, none, label, node, docker, dockerfile, kubernetes)
#예시: kubernetes
agent {
kubernetes {
label 'default'
defaultContainer 'jnlp'
}
}
#예시: docker
agent {
docker {
image 'myregistry.com/node'
label 'my-defined-label'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
#예시: dockerfile
agent {
dockerfile {
filename 'Dockerfile.build'
dir 'build'
label 'my-defined-label'
registryUrl 'https://myregistry.com/'
registryCredentialsId 'myPredefinedCredentialsInJenkins'
}
}
- 예시: agent가 각각 적용 된 JenkinsFile Sample
pipeline {
agent none # agent none이 pipeline의 최상위에 정의되어 있을 경우 stage는 각각 agent를 포함
stages {
stage('Example Build') {
agent { docker 'maven:3-alpine' } # maven:3-alpine의 이미지를 갖는 도커를 에이전트로 사용
steps {
echo 'Hello, Maven'
sh 'mvn --version'
}
}
stage('Example Test') {
agent { docker 'openjdk:8-jre' } # openjdk:8-jre의 이미지를 갖는 도커를 에이전트로 사용
steps {
echo 'Hello, JDK'
sh 'java -version'
}
}
}
}
- steps: stage 내부 block
# step: 할일 정의
stage('stage명') {
steps{
steps{
할 일
}
할 일
}
}
# parallel: 병렬 실행
stage {
parallel {
stage('Branch A') {
}
stage('Branch B') {
}
}
}
# post: 특정 stage나 pipeline이 시작되기 이전 또는 이후에 실행 될 confition block을 정의
post{
always {
echo '항상 실행되는 문'
}
changed {
}
failure{
}
success{
}
}
always, changed, fixed, regression, aborted, failure, success, unstable, unsuccessful,와 cleanup 등의 상태를 정의 가능
- Directives
# environment: 변수 정의
environment {
GIT_URL = "https://github.com/baeyuna97/K8S.git"
}
# tool: 자동설치나 Path에 추가할 도구
tool{
NodeJS 'Nodejs-bell'
}
# parameter: 파라미터 정의
# - 선언
parameters {
booleanParam(containername: 'hello', type: 'container')
}
# - 사용
script {
if (params.containername=='hello') {
echo 'test'
}
}
# options: pipeline의 옵션을 선택적으로 포함 가능
# - 예시: options가 적용 된 JenkinsFile Sample
pipeline {
agent any
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
}
- 옵션 종류
옵션 | 내용 |
---|---|
buildDiscarder | • 특정 수의 최근 파이프 라인 실행에 대한 아티팩트 및 콘솔 출력을 유지한다. |
• ex) options { buildDiscarder(logRotator(numToKeepStr: '1')) } | |
checkoutToSubdirectory | • 작업 공간의 서브 디렉토리에서 자동 소스 제어 체크 아웃을 수행한다. |
• ex) options { checkoutToSubdirectory('foo') } | |
disableConcurrentBuilds | • 파이프 라인의 동시 실행을 허용하지 않는다. 공유 리소스 등에 대한 동시 액세스를 방지하는 데 유용 할 수 있다. |
• ex) options { disableConcurrentBuilds() } | |
disableResume | • 마스터가 다시 시작되면 파이프 라인을 다시 시작하지 않게 도와준다. |
• ex) options { disableResume() } | |
newContainerPerStage | • 함께 사용 docker 또는 dockerfile로 지정된 경우 각 스테이지는 동일한 컨테이너 인스턴스에서 실행되는 모든 스테이지가 아니라 동일한 노드의 새 컨테이너 인스턴스에서 실행된다. |
overrideIndexTriggers | • 분기 인덱싱 트리거의 기본 처리를 재정의 할 수 있다. |
• 멀티 브랜치 또는 조직 레이블에서 분기 인덱싱 트리거가 비활성화 된 options { overrideIndexTriggers(true) } 경우에 대해서만 활성화된다. | |
• 그렇지 않으면 options { overrideIndexTriggers(false) }이 작업에 대해서만 분기 인덱싱 트리거를 비활성화한다. | |
preserveStashes | • 스테이지를 다시 시작할 때 사용할 수 있도록 완료된 빌드에서 숨김을 유지한다. |
• ex) options { preserveStashes() } | |
• 가장 최근에 완료된 빌드 options { preserveStashes(buildCount: 5) }에서 stash를 보존 하거나 가장 최근에 완료된 5 개의 빌드에서 stash를 보존하는 용도로 사용 | |
quietPeriod | • 파이프 라인에 대한 자동 기간을 초 단위로 설정하여 글로벌 기본값을 대체한다. |
• ex) options { quietPeriod(30) } | |
retry | • 실패하면 전체 파이프 라인을 지정된 횟수만큼 재 시도한다. |
• ex) options { retry(3) } | |
skipDefaultCheckout | • agent 지시문에서 기본적으로 소스 제어에서 코드 체크 아웃을 건너 뛴다. |
• ex) options { skipDefaultCheckout() } | |
skipStagesAfterUnstable | • 빌드 상태가 불안정 해지면 단계를 건너 뛴다. |
• ex) options { skipStagesAfterUnstable() } | |
timeout | • Jenkins가 파이프 라인을 중단한 후 파이프 라인 실행에 대한 제한 시간을 설정한다. |
• ex) options { timeout(time: 1, unit: 'HOURS') } | |
timestamps | • 파이프라인 실행에서 생성된 모든 콘솔 출력 앞에 라인이 생성 된 시간을 추가한다. |
• ex) options { timestamps() } | |
parallelsAlwaysFailFast | • 파이프 라인의 모든 후속 병렬 단계에 대해 failfast를 true로 설정한다. |
• ex) options { parallelsAlwaysFailFast() } |
|
- 조건문 | |
- when, steps |
# when, steps
when {
조건문
}
steps {
조건이 맞으면 실행할 내용
}
# if
script { // if문 쓰기 위해 선언
if (조건문) {
조건이 맞으면 실행할 내용
}
}
샘플 형식
pipeline {
agent {
kubernetes {
label 'jenkins-jenkins-agent'
defaultContainer 'jnlp'
}
}
parameters {
string(name: '', defaultValue: '', description: '')
}
environment {
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
DEV_KUBECONFIG_CREDENTIAL_ID = 'host'
REGISTRY = 'harbor.kk.example.com:30443/library'
DOCKERHUB_NAMESPACE = 'platform'
APP_NAME = 'devops-maven-sample'
SONAR_CREDENTIAL_ID = 'sonar-token'
TAG_NAME = "SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER"
}
stages {
stage('checkout') {
steps {
container('maven393-java17') {
sh 'export GIT_SSL_NO_VERIFY=0'
git branch: 'master', url: 'https://github.com/kubesphere/devops-maven-sample.git'
}
}
}
stage('unit test') {
steps {
container('maven393-java17') {
sh 'mvn clean test'
}
}
}
stage('sonarqube analysis') {
steps {
container('maven') {
withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
withSonarQubeEnv('sonar') {
sh "mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN -Dsonar.projectKey=java-demo -Dsonar.host.url=http://sonar.kk.example.com:30080"
}
}
}
}
}
stage('build & push') {
steps {
container('maven') {
sh 'mvn -Dmaven.test.skip=true clean package'
sh 'podman build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME', credentialsId: "$DOCKER_CREDENTIAL_ID",)]) {
sh 'echo "${DOCKER_PASSWORD}" | podman login $REGISTRY -u "${DOCKER_USERNAME}" --password-stdin --tls-verify=false'
sh 'podman push --tls-verify=false $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
}
}
}
}
stage('push latest') {
steps {
container('maven') {
sh 'podman tag $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
sh 'podman push --tls-verify=false $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest '
}
}
}
stage('deploy to dev') {
steps {
container('maven') {
withCredentials([
kubeconfigFile(credentialsId: env.DEV_KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')
]) {
sh 'envsubst < deploy/dev-all-in-one/devops-sample.yaml | kubectl apply -f -'
}
}
}
}
stage('deploy to staging') {
steps {
container('maven') {
input(id: 'deploy-to-staging', message: 'deploy to staging?')
withCredentials([
kubeconfigFile(credentialsId: env.DEV_KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')
]) {
sh 'envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -'
}
}
}
}
stage('deploy to production') {
steps {
container('maven') {
input(id: 'deploy-to-production', message: 'deploy to production?')
withCredentials([
kubeconfigFile(credentialsId: env.DEV_KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')
]) {
sh 'envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -'
}
}
}
}
}
}
반응형
'미들웨어' 카테고리의 다른 글
nexus repository 연동 (Maven) (1) | 2024.12.08 |
---|---|
Docker Image 폐쇄망 옮기기 (0) | 2024.11.30 |