zoukankan      html  css  js  c++  java
  • Jenkins企业应用进阶详解(一)

    Jenkins企业应用进阶详解(一)

    链接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ
    提取码:z7gj
    复制这段内容后打开百度网盘手机App,操作更方便哦

    1.CI/CD,DevOps介绍

    • 持续集成(Continuous Integration,CI): 代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈
    • 持续交付(Continuous Delivery,CD): 部署到生产环境,给用户使用
    • 持续部署(Continuous Deployment,CD): 部署到生产环境

    image.png-45.2kB

    2.部署Git版远程仓库

    2.1 系统环境要求

    主机名 IP地址 备注
    Git 192.168.200.61 Git服务器
    Jenkins 192.168.200.62 Jenkins服务器
    [root@Git ~]# cat /etc/redhat-release 
    CentOS Linux release 7.5.1804 (Core) 
    [root@Git ~]# uname -r
    3.10.0-862.3.3.el7.x86_64
    [root@Git ~]# systemctl stop firewalld
    [root@Git ~]# systemctl disable firewalld
    [root@Git ~]# systemctl stop NetworkManager
    [root@Git ~]# systemctl disable NetworkManager
    

    2.2 部署Git版远程仓库

    #在Git服务器上进行如下操作
    #安装Git
    [root@Git ~]# yum -y install git
    [root@Git ~]# rpm -qa git
    git-1.8.3.1-14.el7_5.x86_64
    
    #创建Git账户
    [root@Git ~]# useradd git
    [root@Git ~]# passwd git
    更改用户 git 的密码 。
    新的 密码:yangwenbo
    重新输入新的 密码:yangwenbo
    passwd:所有的身份验证令牌已经成功更新。
    
    #切换git普户创建Git远程仓库
    [root@Git ~]# su git
    [git@Git ~]$ mkdir repos             #创建Git仓库目录
    [git@Git ~]$ cd repos/
    [git@Git repos]$ mkdir app.git       #创建app的项目目录
    [git@Git repos]$ cd app.git/
    [git@Git app.git]$ pwd
    /home/git/repos/app.git
    
    [git@Git app.git]$ git --bare init    #--bare创建一个裸仓库(只用做远程推送仓库不支持本地git命令)
    初始化空的 Git 版本库于 /home/git/repos/app.git/
    [git@Git app.git]$ ls
    branches  config  description  HEAD  hooks  info  objects  refs
    
    说明:
    使用”git init –bare”方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must be run in a work tree”)
    
    [git@Git app.git]$ git status
    fatal: This operation must be run in a work tree
    

    2.3 在Jenkins服务器进行git代码远程推送测试

    #在Jenkins服务器上进行如下操作
    #安装Git
    [root@Jenkins ~]# yum -y install git
    [root@Jenkins ~]# rpm -qa git
    git-1.8.3.1-14.el7_5.x86_64
    
    #创建一个目录,尝试git clone远程Git服务器仓库的代码
    [root@Jenkins ~]# git clone git@192.168.200.61:/home/git/repos/app.git
    正克隆到 'app'...
    git@192.168.200.61's password: yangwenbo
    warning: 您似乎克隆了一个空版本库。
    
    ##创建一个文件进行测试
    [root@Jenkins ~]# cd app/
    [root@Jenkins app]# touch test       #创建一个文件
    [root@Jenkins app]# echo "welcome to yunjisuan" >> test 
    [root@Jenkins app]# cat test 
    welcome to yunjisuan
    
    #配置git全局配置
    [root@Jenkins app]# git config --global user.email "1773464408@qq.com"
    [root@Jenkins app]# git config --global user.name "Mr.yang"
    
    #进行代码提交测试
    [root@Jenkins app]# git add *       #将文件添加到本地暂存区
    [root@Jenkins app]# git commit -m '测试提交'     #将代码提交到本地git仓库
    [master(根提交) 25f1387] 测试提交
     1 file changed, 1 insertion(+)
     create mode 100644 test
    
    [root@Jenkins app]# git remote -v    #发现远程仓库地址已经被添加过了(之前clone时自动添加)
    origin	git@192.168.200.61:/home/git/repos/app.git (fetch)
    origin	git@192.168.200.61:/home/git/repos/app.git (push)
    
    [root@Jenkins app]# git push -u origin master    #将代码推送到远程仓库的master分支
    git@192.168.200.61's password: yangwenbo
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 238 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To git@192.168.200.61:/home/git/repos/app.git
     * [new branch]      master -> master
    分支 master 设置为跟踪来自 origin 的远程分支 master。
    
    #查看分支情况
    [root@Jenkins app]# git branch -a
    * master                       #本地当前所处分支
      remotes/origin/master        #远程仓库已有分支
    

    2.4 在Jenkins服务器进行SSH免密钥操作

    [root@Jenkins ~]# ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:90j/AJhD6+G3lCJte/4RXn7Xgf1JSwbqv0lLldmXnK0 root@Jenkins
    The key's randomart image is:
    +---[RSA 2048]----+
    |                 |
    |                 |
    |        .    .   |
    |       . +  . = B|
    |        S +....&+|
    |       + =.B +=.B|
    |      . * =.*oEo=|
    |       o =..++o..|
    |        .oo..=o  |
    +----[SHA256]-----+
    
    #进行公钥分发
    [root@Jenkins ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub git@192.168.200.61
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    git@192.168.200.61's password: yangwenbo
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'git@192.168.200.61'"
    and check to make sure that only the key(s) you wanted were added.
    
    #测试免密钥的git推送测试
    [root@Jenkins ~]# cd app/
    [root@Jenkins app]# ls
    test
    [root@Jenkins app]# echo "yunwei" >> test 
    [root@Jenkins app]# tail -1 test
    yunwei
    
    [root@Jenkins app]# git add *
    [root@Jenkins app]# git commit -m "免密钥推送测试"
    [master 21c373a] 免密钥推送测试
     1 file changed, 1 insertion(+)
    
    [root@Jenkins app]# git push -u origin master
    Counting objects: 5, done.
    Writing objects: 100% (3/3), 288 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To git@192.168.200.61:/home/git/repos/app.git
       25f1387..21c373a  master -> master
    分支 master 设置为跟踪来自 origin 的远程分支 master。
    

    3. Jenkins的企业应用管理

    jenkins官网:https://jenkins.io/
    redhat版jenkins官方页面:https://pkg.jenkins.io/redhat-stable/

    3.1 Jenkins的安装与基础配置

    安装Jenkins的三种方法

    • 利用Yum源安装
    • 下载jenkins的rpm包安装
    • jenkins的war包安装

    3.1.1 利用Yum方式安装最新版本jenkins

    #下载Jenkins的yum源文件
    [root@Jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    
    #导入jenkins的rpm证书
    [root@Jenkins ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    
    #利用Yum安装最新版本jenkins
    [root@Jenkins ~]# yum -y install jenkins
    [root@Jenkins app]# rpm -qa jenkins
    jenkins-2.138.2-1.1.noarch
    
    #查看jenkins安装路径
    [root@Jenkins ~]# rpm -ql jenkins
    /etc/init.d/jenkins
    /etc/logrotate.d/jenkins
    /etc/sysconfig/jenkins      #jenkins配置文件
    /usr/lib/jenkins
    /usr/lib/jenkins/jenkins.war
    /usr/sbin/rcjenkins
    /var/cache/jenkins
    /var/lib/jenkins
    /var/log/jenkins
    

    3.1.2 安装和配置jdk环境

    由于jenkins是java开发的所以需要jdk支持

    #解压安装jdk
    [root@Jenkins ~]# tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local
    [root@Jenkins ~]# cd /usr/local
    [root@Jenkins local]# mv jdk1.8.0_171 jdk
    [root@Jenkins local]# /usr/local/jdk/bin/java -version
    java version "1.8.0_171"
    Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
    
    #配置java环境
    [root@Jenkins ~]# sed -i.org '$a export JAVA_HOME=/usr/local/jdk/' /etc/profile
    [root@Jenkins ~]# sed -i.org '$a export PATH=$PATH:$JAVA_HOME/bin' /etc/profile
    [root@Jenkins ~]# sed -i.org '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
    [root@Jenkins ~]# tail -3 /etc/profile
    export JAVA_HOME=/usr/local/jdk/
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
    [root@Jenkins ~]# source /etc/profile
    [root@Jenkins ~]# java -version
    java version "1.8.0_171"
    Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
    

    3.1.3 安装和配置maven环境

    #解压安装maven
    [root@Jenkins ~]# tar xf apache-maven-3.5.0-bin.tar.gz -C /usr/local/
    [root@Jenkins ~]# cd /usr/local/
    [root@Jenkins local]# mv apache-maven-3.5.0 maven
    
    #配置maven环境变量
    [root@Jenkins ~]# sed -i '$a MAVEN_HOME=/usr/local/maven' /etc/profile
    [root@Jenkins ~]# sed -i '$a export PATH=${MAVEN_HOME}/bin:$PATH' /etc/profile
    [root@Jenkins ~]# tail -2 /etc/profile
    MAVEN_HOME=/usr/local/maven
    export PATH=${MAVEN_HOME}/bin:$PATH
    [root@Jenkins ~]# source /etc/profile
    
    [root@Jenkins ~]# mvn -v
    Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
    Maven home: /usr/local/maven
    Java version: 1.8.0_171, vendor: Oracle Corporation
    Java home: /usr/local/jdk/jre
    Default locale: zh_CN, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-862.14.4.el7.x86_64", arch: "amd64", family: "unix"
    

    3.1.4 启动jenkins

    #做一个java命令的软连接
    [root@Jenkins ~]# ln -s /usr/local/jdk/bin/java /usr/bin/
    [root@Jenkins ~]# which java
    /usr/bin/java
    
    #再次启动jenkins
    [root@Jenkins ~]# systemctl start jenkins
    [root@Jenkins ~]# systemctl status jenkins     #正常启动
    ● jenkins.service - LSB: Jenkins Automation Server
       Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
       Active: active (running) since 日 2018-10-21 10:08:41 CST; 3s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 16017 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
       CGroup: /system.slice/jenkins.service
               └─16036 /usr/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME...
    
    10月 21 10:08:36 Jenkins systemd[1]: Starting LSB: Jenkins Automation Server...
    10月 21 10:08:36 Jenkins runuser[16022]: pam_unix(runuser:session): session opened for user jenkins b...d=0)
    10月 21 10:08:41 Jenkins jenkins[16017]: Starting Jenkins [  确定  ]
    10月 21 10:08:41 Jenkins systemd[1]: Started LSB: Jenkins Automation Server.
    Hint: Some lines were ellipsized, use -l to show in full.
    
    #查看jenkins监听端口8080
    [root@Jenkins ~]# netstat -antup | grep 8080
    tcp6       0      0 :::8080                 :::*                    LISTEN      16036/java   
    
    #添加开机自启动
    [root@Jenkins ~]# systemctl enable jenkins
    jenkins.service is not a native service, redirecting to /sbin/chkconfig.
    Executing /sbin/chkconfig jenkins on
    

    http://192.168.200.62:8080
    image.png-76kB

    3.1.5 初始化jenkins

    #查看jenkins解锁密码,并复制到jenkins的web界面,解锁jenkins
    [root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
    3a0f9dd9e961458cb2ef514a4c5b4405
    

    image.png-93.7kB

    使用默认插件配置安装即可

    image.png-74.9kB

    image.png-51.2kB

    image.png-58.5kB

    image.png-40.2kB

    image.png-58kB

    3.1.6 常用的系统模块介绍

    image.png-127.4kB

    3.1.7 系统管理--->全局工具配置介绍

    image.png-64.5kB

    image.png-90.4kB

    • Maven配置: 配置maven的settings.xml配置文件的位置路径(不修改为默认路径)。
    • 配置JDK: 配置java命令的执行路径;JDK是java语言的软件开发工具包。
    • 配置Git: 配置Git的命令执行路径;Git是分布式版本控制软件。
    • 配置Gradle: 配置Gradle的执行路径;Gradle是面向java的自动化构建开源工具,同maven。
    • 配置Ant: 配置Ant的执行路径;Ant是面向java的自动化构建开源工具,同maven。
    • 配置Maven:配置maven的命令执行路径;maven是面向java的自动化构建开源工具。
    • 配置Docker: 配置Docker的命令执行路径;Docker是最近大热的容器级虚拟化产品。

    3.1.8 全局工具配置----> 配置JDK

    image.png-45.7kB

    3.1.9 全局工具配置----> 配置Git

    image.png-19.6kB

    3.1.10 全局工具配置----> 配置maven

    • Apache Maven是一种创新的软件项目管理工具,提供了一个项目对象模型(POM)文件的新概念来管理项目的构建,相关性和文档。最强大的功能就是能够自动下载项目依赖的库文件。
    • 在开发中,为了保证编译通过,开发会到处去寻找项目依赖的jar包(类似rpm安装软件时需要的一堆依赖包)
    • 因此,就要用到Maven(Ant和gradle也是干这个的)
    • Maven其实就类似Linux的Yum仓库,可以自动帮我们下载(公网源)和安装java项目所依赖的支持包。

    image.png-36.5kB

    3.2 用户权限管理

    • 在一个成熟的企业应用环境中,jenkins是需要通过权限来控制角色功能使用的
    • 开发人员利用jenkins====>生产环境项目代码版本发布(A/B测试等)
    • 测试人员利用jenkins====>测试环境自动化部署
    • 运维人员利用jenkins====>生产环境项目代码版本回滚

    3.2.1 安装插件Role-based Authorization Strategy

    image.png-84.2kB

    image.png-34.4kB

    3.2.2 全局安全配置--->授权策略--->Role-Based Strategy

    image.png-46.4kB

    image.png-44.6kB

    3.2.3 注册两个用户(开发和测试)

    image.png-31.8kB

    image.png-32.8kB

    image.png-33.4kB
    由于开启了Role-Based Strategy,此时用户没有任何权限

    image.png-7kB

    3.2.4 系统管理--->Manage and Assign Roles

    image.png-114.9kB

    • Manage Roles:权限管理
    • Assign Roles:授权管理

    (1)进入权限管理

    image.png-27.6kB

    Golbal roles:全局权限管理

    • jenkins的整体权限分配,至少要开读的权限

    Project roles:项目权限管理

    • 正则匹配具体的项目,分配管理权限

    image.png-66.6kB
    (2)进入授权管理

    • Global roles:全局权限授权
    • Item roles:项目权限授权

    image.png-23.3kB

    image.png-35.1kB
    (3)创建两个项目分别以A-和B-开头
    image.png-77.5kB

    image.png-87.1kB

    image.png-15.4kB

    image.png-14.4kB

    image.png-33.8kB

    image.png-14.5kB

    image.png-31.8kB

    image.png-27.5kB
    (4)登陆用户user1和user2进行权限登陆测试
    image.png-7.8kB

    image.png-8kB

    3.3 参数化构建

    3.3.1 什么是参数化构建?

    参数化构建就是在执行自动构建之前可以对构建过程手动传入外部参数,从而改变构建的过程。

    (1)配置一个构建脚本,然后执行
    image.png-11.2kB

    image.png-32.7kB

    image.png-46.8kB

    image.png-35.6kB

    image.png-32.6kB

    image.png-36.8kB

    image.png-36.4kB

    image.png-29.8kB
    (2)添加参数化构建功能
    image.png-51.4kB

    image.png-49.3kB

    image.png-36.4kB
    (3)执行参数构建
    image.png-47.7kB

    image.png-43.7kB

    image.png-48.7kB

    image.png-34.9kB

    image.png-33.7kB
    当然,我们在构建的时候也可以修改参数的默认值

    image.png-39.3kB

    image.png-53kB

    image.png-29.8kB

    3.3.2 安装插件Extended Choice Parameter

    • Extended Choice Parameter:作用就是在参数化构建时可以出现一个下拉框让用户直接选择多个值

    image.png-63.9kB

    image.png-52.7kB

    image.png-45.7kB

    image.png-47.3kB

    image.png-33.4kB

    image.png-42.6kB

    image.png-59.8kB

    image.png-29.5kB
    我们还可以在一个文件里创建参数,然后让插件引用这个参数

    #创建一个参数定义文件
    [root@Jenkins ~]# vim /opt/jenkins.property
    [root@Jenkins ~]# cat /opt/jenkins.property
    yunjisuan=test01,test02,test06
    

    image.png-54.6kB

    image.png-27.9kB

    image.png-46.1kB

    image.png-29.4kB

    3.4 Git参数化构建插件

    Git Parameter插件可以直接获取Git仓库的branch,tag等信息

    3.4.1 安装插件Git Parameter

    image.png-41.3kB

    image.png-41.4kB

    image.png-30.9kB

    image.png-20.9kB

    image.png-52.3kB

    3.4.3 进行Git参数化构建

    (1)配置Git Parameter插件
    image.png-49.1kB

    image.png-37.1kB

    (2)配置Git远程仓库

    image.png-66kB

    (3)进行Git参数化构建

    image.png-32.3kB

    image.png-55kB

    (4)给Git远程仓库增加分支

    #在jenkins上操作
    [root@Jenkins ~]# mkdir -p /test
    [root@Jenkins ~]# cd /test/
    
    [root@Jenkins test]# git init
    初始化空的 Git 版本库于 /test/.git/
    [root@Jenkins test]# git clone git@192.168.200.61:/home/git/repos/app.git
    正克隆到 'app'...
    remote: Counting objects: 6, done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 6 (delta 0), reused 0 (delta 0)
    接收对象中: 100% (6/6), done.
    
    [root@Jenkins test]# ls
    app
    [root@Jenkins test]# cd app/
    [root@Jenkins app]# ls
    test
    [root@Jenkins app]# cat test 
    welcome to yunjisuan
    yunwei
    
    [root@Jenkins app]# git branch
    * master
    [root@Jenkins app]# git branch dev
    [root@Jenkins app]# git checkout dev
    切换到分支 'dev'
    [root@Jenkins app]# git branch
    * dev
      master
    
    [root@Jenkins app]# git add *
    [root@Jenkins app]# git commit -m "开发分支提交"
    # 位于分支 dev
    无文件要提交,干净的工作区
    [root@Jenkins app]# git push -u origin dev
    Total 0 (delta 0), reused 0 (delta 0)
    To git@192.168.200.61:/home/git/repos/app.git
     * [new branch]      dev -> dev
    分支 dev 设置为跟踪来自 origin 的远程分支 dev。
    

    (5)进行jenkins项目代码拉取测试
    image.png-28.5kB

    image.png-49.1kB

    3.5 Master-Slave架构

    image.png-88.2kB

    主机名 IP地址 备注
    Git 192.168.200.61 Git服务器(Jenkins的slave节点)
    Jenkins 192.168.200.62 Jenkins服务器

    jenkins的分布式构建操作,可以通过slave代理节点来执行项目任务;

    3.5.1 添加一个用于连接slave代理节点的SSH证书

    image.png-22.7kB

    3.5.2 系统管理--->节点管理

    image.png-47.3kB

    image.png-43.7kB

    image.png-69.7kB

    特别提示:如果没有设置工具位置--->jdk ,那么jenkins会默认去/var/lib/jenkins/jdk下找java命令 ,如果找不到代理就会连接不上

    image.png-18.1kB

    3.5.3 slave节点安装java环境

    #解压安装jdk
    [root@Git ~]# tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local
    [root@Git ~]# cd /usr/local
    [root@Git local]# mv jdk1.8.0_171 jdk
    [root@Git local]# /usr/local/jdk/bin/java -version
    java version "1.8.0_171"
    Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
    
    
    #配置java环境
    [root@Git ~]# sed -i.org '$a export JAVA_HOME=/usr/local/jdk/' /etc/profile
    [root@Git ~]# sed -i.org '$a export PATH=$PATH:$JAVA_HOME/bin' /etc/profile
    [root@Git ~]# sed -i.org '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
    [root@Git ~]# tail -3 /etc/profile
    export JAVA_HOME=/usr/local/jdk/
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
    [root@Git ~]# source /etc/profile
    [root@Git ~]# java -version
    java version "1.8.0_171"
    Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
    

    3.5.4 启动slave节点代理程序

    image.png-50.3kB

    image.png-38kB

    3.5.5 查看slave节点启动日志

    image.png-44.9kB

    3.5.6 强制让项目A-Web01运行在slave1节点上,并运行项目

    image.png-53.3kB

    image.png-32.8kB

    image.png-30.6kB

    image.png-31.7kB

    3.5.7 查看A-WebA的构建日志

    image.png-68.2kB

    [root@Git ~]# cd /var/lib/jenkins/workspace/
    [root@Git workspace]# ls
    A-web01  A-web01@tmp
    [root@Git workspace]# cat A-web01/test 
    welcome to yunjisuan
    yunwei
    [root@Git workspace]# hostname -I
    192.168.200.61
    
  • 相关阅读:
    二分查找算法
    http协议。会话控制cookie、session
    154. Find Minimum in Rotated Sorted Array II
    8. String to Integer (atoi)
    528. Random Pick with Weight
    415. Add Strings
    158. Read N Characters Given Read4 II
    157. Read N Characters Given Read4
    19. Remove Nth Node From End of List
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/ywb123/p/11222936.html
Copyright © 2011-2022 走看看