CI/CD持续集成持续发布(jenkins)

这篇具有很好参考价值的文章主要介绍了CI/CD持续集成持续发布(jenkins)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.背景

        在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试;

  或者前后端分离后,经常会修改接口,然后重新部署;

  这些情况都会涉及到频繁的打包部署;

  手动打包常规步骤:

  1.提交代码

  2.问一下同组小伙伴有没有要提交的代码

  3.拉取代码并打包(war包,或者jar包)

  4.上传到Linux服务器

  5.查看当前程序是否在运行

  6.关闭当前程序

  7.启动新的jar包

  8.观察日志看是否启动成功

  9.如果有同事说,自己还有代码没有提交......再次重复1到8的步骤!!!!!(一上午没了)

  那么,有一种工具能够实现,将代码提交到git后就自动打包部署勒,答案是肯定的:Jenkins

  当然除了Jenkins以外,也还有其他的工具可以实现自动化部署,如Hudson等

  只是Jenkins相对来说,使用得更广泛
 

CI/CD持续集成持续发布(jenkins),jenkins,运维

1. jenkins

1.1 什么是jenkins

jenkins就是持续开发部署得软件

1.2.Jenkins自动化部署实现原理

CI/CD持续集成持续发布(jenkins),jenkins,运维

yum install -y curl policycoreutils-python openssh-server perl postfix
systemctl enable --now sshd postfix

rpm -ivh gitlab-ce-12.3.0-ce.0.el7.x86_64.rpm
 

CI/CD持续集成持续发布(jenkins),jenkins,运维

vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.50.25:82'
nginx['listen_port'] = 82

gitlab-ctl reconfigure
gitlab-ctl restart
 

CI/CD持续集成持续发布(jenkins),jenkins,运维

浏览器访问:http://192.168.50.25:82 ,如果显示 502,稍等片刻再刷新

CI/CD持续集成持续发布(jenkins),jenkins,运维
1、设置管理员 root 用户的新密码,注意有格式要求,这里设置成 root@123
2、使用管理员 root 用户登录(root/root@123)
3、登录后点击页面右上方的用户选项下拉选择【Settings】,点击左边菜单【Preferences】,在【Localization】的【Language】中选择【简体中文】,点击【Save changes】按钮,再刷新页面使用中文显示。

 CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

 //Gitlab添加组、创建用户、创建项目
#创建群组
点击页面左上方的【GitLab】图标,点击 【新建群组】
【群组名称】、【群组URL】、【群组描述】都设置成 devops_group
【可见性级别】设置成 私有
其他都保持默认值,点击 【创建群组】

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

#创建项目
点击 【新建项目】
【项目URL】群组选项下拉选择 devops_group
【项目名称】设置成 web_demo
【项目描述】设置成 web_demo
【可见等级】设置成 私有
点击 【创建项目】
 

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

 CI/CD持续集成持续发布(jenkins),jenkins,运维

#创建用户
点击页面上方的【扳手】图标进入“管理区域”
点击 【新建用户】
【姓名】设置成 zhangsan
【用户名】设置成 zhangsan
【电子邮箱】设置成 zhangsan@kgc.com
这里密码暂不设置,其他都保持默认值,先点击 【创建用户】
注:Access level:Regular(表示的是普通用户,只能访问属于他的组和项目);Admin(表示的是管理员,可以访问所有组和项目)

创建好用户后再点击右上角的【Edit】,可在这里设置密码,如 zhangsan@123

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

#将用户添加到组中
点击页面上方的【群组】下拉选择 devops_group
点击左边菜单【成员】
【添加成员到 devops_group】选择 zhangsan,角色权限选择 Owner
点击 【添加到群组】
 

CI/CD持续集成持续发布(jenkins),jenkins,运维

#使用自己创建的账户进行管理
退出当前账户,使用自己创建的账户 zhangsan 登录(zhangsan/zhangsan@123)
第一次登录会被强制要求修改密码(zhangsan/zhangsan@123),可与旧密码相同,再重新登录
 

//Jenkins安装

#安装JDK
tar zxvf jdk-11.0.5_linux-x64_bin.tar.gz -C /usr/local/

vim /etc/profile
export JAVA_HOME=/usr/local/jdk-11.0.5
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source /etc/profile
java -version

#安装jenkins

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

yum install epel-release -y
yum install jenkins -y

或者直接用下载好的安装包

yum localinstall -y jenkins-2.401.2-1.1.noarch.rpm

#修改 jenkins 的运行用户和监听端口


vim /etc/sysconfig/jenkins
JENKINS_USER="root"
JENKINS_PORT="8888"

##新版本的 jenkins 还要在 /usr/lib/systemd/system/jenkins.service 文件中修改用户名和端口


vim /usr/lib/systemd/system/jenkins.service
User=root
Group=root
Environment="JAVA_HOME=/usr/local/jdk-11.0.5"     注释去掉
Environment="JENKINS_PORT=8888"

CI/CD持续集成持续发布(jenkins),jenkins,运维

#修改 jenkins 的启动脚本添加java路径


vim /etc/init.d/jenkins
candidates="
......
/usr/local/jdk-11.0.5/bin/java
/usr/bin/java

systemctl daemon-reload
systemctl start jenkins
systemctl enable jenkins

vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>

 sed -i 's#https://www.google.com#https://www.baidu.com#' /var/lib/jenkins/updates/default.json

http://192.168.50.25:8888 

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

 systemctl restart jenkins

浏览器访问:http://192.168.50.25:8888 ,获取并输入 admin 账户密码

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

要安装git插件,从gitlab仓库拉取代码 

CI/CD持续集成持续发布(jenkins),jenkins,运维

点击用户名下拉选择凭据 -> Jenkins 全局 -> 添加凭据
类型选择 "Username with password" ,输入 Gitlab 的用户名和密码(zhangsan/zhangsan@123),描述输入 gitlab-auth-password 
点击 "确定"。

CI/CD持续集成持续发布(jenkins),jenkins,运维

创建一个FreeStyle项目:新建Item -> 任务名称(test01) FreeStyle Project -> 确定
源码管理:选择 Git,Repository URL:http://192.168.80.10:82/devops_group/web_demo.git(可从 Gitlab 使用 HTTP 克隆),
Credentials 下拉选择 gitlab-auth-password,点击 保存。

点击 Bulid Now 开始构建,查看控制台输出可以看到构建成功,构建后的包会生成在服务器的 /var/lib/jenkins/workspace/test01 目录中。
 

CI/CD持续集成持续发布(jenkins),jenkins,运维

 CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

//Jenkins 构建 Maven 项目

Maven 是一个主要用于 Java 项目的自动化构建工具。Maven 还可以用来构建和管理用 C#、Ruby、Scala 和其他语言开发的项目。

#在 Jenkins 服务器上安装 Maven 来编译和打包项目
cd /opt
tar -zxvf apache-maven-3.6.2-bin.tar.gz
mv apache-maven-3.6.2 /usr/local/maven

vim /etc/profile
......
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:${JAVA_HOME}/bin:$PATH

source /etc/profile
mvn -v

#Jenkins 关联 JDK 和 Maven


tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/

Manage Jenkins -> Global Tool Configuration 
-> JDK
点击 新增JDK,别名输入 jdk11,取消勾选 Install automatically,JAVA_HOME输入 /usr/local/jdk-11.0.5
点击 新增JDK,别名输入 jdk1.8,取消勾选 Install automatically,JAVA_HOME输入 /usr/local/jdk1.8.0_171
-> Maven
点击 新增Maven,Name输入 maven3,取消勾选 Install automatically,MAVEN_HOME驶入 /usr/local/maven
点击 "应用"和"保存"。

#添加 Jenkins 全局变量,让 Jenkins 能够识别 JDK 和 Maven 环境的命令
Manage Jenkins -> Configure System -> 全局属性,勾选 Environment variables
键值对列表添加:键 JAVA_HOME ,值 /usr/local/jdk-11.0.5
                键 M2_HOME ,值 /usr/local/maven
                键 PATH+EXTRA ,值 $M2_HOME/bin

#修改 Maven 的 settings.xml


mkdir /root/repo        #创建本地仓库目录

vim /usr/local/maven/conf/settings.xml
54 -->        #本地仓库改为 /root/repo/
   <localRepository>/root/repo</localRepository>

153 -->        #添加阿里云私服地址
    <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
  </mirrors>

CI/CD持续集成持续发布(jenkins),jenkins,运维

//Tomcat 安装和配置


#安装 Tomcat8.5
tar zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/

vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_171
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH

source /etc/profile

tar zxvf apache-tomcat-9.0.16.tar.gz

mv /opt/apache-tomcat-9.0.16/ /usr/local/tomcat

/usr/local/tomcat/bin/startup.sh

//配置 Tomcat 用户角色权限
默认情况下 Tomcat 是没有配置用户角色权限的
验证方法:可浏览器访问 http://192.168.80.12:8080 ,点击 Managing Tomcat 下的 manager webapp ,发现返回 403 页面。

CI/CD持续集成持续发布(jenkins),jenkins,运维

CI/CD持续集成持续发布(jenkins),jenkins,运维

但是后续 Jenkins 部署项目到 Tomcat 服务器,需要用到 Tomcat 的用户进行远程部署,所以修改 tomcat 以下配置,添加用户及权限
vim /usr/local/tomcat/conf/tomcat-users.xml
43 -->    #添加 tomcat 用户角色权限,指定用户和密码都是 tomcat ,并授予权限
   <role rolename="tomcat"/>
   <role rolename="role1"/>
   <role rolename="manager-script"/>
   <role rolename="manager-gui"/>
   <role rolename="manager-status"/>
   <role rolename="admin-gui"/>
   <role rolename="admin-script"/>
   <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
</tomcat-users>

CI/CD持续集成持续发布(jenkins),jenkins,运维

vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
<!--     #注释掉 Valve 配置
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

再次访问:http://192.168.80.12:8080/manager/html ,输入账号/密码 tomcat/tomcat,即可成功登录

CI/CD持续集成持续发布(jenkins),jenkins,运维

 再次登录

CI/CD持续集成持续发布(jenkins),jenkins,运维

//Jenkins 构建 Maven 项目

//自由风格项目构建

项目的集成过程:拉取代码 -> 编译 -> 打包 -> 部署

#拉取代码

新建item -> 任务名称(web_demo_freestyle) FreeStyle Project -> 确定
源码管理:选择 Git,Repository URL:git@192.168.80.10:devops_group/web_demo.git
Credentials 下拉选择 gitlab-auth-ssh,点击 保存
点击 Build Now,尝试构建项目

#编译打包

配置 —> 构建 -> 添加构建步骤 -> Execute Shell,输入以下命令
echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"
点击 Build Now,尝试构建项目

#把项目部署到远程的 Tomcat 里面

1)安装 Deploy to container 插件
Jenkins 本身无法实现远程部署到 Tomcat 的功能,需要安装 Deploy to container 插件实现:
Manage Jenkins -> 管理插件-可选插件 -> 搜索 Deploy to container 插件选中直接安装即可

2)添加构建后操作
配置 —> 构建后操作 -> 增加构建后操作步骤 -> Deploy war/ear to a container
WAR/EAR files 输入 target/*.war
Containers —> Add Container —> Tomcat 9.x Remote -> Credentials,点击添加 -> Jenkins
用户名 输入 tomcat,密码 输入 tomcat,描述 输入 tomcat-auth,点击添加
Credentials 下拉选择 tomcat-auth
Tomcat URL 输入 http://192.168.80.12:8080

CI/CD持续集成持续发布(jenkins),jenkins,运维


点击保存
点击 Build Now,尝试构建项目

3)部署成功后,刷新 http://192.168.80.12:8080/manager/html 页面,可以发现应用程序中多出一个项目,点击新项目进去访问 


//Pipeline 流水线项目构建

Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 Groovy
Pipeline 支持两种语法:Declarative(声明式)和 Scripted Pipeline(脚本式)语法

#安装 Pipeline 插件(推荐的插件已默认安装)
Manage Jenkins -> Manage Plugins -> 可选插件 –> 安装 Pipeline 和 Pipeline Stage View

CI/CD持续集成持续发布(jenkins),jenkins,运维

#Pipeline 语法快速入门
1)Scripted 脚本式 Pipeline 
新建item -> 任务名称(web_demo_pipeline) Pipeline -> 确定

流水线 -> 定义 选择 Pipeline script -> 选择 Scripted Pipeline 
生成内容如下:
node {
    def mvnHome
    stage('Preparation') { // for display purposes
        // Get some code from a GitHub repository
        git 'https://github.com/jglick/simple-maven-project-with-tests.git'
        // Get the Maven tool.
        // ** NOTE: This 'M3' Maven tool must be configured
        // **       in the global configuration.
        mvnHome = tool 'M3'
    }
    stage('Build') {
        // Run the maven build
        withEnv(["MVN_HOME=$mvnHome"]) {
            if (isUnix()) {
                sh '"$MVN_HOME/bin/mvn" -Dmaven.test.failure.ignore clean package'
            } else {
                bat(/"%MVN_HOME%\bin\mvn" -Dmaven.test.failure.ignore clean package/)
            }
        }
    }
    stage('Results') {
        junit '**/target/surefire-reports/TEST-*.xml'
        archiveArtifacts 'target/*.jar'
    }
}

●Node:节点,一个 Node 代表一个 Jenkins 节点,Master 或者 Agent 节点,是执行 Step 的具体运行环境,后续讲到 Jenkins 的 Master-Slave 架构的时候用到。
●Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如:Build、Test、Deploy,Stage 是一个逻辑分组的概念。
●Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像,由各类 Jenkins 插件提供, 比如命令:sh 'make',就相当于我们平时 shell 终端中执行 make 命令一样。

编写一个简单的脚本式 Pipeline:
node {
    def mvnHome
    stage('拉取代码') {
        echo '拉取代码'
    } 
    stage('编译构建') {
        echo '编译构建'
    } 
    stage('项目部署') {
        echo '项目部署'
    }
}

2)Declarative 声明式 Pipeline
流水线 -> 选择 HelloWorld 模板
生成内容如下:
pipeline {
    agent any
    stages {              #stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
        stage('Hello') {  #stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段
            steps {       #steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容
                echo 'Hello World'
            }
        }
    }
}

编写一个简单声明式Pipeline:
pipeline {
   agent any
   stages {
       stage('拉取代码') {
           steps {
               echo '拉取代码'
           }
       } 
       stage('编译构建') {
           steps {
               echo '编译构建'
           }
       } 
       stage('项目部署') {
           steps {
               echo '项目部署'
           }
       }
   }
}
点击保存
点击 Build Now,查看 Console Output 可以看到整个构建过程

#使用代码生成器生成流水线脚本:
流水线 -> 流水线语法 -> 片段生成器

#生成一个 pull stage
选择 checkout: Check out from version control
SCM 选择 Git,Repository URL:git@192.168.80.10:devops_group/web_demo.git
Credentials 下拉选择 gitlab-auth-ssh
指定分支 */master
点击 生成流水线脚本
把生成的脚本复制到流水线中后,点击保存,尝试构建;

#生成一个构建 stage
选择 sh:Shell Script
Shell Script 输入 mvn clean package
点击 生成流水线脚本
把生成的脚本复制到流水线中后,点击保存,尝试构建;

#生成一个部署 stage
选择 deploy: Deploy war/ear to a container
WAR files 输入 targer/*.war
Containers —> Add Container —> Tomcat 8.x Remote -> Credentials 下拉选择 tomcat-auth
Tomcat URL 输入 http://192.168.80.12:8080
点击 生成流水线脚本
把生成的脚本复制到流水线中后,点击保存,尝试构建部署。文章来源地址https://www.toymoban.com/news/detail-625101.html

到了这里,关于CI/CD持续集成持续发布(jenkins)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DevOps:自动化部署和持续集成/持续交付(CI/CD)

    在现代软件开发领域,DevOps(Development和Operations的组合)已经成为一个不可或缺的概念。它代表了一种将软件开发和运维(Operations)紧密结合的方法,旨在提高软件交付速度、质量和可靠性。本文将深入探讨DevOps中的关键概念,特别是自动化部署和持续集成/持续交付(CI/C

    2024年02月07日
    浏览(55)
  • 【git】CI/CD持续集成与部署C++示例

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍CI/CD持续集成与部署C++示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 CI/CD (持续集成/持续交付)是一种软件开发实践和方法论,旨在通过

    2024年01月19日
    浏览(54)
  • 什么是CI/CD:持续集成与持续交付?(InsCode AI 创作助手)

    在现代软件开发领域,CICD(Continuous Integration and Continuous Delivery)是一种关键性的开发实践,它有助于提高软件交付的质量和效率。本文将深入探讨CICD的定义、原理和重要性,以及如何在项目中实施CICD流程。 什么是CICD? CICD是一种软件开发实践,它将持续集成(CI)和持续交

    2024年02月09日
    浏览(48)
  • 持续集成与持续交付(CI/CD):探讨在云计算中实现快速软件交付的最佳实践

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:云计算 ✨文章内容:软件交付 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 持续集成(Continuous Integration,CI)和持续交付(Continuous D

    2024年02月10日
    浏览(52)
  • [Docker实现测试部署CI/CD----Jenkins集成相关服务器(3)]

             SonarScanner 是一种代码扫描工具,专门用来扫描和分析项目代码质量。扫描和分析完 成之后,会将结果写入到 SonarQube 服务器的数据库中,并在 SonarQube 平台显示这些数 据。         在 SonarQube 官网的帮助文档中可以下载 SonarScanner。这里下载一个 Linux 系统下使

    2024年02月14日
    浏览(31)
  • Gitlab CI/CD笔记-第一天-GitOps和以前的和jenkins的集成的区别

    一、GitOps-CI/CD的流程图与Jenkins的流程图 从上图可以看到: GitOps与基于Jennkins技术栈的CI/CD流程,无法从Jenkins集成其他第三方开源的项目来实现换成了Gitlab来进行集成。 好处在于:CI 一个工具Gitlab就行了,但CD部分依旧是传统的云主机(虚拟机),物理及,docker单机容器或者

    2024年02月14日
    浏览(37)
  • DevOps-Jenkins-CI持续集成操作

    创建个web项目 我这里直接用Spring Web自动生成的demos 启动项目,访问展示如下默认页面信息 在项目下新建docker目录,新增Dockerfile、docker-compose.yml文件 Dockerfile文件,将mytest.jar 复制到容器的/usr/local/目录下,在/usr/local执行命令java -jar mytest.jar docker-compose.yml文件,当前目录以D

    2024年03月13日
    浏览(49)
  • 基于SNAT+DNAT发布内网K8S及Jenkins+gitlab+Harbor模拟CI/CD的综合项目

    目录 项目名称 项目架构图 项目环境 项目概述 项目准备 项目步骤 一、修改每台主机的ip地址,同时设置永久关闭防火墙和selinux,修改好主机名,在firewalld服务器上开启路由功能并配置snat策略。 1. 在firewalld服务器上配置ip地址、设置永久关闭防火墙和selinux,并修改好主机名

    2024年02月09日
    浏览(44)
  • 【软件测试】- 将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中实现自动化测试和持续集成(CI)及Jenkinsfile 实现 Jenkins Pipeline 原理介绍

    将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中是实现自动化测试和持续集成(CI)的关键步骤。以下是详细的集成过程: 1、准备工作 安装 Jenkins : 确保您已经在服务器上安装了 Jenkins。 可以从 Jenkins 官网 下载并安装。 安装必要的插件 : 在 Jenkins 中安装所需的插件,如 Git 插

    2024年02月04日
    浏览(61)
  • ubuntu系统安装配置gitlab+Jenkins+发布持续集成持续部署保姆级教程。

    1、服务器环境 名称                              系统                                   IP                              备注 gitlab               ubuntu20.04.2图形化          192.168.26.130        要求有6G的内存 Jenkins           Ubuntu20.04.2图形化          1

    2024年04月26日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包