pipeline {
options {
timeout(time:30, unit: 'MINUTES')
buildDiscarder logRotator(numToKeepStr: '1')
}
parameters {
string(name: 'app_git_url', defaultValue: 'http://techdoc.oa.com/devops/hcboard.git', description: '' )
string(name: 'app_git_branch', defaultValue: 'master', description: '' )
string(name: 'app_dir', defaultValue: '/', description: '' )
string(name: 'app_name', defaultValue: 'hcboard', description: '' )
string(name: 'target_dir', defaultValue: '/target', description: '' )
string(name: 'image_name', defaultValue: 'harbor-test.hzins.com/devops/hcboard:latest', description: '' )
string(name: 'limit_cpu', defaultValue: '2000m', description: '' )
string(name: 'limit_memory', defaultValue: '2048Mi', description: '' )
string(name: 'app_replicas', defaultValue: '1', description: '' )
string(name: 'jvm_args', defaultValue: '-server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Dfile.encoding=utf-8 -Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom', description: '' )
string(name: 'env_vars', defaultValue: 'key1=value1,key2=value2,key3=value3', description: '' )
string(name: 'gitlab_key', defaultValue: 'gitlab-key', description: '' )
string(name: 'apollo_env', defaultValue: 'DEV', description: '' )
string(name: 'environment', defaultValue: 'DEV', description: '' )
string(name: 'namespace', defaultValue: 'ops-dev', description: '' )
}
agent {
kubernetes {
label "jnlp-slave_${JOB_NAME}_${BUILD_ID}"
defaultContainer 'jnlp'
yaml """
apiVersion: v1
kind: Pod
metadata:
labels:
some-label: some-label-value
spec:
nodeSelector:
node: public
containers:
- name: jnlp
image: harbor-test.hzins.com/public/jnlp-slave:alpine
args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)']
- name: maven
image: harbor-test.hzins.com/public/base-centos7-jdk1.8.0_201-nodejs-mvn
imagePullPolicy: IfNotPresent
command:
- cat
tty: true
volumeMounts:
- name: mvn
mountPath: /root/.m2/repository
- name: docker
image: harbor-test.hzins.com/public/docker:18.09-dind
imagePullPolicy: IfNotPresent
command:
- cat
tty: true
volumeMounts:
- name: mvn
mountPath: /root/.m2/repository
- name: docker-sock
mountPath: /var/run/docker.sock
- name: host-time
mountPath: /etc/localtime
- name: helm-kubectl
image: harbor-test.hzins.com/public/alpine-helm-kubectl
imagePullPolicy: IfNotPresent
command:
- cat
tty: true
volumeMounts:
- name: mvn
mountPath: /root/.m2/repository
volumes:
- name: mvn
nfs:
path: /mvn-repo
server: 172.20.0.110
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: host-time
hostPath:
path: /etc/localtime
"""
}
}
environment {
git_ver = "${app_git_branch}"
}
stages {
stage('git scm pull') {
steps {
git branch: "${app_git_branch}", credentialsId: "${gitlab_key}", url: "${app_git_url}"
}
}
stage('Build project') {
steps {
container('maven') {
sh '''
cd .${app_dir}
mvn clean install -Dmaven.test.skip=true;
cd -
rm -f ./${target_dir}/${app_name}*sources.jar
'''
}
}
}
stage('Docker-build') {
steps {
container('docker') {
withDockerRegistry(credentialsId: 'registry', url: 'http://harbor-test.hzins.com') {
// 生成Dockerfile
sh '''
echo 'FROM harbor-test.hzins.com/public/base-centos7-jdk1.8.0_201' > .${app_dir}/Dockerfile
echo 'MAINTAINER admin' >> .${app_dir}/Dockerfile
echo "WORKDIR /home/deploy/" >> .${app_dir}/Dockerfile
echo "ADD .${target_dir}/${app_name}*.jar ./app.jar" >> .${app_dir}/Dockerfile
echo 'CMD java $JAVA_MEM_OPTS -Dserver.port=9090 -Denv=$APOLLO_ENV -Dapollo.meta=$APOLLO_META -jar app.jar' >> .${app_dir}/Dockerfile
'''
// 构建并推送镜像
sh '''
docker build --no-cache -t ${image_name} -f .${app_dir}/Dockerfile .
docker push ${image_name}
'''
}
}
}
}
stage('Deploy-app') {
steps {
container('helm-kubectl') {
// 准备k8s认证信息
sh '''
mkdir -p /root/.kube/; cp -rf /root/.m2/repository/kubeconfig/ci-config /root/.kube/config
kubectl config use-context kubernetes-dev
'''
// 生成yaml文件
sh '''
#动态生成helm配置和模板文件
mkdir -p ${namespace}/templates
echo "name: ${namespace}" >${namespace}/Chart.yaml
echo "version: 1.0.0" >>${namespace}/Chart.yaml
cp /root/.m2/repository/kubeconfig/ci-apollo_env_template.yaml ${namespace}/templates
cd ${namespace}
mkdir -p ${app_name}
#初始化yaml
helm install . --dry-run --debug \
--set appname=${app_name} \
--set replicas=${app_replicas} \
--set image.repository=${image_name} \
--set resources.requests.cpu="${limit_cpu}" \
--set resources.requests.memory="${limit_memory}" \
--set resources.limits.cpu="${limit_cpu}" \
--set resources.limits.memory="${limit_memory}" \
--set APOLLO.ENV="${apollo_env}" \
--set APOLLO.META='http://apollo-meta.ha.com' \
--set JAVA_MEM_OPTS="${jvm_args}" \
--set envs.key1='value1' \
--set envs.key2='value2' \
--set envs.key3='value3' \
| grep -A 1000 'apiVersion' > ${app_name}/${app_name}.yaml
cat ${app_name}/${app_name}.yaml
#复制生成后的yaml至nfs主机目录保存,供后绪手动操作
cp -rf ../${namespace} /root/.m2/repository/k8s-yaml-config/
'''
// 部署到K8S
sh '''
set +e
kubectl -n ${namespace} apply -f ${namespace}/${app_name}/
kubectl get pod,svc -n ${namespace} -o wide
'''
}
}
}
}
}