목차
1. Dockerizing (도커라이징)
pipeline {
agent any
environment {
SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
SOURCE_CODE_URL = 'https://github.com/jei0486/demo-fe'
RELEASE_BRANCH = 'main'
REGISTRY = 'jei0486/demo-fe'
}
stages {
stage('init') {
steps {
echo 'init'
echo "Current workspace : ${workspace}"
}
}
stage('clone') {
steps {
echo 'clone'
git url: "$SOURCE_CODE_URL",
branch: "$RELEASE_BRANCH",
credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
sh "ls -al"
}
}
stage('build') {
steps {
sh 'pwd'
sh '''
chmod +x gradlew
./gradlew clean bootJar
'''
}
}
stage('dockerizing'){
steps{
sh '''
pwd
docker image build -f Dockerfile -t $REGISTRY:${TAG} .
'''
}
}
stage('Deploy docker image') {
steps {
withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
sh 'docker push $REGISTRY:${TAG}'
}
}
}
}
post {
always {
cleanWs()
}
}
}
Dockerfile
FROM openjdk:11.0.11-jre-slim
EXPOSE 9099
RUN mkdir /app
COPY ./build/libs/*-SNAPSHOT.jar ./app/application.jar
ENTRYPOINT ["java","-jar","/app/application.jar"]
2. jib
2.1. Jenkinsfile
pipeline {
agent any
environment {
SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
SOURCE_CODE_URL = 'https://github.com/jei0486/demo-api'
RELEASE_BRANCH = 'main'
REGISTRY = 'jei0486/demo-api'
}
stages {
stage('init') {
steps {
echo 'init'
echo "Current workspace : ${workspace}"
}
}
stage('clone') {
steps {
echo 'clone'
git url: "$SOURCE_CODE_URL",
branch: "$RELEASE_BRANCH",
credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
sh 'ls'
}
}
stage('Gradle Build') {
steps {
echo 'build'
sh '''
chmod +x gradlew
./gradlew clean bootJar
'''
}
}
stage('Publish-release') {
steps {
withDockerRegistry([ credentialsId: 'dockerhub', url: '']) {
sh '''
./gradlew jib -Ddocker.repo.username=$USERNAME -Ddocker.repo.password=$PASSWORD
'''
}
}
}
}
post {
always {
cleanWs()
}
}
}
2.2. Jenkins credential 추가
Name : docker.repo / Credential type : Username with password
2.3. jib 관련 설정
https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#war-projects
GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.
🏗 Build container images for your Java applications. - GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.
github.com
2.3.1. build.gradle 추가 (gradle 일 경우)
jib {
from {
image='openjdk:11.0.14.1-jre'
}
to {
image='jei0486/demo-api'
def imageTag = System.getenv('TAG') ?: 'v1'
tags=[imageTag]
}
container {
creationTime='USE_CURRENT_TIMESTAMP'
format='OCI'
}
extraDirectories {
paths {
path {
from = file('build/libs')
}
}
}
}
2.3.2. pom.xml 추가 (maven 일 경우)
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<from>
<image>openjdk:11.0.14.1-jre</image>
</from>
<to>
<image>registry.hub.docker.com/jei0486/demo-api</image>
</to>
<container>
<creationTime>USE_CURRENT_TIMESTAMP</creationTime>
<format>OCI</format>
</container>
</configuration>
</plugin>
3. Skaffold
pipeline {
agent any
environment {
PATH = "$PATH:/usr/local/bin/" // skaffold, gradle path
SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
SOURCE_CODE_URL = 'https://github.com/jei0486/demo-scg'
RELEASE_BRANCH = 'main'
REGISTRY = 'jei0486/demo-scg'
}
stages {
stage('init') {
steps {
echo 'init'
echo "Current workspace : ${workspace}"
}
}
stage('clone') {
steps {
echo 'clone'
git url: "$SOURCE_CODE_URL",
branch: "$RELEASE_BRANCH",
credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
sh 'ls -al'
}
}
stage('Build') {
steps {
withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
sh "skaffold build -p dev -t ${TAG}"
}
}
}
}
post {
always {
cleanWs()
}
}
}
4. Skaffold + GitOps + Branch
pipeline {
agent any
environment {
PATH = "$PATH:/usr/local/bin/" // skaffold , argocd path
SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
SOURCE_CODE_URL = 'https://github.com/jei0486/demo-scg'
RELEASE_BRANCH = 'main'
GIT_OPS_URL = 'github.com/jei0486/demo-gitops.git'
GIT_OPS_BRANCH = 'main'
REGISTRY = 'jei0486/demo-scg'
}
stages {
stage('init') {
steps {
echo 'init'
echo "Current workspace : ${workspace}"
}
}
stage('checkout') {
steps {
echo 'checkout'
checkout scm: [
$class: "GitSCM",
userRemoteConfigs: [[url: "$SOURCE_CODE_URL",
credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID" ]],
branches: [[name: "refs/tags/${TAG}"]]],
poll: false
}
}
stage('Build') {
steps {
sh """
chmod +x gradlew
./gradlew clean bootJar -Dspring.profiles.active=dev
"""
}
}
stage('Skaffold') {
steps {
withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
sh "skaffold build -p dev -t ${TAG}"
}
}
}
stage('workspace clear'){
steps {
cleanWs()
}
}
stage('GitOps Update') {
steps {
print "GitOps Update"
withCredentials([string(credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID", variable: 'SECRET')]) {
//set SECRET with the credential content
git url: "https://$GIT_OPS_URL",
branch: "$GIT_OPS_BRANCH",
credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
sh '''
ls -la
cd ./demo-scg/rolling-update
kustomize edit set image jei0486/demo-scg:${TAG}
git config user.email "jei0486@gmail.com"
git config user.name "jei0486"
git add .
git commit -am "update image tag ${TAG}"
git remote set-url --push origin https://${SECRET}@$GIT_OPS_URL
git push origin $GIT_OPS_BRANCH
'''
}
}
}
}
post {
always {
cleanWs()
}
}
}
5. Skaffold + GitOps + CustomVersionTag
def customVersion = "P" + env.BUILD_NUMBER
pipeline {
agent any
environment {
PATH = "$PATH:/usr/local/bin/" // skaffold , argocd path
SOURCECODE_JENKINS_CREDENTIAL_ID = 'jei0486'
SOURCE_CODE_URL = 'https://github.com/jei0486/demo-scg'
RELEASE_BRANCH = 'main'
GIT_OPS_URL = 'github.com/jei0486/demo-gitops.git'
GIT_OPS_BRANCH = 'main'
REGISTRY = 'jei0486/demo-scg'
}
stages {
stage('init') {
steps {
echo 'init'
echo "Current workspace : ${workspace}"
echo "Build Number: ${env:BUILD_NUMBER}"
echo "customVersion: ${customVersion}"
}
}
stage('clone') {
steps {
echo 'clone'
git url: "$SOURCE_CODE_URL",
branch: "$RELEASE_BRANCH",
credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
sh "ls -al"
}
}
stage('Build') {
steps {
sh """
chmod +x gradlew
./gradlew clean bootJar -Dspring.profiles.active=dev
"""
}
}
stage('Skaffold') {
steps {
withDockerRegistry([ credentialsId: 'dockerhub', url: '' ]) {
sh "skaffold build -p dev -t ${customVersion}"
}
}
}
stage('workspace clear'){
steps {
cleanWs()
}
}
stage('GitOps Update') {
steps {
print "GitOps Update"
withCredentials([string(credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID", variable: 'SECRET')]) { //set SECRET with the credential content
git url: "https://$GIT_OPS_URL",
branch: "$GIT_OPS_BRANCH",
credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID"
sh """
ls -la
cd ./demo-scg/blue-green
kustomize edit set image jei0486/demo-scg:${customVersion}
git config user.email "jei0486@gmail.com"
git config user.name "jei0486"
git add .
git commit -am 'update image tag ${customVersion}'
git remote set-url --push origin https://${SECRET}@$GIT_OPS_URL
git push origin $GIT_OPS_BRANCH
"""
}
}
}
}
post {
always {
cleanWs()
}
}
}
'DevOps, Infra' 카테고리의 다른 글
[ArgoCD] ArgoCD Install (0) | 2022.12.28 |
---|---|
[Jenkins] 빌드 자동화 - webhook (0) | 2022.12.28 |
[Jenkins] 빌드 자동화 - polling (0) | 2022.12.27 |
[Jenkins] 플러그인 설치 및 준비 (0) | 2022.12.27 |
Git 브랜치 전략 3가지 (0) | 2022.12.27 |