从Jenkinsfile构建到k8s部署

Jenkinsfile

groovy 复制代码
def registry = "harbor.uat.testtest.com.cn"
def project = "uat"
def app_name = "springcloud-eureka-api"
def jenkins_slave_image = "${registry}/uat/jenkins-slave-maven-centos7:v1"
def image_name = "${registry}/${project}/${app_name}:${BUILD_NUMBER}"
def git_address = "http://gitlab.gic.testtest.com.cn/springcloud-framework/springcloud-eureka.git"
def docker_registry_auth = "harbor"
def git_auth = "gitlab-gic"
def k8s_auth = "kube-config-rancher"
def k8s_cloud_name = "rancher"
def eureka_access = 'defaultZone: http://${eureka.host1}:8010/eureka/,http://${eureka.host2}:8010/eureka/'
def jar_name = 'springcloud-eureka.jar'
def label_name = "jenkins-slave-${app_name}"

podTemplate(label: "$label_name", cloud: "$k8s_cloud_name", containers: [
    containerTemplate(
        name: 'jnlp',
        image: "${jenkins_slave_image}"
    ),
  ],
  volumes: [
    hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
    hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
    hostPathVolume(mountPath: '/home/jenkins/.m2', hostPath: '/root/.m2'),
    hostPathVolume(mountPath: '/home/jenkins/dockerfile-yaml', hostPath: '/dockerfile_yaml')
  ],
)
{
  node("$label_name"){
      stage('拉取代码'){
         //checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
         git branch: "$Branch",credentialsId: "$git_auth", url: "$git_address"
         //sh """
         //rm -rf Jenkinsfile
         //mv Dockerfile /home/jenkins/
         //mv deploy.yaml /home/jenkins/
         //"""
      }
      stage('代码编译'){
          //sh "/opt/rh/rh-maven33/root/usr/bin/mvn clean package -Dmaven.test.skip=true"
		  sh """
		  echo "root@123" |su root -c "chown default.root /home/jenkins -R"
		  sed -i 's#defaultZone.*#${eureka_access}#g' src/main/resources/application.yml
		  sed -i 's#file: logs#file: /logs#g' src/main/resources/application.yml
		  /opt/rh/rh-maven33/root/usr/bin/mvn clean install -DskipTests
          echo build
		  """
      }
      stage('构建镜像'){
          //harbor登录
          withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
            sh """
              echo "root@123" |su root -c "chmod 666 /var/run/docker.sock"
			  mv target/$jar_name ./
              cp /home/jenkins/dockerfile-yaml/Dockerfile ./
			  sed -i 's#springcloud.jar#${jar_name}#g' Dockerfile
              docker build -t ${image_name} ./
              docker login -u ${username} -p '${password}' '${registry}'
              docker push ${image_name}
            """
            }
      }
      stage('部署到K8S平台'){
        //sh "sleep 3600"
        //kubernetesDeploy configs: 'deploy.yaml', kubeconfigId: "${k8s_auth}"
		//sh "mkdir /home/jenkins/.kube/"
        //sh "echo '${k8s_auth}' >/home/jenkins/.kube/config"
        sh """
        cp /home/jenkins/dockerfile-yaml/${app_name}/${project}/${app_name}1.yaml ./
        sed -i 's#\$IMAGE_NAME#${image_name}#g' ${app_name}1.yaml
        sed -i 's#\$APP_NAME#${app_name}#g' ${app_name}1.yaml
		sed -i 's#namespace: sit#namespace: ${project}#g' ${app_name}1.yaml
		cp ${app_name}1.yaml /home/jenkins/dockerfile-yaml/nacos/${project}/
		cp /home/jenkins/dockerfile-yaml/${app_name}/${project}/${app_name}2.yaml ./
        sed -i 's#\$IMAGE_NAME#${image_name}#g' ${app_name}2.yaml
        sed -i 's#\$APP_NAME#${app_name}#g' ${app_name}2.yaml
		sed -i 's#namespace: sit#namespace: ${project}#g' ${app_name}2.yaml
		cp ${app_name}2.yaml /home/jenkins/dockerfile-yaml/nacos/${project}/
        """
        //sh "kubectl apply -f /home/jenkins/dockerfile-yaml/${app_name}/${app_name}.yaml"
        kubernetesDeploy configs: "${app_name}1.yaml", kubeconfigId: "${k8s_auth}"
		kubernetesDeploy configs: "${app_name}2.yaml", kubeconfigId: "${k8s_auth}"
      }
  }
}

Dockerfile

bash 复制代码
FROM harbor.uat.testtest.com.cn/uat/java:8-jdk-alpine
COPY springcloud.jar /
ENTRYPOINT ["java","-Xms512m","-Xmx1024m","-jar","/springcloud.jar","eureka.host1=$EUREKA_HOST1","eureka.host2=$EUREKA_HOST2"]

yaml

springcloud-eureka-api1.yaml

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: $APP_NAME-u1
  namespace: sit
spec:
  selector:
    appname: $APP_NAME1
  clusterIP: None
  ports:
  - port: 8010
    targetPort: 8010
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: $APP_NAME1
  namespace: sit
spec:
  selector:
    matchLabels:
      appname: $APP_NAME1
  template:
    metadata:
      labels:
        appname: $APP_NAME1
        app: $APP_NAME
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - $APP_NAME
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: $APP_NAME1
        image: $IMAGE_NAME
        env:
        - name: EUREKA_HOST1
          value: user:password123@springcloud-eureka-api-u1
        - name: EUREKA_HOST2
          value: user:password123@springcloud-eureka-api-u2

springcloud-eureka-api2.yaml

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: $APP_NAME-u2
  namespace: sit
spec:
  selector:
    appname: $APP_NAME2
  clusterIP: None
  ports:
  - port: 8010
    targetPort: 8010
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: $APP_NAME2
  namespace: sit
spec:
  selector:
    matchLabels:
      appname: $APP_NAME2
  template:
    metadata:
      labels:
        appname: $APP_NAME2
        app: $APP_NAME
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - $APP_NAME
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: $APP_NAME2
        image: $IMAGE_NAME
        env:
        - name: EUREKA_HOST1
          value: user:password123@springcloud-eureka-api-u1
        - name: EUREKA_HOST2
          value: user:password123@springcloud-eureka-api-u2
相关推荐
奥尔特星云大使7 小时前
《系统规划与管理师教程(第2版)》方法篇 第10章 云原生系统规划 知识点总结
云原生·软考·高级·系规
熙客8 小时前
Kubernetes是如何保证有状态应用数据安全和快速恢复的
mysql·云原生·容器·kubernetes
pursue.dreams9 小时前
Ubuntu安装Jenkins完整教程
linux·ubuntu·jenkins
城南花开时9 小时前
CICD工具,Jenkins or Tekton or Arbess一文全面对比评测
jenkins·tekton
非典型代码9 小时前
Jenkins发不出邮件
运维·servlet·jenkins
Wang's Blog9 小时前
Nestjs框架: 微服务项目工程结构优化与构建方案
微服务·云原生·架构·nestjs
似水流年 光阴已逝11 小时前
Kubernetes Pod 基本原理:全面详解
云原生·容器·kubernetes·pod
阿里云云原生11 小时前
评估工程正成为下一轮 Agent 演进的重点
云原生
高旭博14 小时前
10. kubernetes资源——statefulset有状态负载
云原生·容器·kubernetes
佐杰14 小时前
Jenkins安装部署
运维·servlet·jenkins