- 首先开启devops,这里也同时开启sonar qube代码检测
kubectl edit cm -n kubesphere-system ks-installer
- 创建凭证
创建git凭证,这里代码是放在gitee上面保存的,输入gitee登录的用户名和密码
创建sonar凭证
查看sonarqube暴露的端口
kubectl get svc --all-namespaces
通过admin/admin
登录以后,会让我们enter a name for your token
,这里我们输入gulimall
依次选择java
,maven
:
mvn sonar:sonar \
-Dsonar.host.url=http://10.12.34.53:32411 \
-Dsonar.login=dea8cd0312f13e132b8843d3fa63e11eebc829ca
创建凭证:
这里输入刚刚生成的token
创建kubeconfig凭证,用于访问接入正在运行的kubenernetes
创建dockerhub远程镜像仓库凭证
2. 创建项目
在企业空间下创建自己的一个项目
3. 创建一个devops工程
4. 在devops工程下面创建流水线
进入创建的流水线,可以编辑jenkinsfile或者流水线
这里我已经创建好一个流水线了,主要是代码拉取,sonar检测,推送值dockerhub镜像,再创建服务
pipeline {
agent {
node {
label 'maven'
}
}
stages {
stage('拉取代码') {
steps {
git(credentialsId: 'gitee-id', url: 'https://gitee.com/yuwengoku/security.git', branch: 'master', changelog: true, poll: false)
container('maven') {
sh 'mvn clean install -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml '
}
}
}
stage('sonar代码质量分析') {
steps {
container('maven') {
withCredentials([string(credentialsId: "$SONAR_CREDENTIAL_ID", variable: 'SONAR_TOKEN')]) {
withSonarQubeEnv('sonar') {
sh "mvn sonar:sonar -gs `pwd`/mvn-settings.xml -Dsonar.branch=$BRANCH_NAME -Dsonar.login=$SONAR_TOKEN"
}
}
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate true
}
}
}
}
stage('构建镜像并推送') {
steps {
container('maven') {
sh 'mvn -Dmaven.test.skip=true -gs `pwd`/mvn-settings.xml clean package'
sh 'cd $PROJECT_NAME && docker build --no-cache -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$PROJECT_NAME:$PROJECT_VERSION'
}
}
}
}
stage('部署到开发环境') {
steps {
input(id: "deploy-to-dev-$PROJECT_NAME", message: "是否将[$PROJECT_NAME]部署到集群中?")
kubernetesDeploy(configs: "$PROJECT_NAME/deploy/**", enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
}
}
}
environment {
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
GITEE_CREDENTIAL_ID = 'gitee-id'
KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
REGISTRY = 'docker.io'
DOCKERHUB_NAMESPACE = 'yuwengoku'
GITEE_ACCOUNT = 'yuwengoku'
SONAR_CREDENTIAL_ID = 'sonar-qube'
BRANCH_NAME = 'master'
}
parameters {
string(name: 'PROJECT_VERSION', defaultValue: 'v0.0Beta', description: '')
string(name: 'PROJECT_NAME', defaultValue: 'gateway', description: '')
}
}
- 执行流水线部署服务,输入镜像版本和项目名称
项目名称即每个微服务下pom文件的名称
部署好了,可以查看服务
- 测试
- 问题总结
7.1 如果和我一样是部署微服务的话,如果微服务中用common这种共通代码的话,则pom中不能添加一下插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
而web服务,即需要@SpringBootApplication
作为启动类的微服务,则必须在pom中添加此插件,也就是每个web微服务中必须单独添加此插件,不能在总的pom文件中添加此插件
7.2 每个流水线都是一个独立的空间,如果一个流水线只负责拉取代码,另一个流水线用来编译镜像,是不行的,两边不互通
7.3 在插入审核语句时,message中如果要插入参数,则需要前后加空格或者别的标志
input(id: "deploy-to-dev-$PROJECT_NAME", message: "是否将[$PROJECT_NAME]部署到集群中?")
或
input(id: "deploy-to-dev-$PROJECT_NAME", message: "是否将 $PROJECT_NAME 部署到集群中?")
不能
input(id: "deploy-to-dev-$PROJECT_NAME", message: "是否将$PROJECT_NAME部署到集群中?")
7.4 input审核语句改进
这里可以看到,默认时Proceed来表示同意,我们需要进行修改
input(id: "deploy-to-dev-$PROJECT_NAME", message: "是否将[$PROJECT_NAME]部署到集群中?", ok: "部署")