Jenkins

Jenkins

jenkins简介

Jenkins官网
Jenkins是一个开源CI&CD软件、提供友好操作界面的持续集成(CI)工具;
起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行;Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行;通常与版本管理工具(SCM)、构建工具结合使用。

常用的版本控制工具:SVN、GIT
构建工具有:Maven、Ant、Gradle

jenkins工作原理

将源代码从SVN/Git版本控制系统中拷贝一份到本地,然后根据设置的脚本进行build(构建);整个系统的关键就是build脚本,build脚本告诉Jenkins在一次集成中需要执行的任务。

jenkins特点

(1)易安装:仅仅一个 Jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库
(2)易配置:提供友好的 GUI 配置界面
(3)变更支持:Jenkins 能从代码仓库(SVN/Git)中获取并产生代码更新列表,并输出到编译输出信息中
(4)支持永久链接:用户是通过 Web 来访问 Jenkins 的,而这些 Web 页面的链接地址都是永久链接地址,可以在各种文档中直接使用该链接;
(5)集成 E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时收取集成结果(构建一次集成需要花费一定时间,有了这个功能,就可以在等待结果过程中,干别的事情);
(6)JUnit/TestNG 测试报告:也就是用以图表等形式提供详细的测试报表功能;
(7)支持分布式构建:Jenkins 可以把集成构建等工作分发到多台计算机中完成;
(8)文件指纹信息:Jenkins 会保存构建集成所产生的 jars 文件、集成构建使用了哪个版本;
(9)支持第三方插件:Jenkins 支持 第三方插件,这使得 Jenkins 功能变得越来越强大

CI/CD是什么

CI持续集成
1、简介
CI 持续集成(全称:Continuous integration),中文意思是持续集成是一种软件开发时间;持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试;根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
假设一个应用程序,其代码存储在GitLab的Git仓库中。开发人员每天都要多次推送代码更改。对于每次向仓库的推送,你都可以创建一组脚本来自动构建和测试你的应用程序,从而减少了向应用程序引入错误的机会。这种做法称为持续集成,对于提交给应用程序(甚至是开发分支)的每项更改,它都会自动连续进行构建和测试,以确保所引入的更改通过你为应用程序建立的所有测试,准则和代码合规性标准。
2、CI工作模式

Jenkins
3、持续集成的优势
(1)易于定位错误:
每一次的代码集成都需要执行相关的测试工作,持续集成频繁的集成次数天然的将复杂的代码逻辑切割为了小块,也就使得每一次测试中遇到的错误能够更加容易的被定位。
(2)易于控制开发流程:
更为细致的工作提交也就意味着更容易判断当前的工作进度,这对于管理者规划开发流程而言提供了一个有效的参考,同时也为开发人员省下了汇报工作的时间。
CD持续交付
1、简介
CD 持续交付(全称:Continuous Delivery), 中文意思是:持续交付 是在 CI持续集成 的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中;比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试,如果代码没有问题,可以继续手动部署到生产环境。

2、CD工作模式

Jenkins
3、CD持续部署
简介
CD 持续部署(全称:Continuous Deployment),是 CI持续集成 ,CD持续交付的延伸。自动将交付的应用部署到生产环境。能及时收到用户反馈,降低部署的风险;
持续部署是持续交付的下一步,在持续交付的基础上,由开发人员或运维人员自助式的定期向生产环境部署稳定的构建版本,持续部署的目标是代码在任何时刻都是可部署的,并可自动进入到生产环境。

工作模式:

Jenkins

使用tomcat容器安装jenkins

部署tomcat,tomcat下载9.0版本的,10版本部署有bug,无法实现
tomcat下载9.0版本的下载地址
安装jdk

[root@jenkins ~]# dnf -y install java-11-openjdk

下载tomcat,解压tomcat,并部署安装

root@jenkins ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
[root@jenkins ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.67.tar.gz
[root@jenkins ~]# tar xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
[root@jenkins ~]# cd /usr/local/
[root@jenkins local]# ln -s apache-tomcat-9.0.67/ tomcat

关闭·防火墙,启动tomcat,测试能否访问tomcat首页

[root@jenkins local]# cd tomcat/
[root@jenkins tomcat]# systemctl stop firewalld.service
[root@jenkins tomcat]# vim /etc/selinux/config
SELINUX=disabled
[root@jenkins tomcat]# setenforce 0
[root@jenkins tomcat]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@jenkins tomcat]# bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

访问:

Jenkins
部署jenkins
下载jenkins到/usr/local/tomcat/webapps/目录下
官网地址
Jenkins
Jenkins
[root@jenkins tomcat]# cd
[root@jenkins ~]# cd /usr/local/tomcat/webapps/
[root@jenkins webapps]# pwd
/usr/local/tomcat/webapps

下载下来后会自动解压

[root@jenkins webapps]# wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war
[root@jenkins webapps]# ls
ROOT  docs  examples  host-manager  jenkins.war  manager

启动服务

[root@jenkins webapps]# cd /usr/local/tomcat/
[root@jenkins tomcat]# pwd
/usr/local/tomcat
[root@jenkins tomcat]# bin/catalina.sh stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
[root@jenkins tomcat]# bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

浏览器访问jinkins
直接在http://192.168.222.138:8080/后面加jinkins就可以访问到

Jenkins
查看上图框出来的文件,该文件中记录这密码,复制密码并登录
[root@jenkins tomcat]# cat /root/.jenkins/secrets/initialAdminPassword
41ec057f2f0643339e015d44019c63ab

Jenkins
自定义jenkins
选择插件来安装
Jenkins
选择无,进行安装,后期需要什么插件就安装什么插件
Jenkins
创建管理员用户admin,密码为admin
Jenkins
Jenkins
Jenkins
此时登录进去是英文界面,我们进行替换国内源
Jenkins
点击 Advanced —> 更新为国内源 —> Submit
原国外插件源地址:https://updates.jenkins.io/update-center.json
国内插件源地址:https://mirror.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
Jenkins
Jenkins
往下面翻
Jenkins
安装简体中文插件
Jenkins
Jenkins
Jenkins
用户名和密码都是admin
Jenkins
Jenkins
安装Git GitHub GitLab Gitee插件
安装完成后,会重启jenkins
Jenkins
Jenkins
用户界面
任务管理
Jenkins
Jenkins
Jenkins
Jenkins
全局工具配置
安装jdk
Jenkins
Jenkins
Jenkins
节点管理

jenkins流水线项目发布流程

环境说明:

主机名称 ip地址 需要的应用服务 工具包 系统 jenkins 192.168.222.138 tomcat、jenkins git maven RHEL8/centos8 node2 192.168.222.139 tomcat 无 RHEL8/centos8

1、关闭防火墙和selinux

[root@jenkins ~]# systemctl stop firewalld.service
[root@jenkins ~]# vim /etc/selinux/config
SELINUX=disabled
[root@jenkins ~]# setenforce 0
[root@jenkins ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

2、在jenkins上部署服务tomcat和jenkins(上面已经部署),重新部署,登录web界面时选择安装推荐的插件,部署好后,设置国内源
安装jdk

[root@jenkins ~]# dnf -y install java-11-openjdk

下载tomcat,解压tomcat,并部署安装

root@jenkins ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
[root@jenkins ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.67.tar.gz
[root@jenkins ~]# tar xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
[root@jenkins ~]# cd /usr/local/
[root@jenkins local]# ln -s apache-tomcat-9.0.67/ tomcat

启动tomcat,测试能否访问tomcat首页

[root@jenkins local]# cd tomcat/
[root@jenkins tomcat]# bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

访问:

Jenkins
部署jenkins
下载jenkins到/usr/local/tomcat/webapps/目录下
官网地址
Jenkins
Jenkins
[root@jenkins tomcat]# cd
[root@jenkins ~]# cd /usr/local/tomcat/webapps/
[root@jenkins webapps]# pwd
/usr/local/tomcat/webapps

下载下来后会自动解压

[root@jenkins webapps]# wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war
[root@jenkins webapps]# ls
ROOT  docs  examples  host-manager  jenkins.war  manager

启动服务

[root@jenkins webapps]# cd /usr/local/tomcat/
[root@jenkins tomcat]# pwd
/usr/local/tomcat
[root@jenkins tomcat]# bin/catalina.sh stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
[root@jenkins tomcat]# bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

浏览器访问jinkins
直接在http://192.168.222.138:8080/后面加jinkins就可以访问到

Jenkins
查看上图框出来的文件,该文件中记录这密码,复制密码并登录
root@jenkins tomcat]# cat /root/.jenkins/secrets/initialAdminPassword
fc3a1c3be0d94327a9ba48790f2ebfbb

Jenkins
使用推荐插件进行安装
Jenkins
Jenkins
Jenkins
Jenkins
Jenkins
Jenkins
点击 Advanced —> 更新为国内源 —> Submit
原国外插件源地址:https://updates.jenkins.io/update-center.json
国内插件源地址:https://mirror.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
Jenkins
Jenkins
往下面翻
Jenkins
3、先在jenkins主机上生成一个密钥,传给node2主机
[root@jenkins ~]# ssh-keygen
Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): //回车
Created directory '/root/.ssh'.

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:ZYs4NKha67nu0hX2GP7sXokv4f6IXMBNLCsS8iPKjCw root@jenkins
The key's randomart image is:  //回车
+---[RSA 3072]----+
|                 |
|     o           |
|o   o =   o      |
|.o o+* o + .     |
|o *o+=+ S .      |
|*= ++.oo .       |
|E=.. +o.o        |
|o..o o=+         |
| +*.o+=oo        |
+----[SHA256]-----+
[root@jenkins ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.222.139
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.222.139 (192.168.222.139)' can't be established.

ECDSA key fingerprint is SHA256:anVVbTlEIzA1E8rB7IbLzaf7t9oQjB0qFP6Dd/ijnJI.

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/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
root@192.168.222.139's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.222.139'"
and check to make sure that only the key(s) you wanted were added.

可以提前做一个映射,防止访问不了github

[root@jenkins ~]# vim /etc/hosts
[root@jenkins ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
20.205.243.166 github.com    //添加

4、在node2上部署tomcat

[root@node2 ~]# systemctl stop firewalld.service
[root@node2 ~]# vim /etc/selinux/config
SELINUX=disabled
[root@node2 ~]# setenforce 0
[root@node2 ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@node2 ~]# dnf  -y install java-11-openjdk
[root@node2 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
[root@node2 ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.67.tar.gz
[root@node2 ~]# tar xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
[root@node2 ~]# cd /usr/local/
[root@node2 local]#  ln -s apache-tomcat-9.0.67/ tomcat
[root@node2 local]# ls tomcat/
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs  webapps
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   temp  work
[root@node2 local]# cd tomcat/
[root@node2 tomcat]# bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

进行访问:

Jenkins
可以提前做一个映射,防止访问不了github
[root@node2 ~]# vim /etc/hosts
[root@node2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
20.205.243.166 github.com    //添加

5、在node1中配置jenkins
创建任务

Jenkins
创建流水线任务
Jenkins
发布流水线的方法我在这里给大家介绍两种,一种是脚本的方式,一种是使用文本参数的方式
首选都需要在jinkins所在服务器,也就是jenkins中安装git和maven
[root@jenkins ~]# dnf -y install git maven

就是通过文本参数来实现流水线项目发布
添加文本参数

Jenkins
添加git下载信息 http://github.com/lizhenliang/tomcat-java-demo.git
Jenkins
添加字符参数,打包
Jenkins
Jenkins
添加字符参数 定义tomcat路径
Jenkins
Jenkins
添加文本参数 定义客户端ip
Jenkins
Jenkins
编写流水线脚本
pipeline {
    agent any

    stages {
        stage('pull code') {
            steps {
                git "http://github.com/lizhenliang/tomcat-java-demo.git"
            }
        }
        stage('package') {
            steps {
                sh """
                mvn clean
                mvn package
"""
            }
        }
        stage('deploy') {
            steps {
                                sh """
                                scp target/ly-simple-tomcat-0.0.1-SNAPSHOT.war root@192.168.222.139:/usr/local/tomcat/webapps/
                                ssh root@192.168.222.139 '/usr/local/tomcat/bin/catalina.sh stop && /usr/local/tomcat/bin/catalina.sh start'
"""
            }
        }
    }
}

Jenkins
进行创建,并查看刚刚定义好的变量参数值
Jenkins
构建
Jenkins
Jenkins
在node2上面查看刚刚脚本创建的内容
[root@node2 ~]# cd /usr/local/tomcat/webapps/
[root@node2 webapps]# ls
ROOT  examples      ly-simple-tomcat-0.0.1-SNAPSHOT      manager
docs  host-manager  ly-simple-tomcat-0.0.1-SNAPSHOT.war

进行访问
http://192.168.222.139:8080/ly-simple-tomcat-0.0.1-SNAPSHOT/

Jenkins

Original: https://www.cnblogs.com/tushanbu/p/16744355.html
Author: 涂山布
Title: Jenkins

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573936/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 每天一个 HTTP 状态码 103

    103 Earyly Hints 是被用于在最终的 HTTP 消息前返回一些响应头… 103 Early Hints 103 Earyly Hints 是被用于在最终 …

    Linux 2023年6月7日
    0115
  • 部署solr服务

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一、S orl单机部署 准备:solr5.5、tomcat8.5、jdk1.8 2.复制./solr-5.5.0/s…

    Linux 2023年6月14日
    0125
  • termius好用的shell终端

    ipad下可用 posted @2022-07-23 12:41 jiftle 阅读(75 ) 评论() 编辑 Original: https://www.cnblogs.com/…

    Linux 2023年5月28日
    0115
  • 标签泄露 Label leaking

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    096
  • spring boot @Validated注解不生效[转]

    问题: 接口上添加了@Validated注解,但是bindingResult.hasErrors()的结果却是false,即一直不能返回验证信息,@Validated不生效,排查了…

    Linux 2023年6月8日
    0103
  • 面试题汇总

    JAVA 基础 1.java 性能优化 ①尽量指定类、方法的final 修饰符 ②尽量重用对象 ③尽可能使用局部变量 ④及时关闭流 ⑤尽量减少对变量的重复计算 ⑥尽量采用懒加载的策…

    Linux 2023年6月7日
    094
  • SQLI-LABS(Less-8)

    Less-8(GET-Blind-Boolean Based-Single Quotes) 打开 Less-8页面,可以看到页面中间有一句 Please input the ID …

    Linux 2023年6月6日
    092
  • Linux下如何切割与合并大文件

    我们传输一个大文件时,有时网络比较慢,需要花费很长时间才能传输完成,或者传输的过程中,网络不稳定,有可能导致此次传输失败,针对这种情况,我们可以把大文件切分成小文件,再逐个的传输到…

    Linux 2023年6月13日
    0121
  • 进程补充

    一、僵尸进程与孤儿进程 僵尸进程 当一个子进程结束运行(一般是调用exit、运行时发生致命错误或收到终止信号所导致)时,子进程的退出状态(返回值)会回报给操作系统,系统则以SIGC…

    Linux 2023年6月14日
    073
  • npm 和 maven 使用 Nexus3 私服 | 前后端一起学

    前文《Docker 搭建 Nexus3 私服 》介绍了在 docker 环境下安装 nexus3 以及 nexus3 的基本操作和管理,本文分别介绍 npm(前端)和 maven(…

    Linux 2023年6月7日
    074
  • 大数据之Hadoop集群的HDFS压力测试

    测试HDFS写性能 原文:sw-code1)写测试的原理 2)测试内容:向HDFS集群写10个128MB的文件(3个机器每个4核,2 * 4 = 8 < 10 < 3 …

    Linux 2023年6月8日
    094
  • 3-在Django中使用使用数据库

    数据库设置 在上一章节中学习了如何创建Django项目,在Django项目中创建web应用,以及如何在Django主程序的URL中引用web应用中的URL。下面来了解如何在Djan…

    Linux 2023年6月7日
    0116
  • Docker Manager for Docker Swarm deploy

    一、Swarm概述 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swa…

    Linux 2023年6月14日
    0116
  • 2020年12月-第02阶段-前端基础-CSS Day07

    CSS Day07 CSS高级技巧 *理解 能说出元素显示隐藏最常见的写法能说出精灵图产生的目的能说出去除图片底侧空白缝隙的方法 *应用 能写出最常见的鼠标样式能使用精灵图技术能用…

    Linux 2023年6月8日
    0131
  • 关于 Promise 的一些简单理解

    一、ES6 中的 Promise 1、JS 如何解决 异步问题? (1)什么是 同步、异步?同步指的是 需要等待 前一个处理 完成,才会进行 下一个处理。异步指的是 不需要等待 前…

    Linux 2023年6月11日
    0117
  • LeetCode 406.根据身高重建队列 | 解题思路及代码

    There are (n) people, we want them line up in the following way. Given a two-dimensional a…

    Linux 2023年6月13日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球