1. pipeline {
    2. options {
    3. timeout(time:30, unit: 'MINUTES')
    4. buildDiscarder logRotator(numToKeepStr: '1')
    5. }
    6. parameters {
    7. string(name: 'app_git_url', defaultValue: 'http://techdoc.oa.com/devops/hcboard.git', description: '' )
    8. string(name: 'app_git_branch', defaultValue: 'master', description: '' )
    9. string(name: 'app_dir', defaultValue: '/', description: '' )
    10. string(name: 'app_name', defaultValue: 'hcboard', description: '' )
    11. string(name: 'target_dir', defaultValue: '/target', description: '' )
    12. string(name: 'image_name', defaultValue: 'harbor-test.hzins.com/devops/hcboard:latest', description: '' )
    13. string(name: 'limit_cpu', defaultValue: '2000m', description: '' )
    14. string(name: 'limit_memory', defaultValue: '2048Mi', description: '' )
    15. string(name: 'app_replicas', defaultValue: '1', description: '' )
    16. 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: '' )
    17. string(name: 'env_vars', defaultValue: 'key1=value1,key2=value2,key3=value3', description: '' )
    18. string(name: 'gitlab_key', defaultValue: 'gitlab-key', description: '' )
    19. string(name: 'apollo_env', defaultValue: 'DEV', description: '' )
    20. string(name: 'environment', defaultValue: 'DEV', description: '' )
    21. string(name: 'namespace', defaultValue: 'ops-dev', description: '' )
    22. }
    23. agent {
    24. kubernetes {
    25. label "jnlp-slave_${JOB_NAME}_${BUILD_ID}"
    26. defaultContainer 'jnlp'
    27. yaml """
    28. apiVersion: v1
    29. kind: Pod
    30. metadata:
    31. labels:
    32. some-label: some-label-value
    33. spec:
    34. nodeSelector:
    35. node: public
    36. containers:
    37. - name: jnlp
    38. image: harbor-test.hzins.com/public/jnlp-slave:alpine
    39. args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)']
    40. - name: maven
    41. image: harbor-test.hzins.com/public/base-centos7-jdk1.8.0_201-nodejs-mvn
    42. imagePullPolicy: IfNotPresent
    43. command:
    44. - cat
    45. tty: true
    46. volumeMounts:
    47. - name: mvn
    48. mountPath: /root/.m2/repository
    49. - name: docker
    50. image: harbor-test.hzins.com/public/docker:18.09-dind
    51. imagePullPolicy: IfNotPresent
    52. command:
    53. - cat
    54. tty: true
    55. volumeMounts:
    56. - name: mvn
    57. mountPath: /root/.m2/repository
    58. - name: docker-sock
    59. mountPath: /var/run/docker.sock
    60. - name: host-time
    61. mountPath: /etc/localtime
    62. - name: helm-kubectl
    63. image: harbor-test.hzins.com/public/alpine-helm-kubectl
    64. imagePullPolicy: IfNotPresent
    65. command:
    66. - cat
    67. tty: true
    68. volumeMounts:
    69. - name: mvn
    70. mountPath: /root/.m2/repository
    71. volumes:
    72. - name: mvn
    73. nfs:
    74. path: /mvn-repo
    75. server: 172.20.0.110
    76. - name: docker-sock
    77. hostPath:
    78. path: /var/run/docker.sock
    79. - name: host-time
    80. hostPath:
    81. path: /etc/localtime
    82. """
    83. }
    84. }
    85. environment {
    86. git_ver = "${app_git_branch}"
    87. }
    88. stages {
    89. stage('git scm pull') {
    90. steps {
    91. git branch: "${app_git_branch}", credentialsId: "${gitlab_key}", url: "${app_git_url}"
    92. }
    93. }
    94. stage('Build project') {
    95. steps {
    96. container('maven') {
    97. sh '''
    98. cd .${app_dir}
    99. mvn clean install -Dmaven.test.skip=true;
    100. cd -
    101. rm -f ./${target_dir}/${app_name}*sources.jar
    102. '''
    103. }
    104. }
    105. }
    106. stage('Docker-build') {
    107. steps {
    108. container('docker') {
    109. withDockerRegistry(credentialsId: 'registry', url: 'http://harbor-test.hzins.com') {
    110. // 生成Dockerfile
    111. sh '''
    112. echo 'FROM harbor-test.hzins.com/public/base-centos7-jdk1.8.0_201' > .${app_dir}/Dockerfile
    113. echo 'MAINTAINER admin' >> .${app_dir}/Dockerfile
    114. echo "WORKDIR /home/deploy/" >> .${app_dir}/Dockerfile
    115. echo "ADD .${target_dir}/${app_name}*.jar ./app.jar" >> .${app_dir}/Dockerfile
    116. echo 'CMD java $JAVA_MEM_OPTS -Dserver.port=9090 -Denv=$APOLLO_ENV -Dapollo.meta=$APOLLO_META -jar app.jar' >> .${app_dir}/Dockerfile
    117. '''
    118. // 构建并推送镜像
    119. sh '''
    120. docker build --no-cache -t ${image_name} -f .${app_dir}/Dockerfile .
    121. docker push ${image_name}
    122. '''
    123. }
    124. }
    125. }
    126. }
    127. stage('Deploy-app') {
    128. steps {
    129. container('helm-kubectl') {
    130. // 准备k8s认证信息
    131. sh '''
    132. mkdir -p /root/.kube/; cp -rf /root/.m2/repository/kubeconfig/ci-config /root/.kube/config
    133. kubectl config use-context kubernetes-dev
    134. '''
    135. // 生成yaml文件
    136. sh '''
    137. #动态生成helm配置和模板文件
    138. mkdir -p ${namespace}/templates
    139. echo "name: ${namespace}" >${namespace}/Chart.yaml
    140. echo "version: 1.0.0" >>${namespace}/Chart.yaml
    141. cp /root/.m2/repository/kubeconfig/ci-apollo_env_template.yaml ${namespace}/templates
    142. cd ${namespace}
    143. mkdir -p ${app_name}
    144. #初始化yaml
    145. helm install . --dry-run --debug \
    146. --set appname=${app_name} \
    147. --set replicas=${app_replicas} \
    148. --set image.repository=${image_name} \
    149. --set resources.requests.cpu="${limit_cpu}" \
    150. --set resources.requests.memory="${limit_memory}" \
    151. --set resources.limits.cpu="${limit_cpu}" \
    152. --set resources.limits.memory="${limit_memory}" \
    153. --set APOLLO.ENV="${apollo_env}" \
    154. --set APOLLO.META='http://apollo-meta.ha.com' \
    155. --set JAVA_MEM_OPTS="${jvm_args}" \
    156. --set envs.key1='value1' \
    157. --set envs.key2='value2' \
    158. --set envs.key3='value3' \
    159. | grep -A 1000 'apiVersion' > ${app_name}/${app_name}.yaml
    160. cat ${app_name}/${app_name}.yaml
    161. #复制生成后的yaml至nfs主机目录保存,供后绪手动操作
    162. cp -rf ../${namespace} /root/.m2/repository/k8s-yaml-config/
    163. '''
    164. // 部署到K8S
    165. sh '''
    166. set +e
    167. kubectl -n ${namespace} apply -f ${namespace}/${app_name}/
    168. kubectl get pod,svc -n ${namespace} -o wide
    169. '''
    170. }
    171. }
    172. }
    173. }
    174. }