zoukankan      html  css  js  c++  java
  • KubeSphere:harbor+gitlab+nexus+springboot流水线部署

    预备环境:kubesphere-v3.0,harbor,gitlab,nexus(这些环境这里不介绍安装,我这里harbor,gitlab,nexus都是单独安装的,没有部署在k8s集群中)

    且kubesphere已经创建好企业空间和DevOps工程。

    环境介绍

    ip 端口 角色 软件
    192.168.1.36 k8s-master k8s-1.18相关,kubesphere-v.3.0
    192.168.1.37 k8s-node1 k8s-1.18相关,kubesphere-v.3.0
    192.168.1.38 k8s-node2 k8s-1.18相关,kubesphere-v.3.0
    192.168.1.50 82 代码仓库 gitlab-12.9.9
    192.168.1.52 85 镜像仓库 harbor-1.9.2
    192.168.1.48 8081 maven仓库 nexus3.30

    创建凭证

    创建Harbor凭证

    image-20210329160501918

    创建Gitlab凭证

    image-20210329215847270

    创建kubeconfig凭证

    image-20210329160816269

    导入项目

    在github中fork下来kubesphere官方提供的demo:https://github.com/kubesphere/devops-java-sample

    在github上生成个人token

    image-20210329161342711

    在自己的gitlab中导入github的token,然后填入自己的token

    image-20210329161539629

    导入刚才fork的项目到gitlab

    image-20210329161708737

    导入后,我们只需要master分支就行了。其他的分支全部删除。

    image-20210329172602835

    准备工作

    配置流水线

    创建流水线:我这里图省事,直接流水线取名叫dev

    image-20210329220227186

    流水线配置如下:

    image-20210329220315592

    image-20210329220342234

    上传java镜像到harbor

    docker pull java:openjdk-8-jre-alpine
    docker login -u admin -p Harbor12345 192.168.1.52:85
    docker tag java:openjdk-8-jre-alpine 192.168.1.52:85/library/java:openjdk-8-jre-alpine
    docker push 192.168.1.52:85/library/java:openjdk-8-jre-alpine
    

    修改Dockerfile

    修改Dockerfile-on-prem

    FROM 192.168.1.52:85/library/java:openjdk-8-jre-alpine
    WORKDIR /home
    COPY target/*.jar /home
    ENTRYPOINT java -jar *.jar
    

    设置命名空间

    修改文件:deploy/dev/devops-sample.yaml和deploy/dev/devops-sample-svc.yaml,把所有命名空间名称改为dev

    修改文件:deploy/prod/devops-sample.yaml和deploy/prod/devops-sample-svc.yaml,把所有命名空间名称改为dev-prod

    kubectl create namespace dev
    kubectl create namespace dev-prod
    

    修改Jenkinsfile

    pipeline {
      agent {
        node {
          label 'maven'
        }
      }
    
        parameters {
            string(name:'TAG_NAME',defaultValue: '',description:'')
        }
    
        environment {
            HARBOR_CREDENTIAL_ID = 'harbor-id'
            GITLAB_CREDENTIAL_ID = 'gitlab-id'
            KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
            REGISTRY = '192.168.1.52:85'
            HARBOR_NAMESPACE = 'library'
            GITLAB_ACCOUNT = 'root'
            APP_NAME = 'devops-java-sample'
        }
    
        stages {
            stage ('checkout scm') {
                steps {
                    checkout(scm)
                }
            }
    
            stage ('unit test') {
                steps {
                    container ('maven') {
                        sh 'mvn clean -gs `pwd`/configuration/settings.xml test'
                    }
                }
            }
    
            stage ('build & push') {
                steps {
                    container ('maven') {
                        sh 'mvn -Dmaven.test.skip=true -gs `pwd`/configuration/settings.xml clean package'
                        sh 'docker build -f Dockerfile-on-prem -t $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
                        withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$HARBOR_CREDENTIAL_ID" ,)]) {
                            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
                            sh 'docker push  $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
                        }
                    }
                }
            }
    
            stage('push latest'){
               when{
                 branch 'master'
               }
               steps{
                    container ('maven') {
                      sh 'docker tag  $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:latest '
                      sh 'docker push  $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:latest '
                    }
               }
            }
    
            stage('deploy to dev') {
              when{
                branch 'master'
              }
              steps {
                input(id: 'deploy-to-dev', message: 'deploy to dev?')
                kubernetesDeploy(configs: 'deploy/dev/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
              }
            }
            stage('push with tag'){
              when{
                expression{
                  return params.TAG_NAME =~ /v.*/
                }
              }
              steps {
                  container ('maven') {
                    input(id: 'release-image-with-tag', message: 'release image with tag?')
                      withCredentials([usernamePassword(credentialsId: "$GITLAB_CREDENTIAL_ID", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
                        sh 'git config --global user.email "kubesphere@yunify.com" '
                        sh 'git config --global user.name "kubesphere" '
                        sh 'git tag -a $TAG_NAME -m "$TAG_NAME" '
                        sh 'git push http://$GIT_USERNAME:$GIT_PASSWORD@192.168.1.50:82/$GITLAB_ACCOUNT/devops-java-sample.git --tags --ipv4'
                      }
                    sh 'docker tag  $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:$TAG_NAME '
                    sh 'docker push  $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:$TAG_NAME '
              }
              }
            }
            stage('deploy to production') {
              when{
                expression{
                  return params.TAG_NAME =~ /v.*/
                }
              }
              steps {
                input(id: 'deploy-to-production', message: 'deploy to production?')
                kubernetesDeploy(configs: 'deploy/prod/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
              }
            }
        }
    }
    
    

    修改maven配置文件

    configuration/settings.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
      <localRepository>${PWD}/artifacts/m2</localRepository>
      <pluginGroups>
      </pluginGroups>
      <proxies>
      </proxies>
      <servers>
        <server>
          <id>nexus</id>
          <username>admin</username>
          <password>1234</password>
        </server>
      </servers>
      <mirrors>
        <mirror>
          <id>nexus</id>
          <name>nexus repository</name>
          <url>http://192.168.1.48:8081/repository/group_repo/</url>
          <mirrorOf>central</mirrorOf>
        </mirror>
      </mirrors>
      <profiles>
        <profile>
          <id>jdk-1.8</id>
          <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
          </activation>
          <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
          </properties>
        </profile>
      </profiles>
    </settings>
    
    

    修改pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <!-- Spring Boot 启动父依赖 -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.13.RELEASE</version>
        </parent>
        <packaging>jar</packaging>
        <groupId>io.kubesphere.devops</groupId>
         <artifactId>devops-sample</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>devops-sample :: HelloWorld Demo</name>
          <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
          </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.13.1</version>
                </dependency>
            </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.8.2</version>
                    <configuration>
                    <append>true</append>
                    </configuration>
                    <executions>
                    <execution>
                        <id>agent-for-ut</id>
                        <goals>
                        <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>agent-for-it</id>
                        <goals>
                        <goal>prepare-agent-integration</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>verify</phase>
                        <goals>
                        <goal>report</goal>
                        </goals>
                    </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <fork>true</fork>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.sonarsource.scanner.maven</groupId>
                    <artifactId>sonar-maven-plugin</artifactId>
                    <version>3.6.0.1398</version>
                </plugin>
            </plugins>
        </build>
    </project>
    
    

    测试

    image-20210329224428982

    注意这里的tag_name不能和gitlab中的tag一样,否则会报错。

    image-20210329224504328

    点击继续:

    image-20210329224737844

    image-20210329224811836

    image-20210329224838984

    等待一段时间

    kubectl get svc -n dev-prod
    kubectl get svc -n dev
    

    image-20210329225456694

    kubectl get pods -n dev-prod
    kubectl get pods -n dev
    

    image-20210329225730373

    访问30861和30961端口(部署成功)

    image-20210329225548637

  • 相关阅读:
    使用urllib
    spring常用的45个注解
    音痴
    android与JS函数传参遗留问题
    方舟编译器源码过一遍流程
    什么是语义学,解释器
    synchronized,ReentrantLock解决锁冲突,脏读的问题
    【Unity3d】ScrollRect自动定位到某点
    计算点到直线的距离】 C#实现
    理财-房月供占工资多少比较合适?
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14594910.html
Copyright © 2011-2022 走看看