当前位置: 首页 > news >正文

Jenkins--从入门到入土

Jenkins–从入门到入土

文章目录

  • Jenkins--从入门到入土
    • 〇、概念提要--什么是CI/DI?
      • 1、CI(Continuous Integration,持续集成)
      • 2、DI(DevOps Integration,DevOps 集成)
      • 3、解决的问题
    • 一、Jenkins安装部署
      • 1、什么是Jenkins?
      • 2、Jenkins在开发过程中所属位置
      • 3、安装硬件环境和知识储备
      • 4、安装
        • 4.1、下载war启动
        • 4.2、Docker启动
        • 4.3、windows使用驱动安装
      • 5、使用插件自定义 Jenkins
      • 6、创建第一个管理员用户
    • 二、Jenkins配置
      • 1、环境配置
        • 1.1、更换站点镜像
        • 1.2、全局工具的配置
      • 2、用户权限配置
      • 3、插件介绍
    • 三、配置自动化任务--自由风格
      • 1、两种执行方法
      • 2、安装插件
      • 3、搭建GitLab
        • 3.1、从docker compose快速搭建GitLab
        • 3.2、上传到服务器
      • 4、github整合Jenkins
        • 4.1、关联github
        • 4.2、Jenkins中的github的配置
        • 4.3、新建任务
        • 4.4、立即构建
        • 4.5、Github代码更新之后触发构建
    • 四、配置自动化任务--Pipeline
      • 1、安装Blue Ocean插件
      • 2、新建Github测试项目
      • 3、编写Jenkinsfile文件
      • 4、推送到github项目中
      • 5、操作流水线Blue Ocean
      • 6、选择仓库创建流水线

温馨提示:由于本文档写的比较杂,基本讲了很多东西,所以自己根据目录筛选自己需要的部分。

〇、概念提要–什么是CI/DI?

1、CI(Continuous Integration,持续集成)

  • 定义:持续集成是一种软件开发实践,开发人员频繁地将代码更改集成到共享代码库中。每次集成都触发自动构建和测试,以尽早发现错误并提高软件质量。
  • 关键特点
    • 频繁集成:开发人员每天多次将代码提交到版本控制系统。
    • 自动化构建和测试:每次提交代码后,系统会自动构建项目并运行自动化测试。
    • 快速反馈:开发人员可以迅速知道他们的代码是否引入了错误。
    • 集成工具:常用工具包括Jenkins、Travis CI、CircleCI等。

2、DI(DevOps Integration,DevOps 集成)

  • 定义:DevOps集成是一种将开发和运维团队的工作流程、工具和文化相结合的实践,旨在提高软件开发和交付的速度和质量。
  • 关键特点
    • 自动化:通过自动化的构建、测试、部署和监控,减少手动干预,降低错误率。
    • 持续交付(CD):实现代码从开发到生产环境的自动化部署。
    • 协作:开发和运维团队紧密合作,共享责任,共同优化流程。
    • 常用工具:包括Docker、Kubernetes、Ansible、Puppet、Chef等。

3、解决的问题

CI和DI在计算机领域分别强调持续集成和DevOps实践中的集成部分,通过自动化和协作提高软件开发和交付的效率和质量。

持续的集成部署解决了很多问题,使得工作变成一种流程的形式,我们就负责编码(code)的内容,其他环节都是自动化的部署完成。

image-20240524153806030

“You build it , you run it !”

一、Jenkins安装部署

1、什么是Jenkins?

image-20240521144411533

Build great things at any scale,The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.

Jenkins官方 ,Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

Jenkins文档下载

2、Jenkins在开发过程中所属位置

主流软件开发流程:

Jenkins在Kubernetes中持续部署

3、安装硬件环境和知识储备

机器要求:

  • 256 MB 内存,建议大于 512 MB

  • 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)

环境要求:

  • Java8(由于Jenkins是由Java语言编写,所以需要 JRE 或者 JDK环境)
  • Docker (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载

4、安装

4.1、下载war启动
  1. 下载War包:http://mirrors.jenkins.io/war-stable/latest/jenkins.war

    mkdir -p /opt/jenkins
    wget -O /opt/jenkins/jenkins.war http://mirrors.jenkins.io/war-stable/latest/jenkins.war
    
  2. 打开终端进入到下载目录.

     cd /opt/jenkins
    
  3. 运行命令 java -jar jenkins.war --httpPort=8080.

    java -jar jenkins.war --httpPort=8080
    
  4. 打开浏览器进入链接 http://localhost:8080.

    image-20240524105733698

  5. 按照说明完成安装.

参考链接https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/

4.2、Docker启动

docker安装文档:在CentOS中安装Docker

  1. 搜索Docker镜像:

    版本选择:

    Jenkins: https://hub.docker.com/r/jenkins/jenkins/

    Jenkins with Blue Ocean: https://hub.docker.com/r/jenkinsci/blueocean

    image-20240522180452702

    使用命令:

    docker pull jenkins/jenkins#24版本的docker镜像,因为我发现存在问题,当安装依赖的时候,换个版本可以。
    docker pull  jenkins/jenkins:2.459-jdk17
    
  2. 在Docker中设置桥接网络

    docker network create jenkins
    
  3. 启动(三组命令,自行甄别)

    # 官方给出的命令
    docker run \--name jenkins-docker \--rm \--detach \--privileged \--network jenkins \--network-alias docker \--env DOCKER_TLS_CERTDIR=/certs \--volume jenkins-docker-certs:/certs/client \--volume jenkins-data:/var/jenkins_home \--publish 2376:2376 \docker:dind \--storage-driver overlay2# Jenkins
    docker run \-itd \-u root \-p 8080:8080 \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkins/jenkins#Jenkins blueoceandocker run  \-itd  \-u root   \-p 8080:8079   \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock  \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkinsci/blueocean# Jenkins 2.459 版本docker run  \-itd  \-u root   \-p 8080:8080   \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock  \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkins/jenkins:2.459-jdk17
  4. 查看启动状态:

    docker ps
    

    image-20240524162358779

  5. 查看日志

    docker logs jenkins-master  
    

    后面的参数是容器的参数,重点看下面这个:

    image-20240524162519031

  6. 访问:http://192.168.200.128:2376/

参考文档:https://www.jenkins.io/doc/book/installing/docker/

4.3、windows使用驱动安装
  1. 首先下载镜像:官网

    image-20240522185553500

  2. 确保安装了Java环境,并且安装环境变量,我这里使用JDK 21演示

    image-20240522185714105

  3. Jenkins启动

    image-20240522185926936

    image-20240522190957509

    image-20240522191052458

    image-20240522191140747

    image-20240522191216798

    image-20240522191230811

    image-20240522191245707

    image-20240522191257725

    安装完成!

  4. 打开安装目录,我的在E:\Software\Jenkins,安装中有涉及,请留意。

    image-20240522191642821

  5. 打开jenkins.xml配置文件,设置Jenkins环境变量和Java环境变量

    image-20240522192012862

    换成:

    image-20240522192342863

    但是我发现配置不修改应该也是可以运行的,只是官方这样操作的,我只换了JAVA_HOME

  6. 搜索service,打开Jenkins服务。

    image-20240522193156980

    在这里插入图片描述

  7. 浏览器访问预先设置好的端口http://localhost:8079/:

    image-20240522193448151

  8. 查看管理员密码image-20240522193720322

    image-20240522193800820

5、使用插件自定义 Jenkins

解锁 Jenkins后,会出现**“自定义 Jenkins”**页面。在这里,您可以安装任意数量的有用插件作为初始设置的一部分。

单击显示的两个选项之一:

  • 安装建议的插件- 安装推荐的插件集,这些插件基于最常见的用例。
  • 选择要安装的插件- 选择最初安装的插件集。当您第一次访问插件选择页面时,默认选择建议的插件。

设置向导显示 Jenkins 的配置进度以及您选择的 Jenkins 插件安装集。此过程可能需要几分钟。

如果不确定需要什么插件,请选择安装建议的插件。您可以稍后通过 Jenkins 中的管理 Jenkins > 插件页面安装(或删除)其他 Jenkins 插件。

6、创建第一个管理员用户

最后,在使用插件自定义 Jenkins后,Jenkins 会要求您创建第一个管理员用户。

  1. 当**“创建第一个管理员用户”**页面出现时,在相应字段中指定管理员用户的详细信息,然后单击“保存并完成”
  2. Jenkins 就绪页面出现时,单击Start using Jenkins
  3. 如果需要,请使用您刚刚创建的用户凭据登录 Jenkins,然后就可以开始使用 Jenkins 了!

二、Jenkins配置

1、环境配置

1.1、更换站点镜像

具体流程:

image-20240524170556997

将升级站点的URL更换成清华镜像:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json

这样插件下载就会从镜像进行下载,相对来说下载更快。

1.2、全局工具的配置

image-20240524180523227

  • JDK:

    image-20240524180548087

  • Git:

    image-20240524180612658

还有其他环境中的工具配置。

2、用户权限配置

  • 矩阵权限的配置

  • 添加管理员用户所有的权限

  • 添加Authorize Project | Jenkins plugin)插件,并且在系统管理中进行配置。配置逻辑,就给用户当前项目的矩阵权限!

    示例:

    image-20240524180316934

3、插件介绍

  • Publish over SSH

    这个是一个远程Shell工具,可以远程去执行一些shell命令

  • HTTP Request Plugin

    跨平台调用,在构建前后可以通过该插件以http形式调用各种api接口实现和内部系统的联动

  • Publish Over FTP

    用于远程使用FTP发布,比较合适于静态资源的发布。

  • Performance Plugin

​ 该插件可以读取和解析测试框架输出的报告,并且在 Jenkins 上绘制性能和稳定性相关的图表。Performance Plugin 支持的测试框架有 JUnit、JMeter, Twitter 的 Lago 和 Taurus。

​ https://plugins.jenkins.io/performance

  • Gitlab Merge Request Builder Plugin

​ Gitlab Merge Request Builder Plugin 可以方便的自动发起代码审查,它在创建 pull request 的时候,会自动带上关联任务的运行结果,以方便代码审查着确认改动的正确性。

​ 同时,这款插件还支持自动合并,既在代码审查通过后自动合并该 pull request 内容。

​ https://github.com/timols/jenkins-gitlab-merge-request-builder-plugin

  • JIRA Plugin

​ JIRA Plugin 可以让 Jenkins 任务和 JIRA 集成起来,这样项目管理者可以通过 JIRA 了解项目进度,开发者也可以通过该插件直接更改 JIRA 上的 issue 状态。

​ https://plugins.jenkins.io/jira

  • Kubernetes Plugin

​ 和最近大热的容器编排框架 Kubernetes 集成当然不能落下了。另外,Jenkins 对执行机的管理一直比较弱,无法做到快速的扩容和缩容。Kubernetes Plugin 通过引入 Kubernetes 的容器编排能力,让 Jenkins 执行机运行在 Kubernetes 环境中。

​ https://github.com/jenkinsci/kubernetes-plugin

  • Build Pipeline plugin

    https://github.com/jenkinsci/build-pipeline-plugin

​ 对一个系统的持续集成会包含很多个方面,如果将它们都杂糅在一个 Jenkins 任务中,会提高排查成本,也不利于整个持续集成的运作。Build Pipeline plugin 可以让项目管理员针对系统持续集成步骤设置一系列关联的任务,任务之间可以设置不同的触发条件,以确认何时需要人工介入。该插件可以让整个持续集成流程变得非常直观:

image-20240524181357541

上述内容部分参考于链接:https://www.jianshu.com/p/6bcb2853fae2

三、配置自动化任务–自由风格

1、两种执行方法

  • 配置自由风格的项目
  • 配置Pipeline使用Jenkinsfile

2、安装插件

  • 版本控制

    • github
    • gitlab

    image-20240524182419991

  • SSH

    • SSH
    • Publish Over SSH
    • SSH Agent
    • SSH Pipeline Steps

    image-20240524182126772

3、搭建GitLab

3.1、从docker compose快速搭建GitLab

这里我们使用GitLab来测试。

使用docker compose在docker环境下快速部署:

搭建docker compose环境参考文章:docker compose快速安装

学习docker compose参考文章(本篇博客不需要,只是推荐学习)DockerCompose(初识、安装、部署) Docker Compose 命令说明文档

docker-compose.yaml文件链接:https://github.com/sameersbn/docker-gitlab/blob/master/docker-compose.yml

image-20240524183353761

可以点击下载,也可以新建docker-compose.yaml文件,将内容复制粘贴。

也可以直接复制(但是建议从官网下载,可能版本会更新之类的):

version: '2.3'services:redis:restart: alwaysimage: redis:6.2command:- --loglevel warningvolumes:- redis-data:/data:Zpostgresql:restart: alwaysimage: sameersbn/postgresql:14-20230628volumes:- postgresql-data:/var/lib/postgresql:Zenvironment:- DB_USER=gitlab- DB_PASS=password- DB_NAME=gitlabhq_production- DB_EXTENSION=pg_trgm,btree_gistgitlab:restart: alwaysimage: sameersbn/gitlab:17.0.0depends_on:- redis- postgresqlports:- "10080:80"- "10022:22"volumes:- gitlab-data:/home/git/data:Zhealthcheck:test: ["CMD", "/usr/local/sbin/healthcheck"]interval: 5mtimeout: 10sretries: 3start_period: 5menvironment:- DEBUG=false- DB_ADAPTER=postgresql- DB_HOST=postgresql- DB_PORT=5432- DB_USER=gitlab- DB_PASS=password- DB_NAME=gitlabhq_production- REDIS_HOST=redis- REDIS_PORT=6379- TZ=Asia/Kolkata- GITLAB_TIMEZONE=Kolkata- GITLAB_HTTPS=false- SSL_SELF_SIGNED=false- GITLAB_HOST=- GITLAB_PORT=10080- GITLAB_SSH_PORT=10022- GITLAB_RELATIVE_URL_ROOT=- GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_ROOT_PASSWORD=- GITLAB_ROOT_EMAIL=- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true- GITLAB_NOTIFY_PUSHER=false- GITLAB_EMAIL=notifications@example.com- GITLAB_EMAIL_REPLY_TO=noreply@example.com- GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com- GITLAB_BACKUP_SCHEDULE=daily- GITLAB_BACKUP_TIME=01:00- SMTP_ENABLED=false- SMTP_DOMAIN=www.example.com- SMTP_HOST=smtp.gmail.com- SMTP_PORT=587- SMTP_USER=mailer@example.com- SMTP_PASS=password- SMTP_STARTTLS=true- SMTP_AUTHENTICATION=login- IMAP_ENABLED=false- IMAP_HOST=imap.gmail.com- IMAP_PORT=993- IMAP_USER=mailer@example.com- IMAP_PASS=password- IMAP_SSL=true- IMAP_STARTTLS=false- OAUTH_ENABLED=false- OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=- OAUTH_ALLOW_SSO=- OAUTH_BLOCK_AUTO_CREATED_USERS=true- OAUTH_AUTO_LINK_LDAP_USER=false- OAUTH_AUTO_LINK_SAML_USER=false- OAUTH_EXTERNAL_PROVIDERS=- OAUTH_CAS3_LABEL=cas3- OAUTH_CAS3_SERVER=- OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false- OAUTH_CAS3_LOGIN_URL=/cas/login- OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate- OAUTH_CAS3_LOGOUT_URL=/cas/logout- OAUTH_GOOGLE_API_KEY=- OAUTH_GOOGLE_APP_SECRET=- OAUTH_GOOGLE_RESTRICT_DOMAIN=- OAUTH_FACEBOOK_API_KEY=- OAUTH_FACEBOOK_APP_SECRET=- OAUTH_TWITTER_API_KEY=- OAUTH_TWITTER_APP_SECRET=- OAUTH_GITHUB_API_KEY=- OAUTH_GITHUB_APP_SECRET=- OAUTH_GITHUB_URL=- OAUTH_GITHUB_VERIFY_SSL=- OAUTH_GITLAB_API_KEY=- OAUTH_GITLAB_APP_SECRET=- OAUTH_BITBUCKET_API_KEY=- OAUTH_BITBUCKET_APP_SECRET=- OAUTH_BITBUCKET_URL=- OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=- OAUTH_SAML_IDP_CERT_FINGERPRINT=- OAUTH_SAML_IDP_SSO_TARGET_URL=- OAUTH_SAML_ISSUER=- OAUTH_SAML_LABEL="Our SAML Provider"- OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient- OAUTH_SAML_GROUPS_ATTRIBUTE=- OAUTH_SAML_EXTERNAL_GROUPS=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_USERNAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=- OAUTH_CROWD_SERVER_URL=- OAUTH_CROWD_APP_NAME=- OAUTH_CROWD_APP_PASSWORD=- OAUTH_AUTH0_CLIENT_ID=- OAUTH_AUTH0_CLIENT_SECRET=- OAUTH_AUTH0_DOMAIN=- OAUTH_AUTH0_SCOPE=- OAUTH_AZURE_API_KEY=- OAUTH_AZURE_API_SECRET=- OAUTH_AZURE_TENANT_ID=volumes:redis-data:postgresql-data:gitlab-data:

打开编辑文件内容:

image-20240524184143182

3.2、上传到服务器
  1. 新建文件夹:

    mkdir /home/gitlab
    
  2. 上传文件docker-compose.yaml,也可以新建文件,将内容粘贴过去。

    image-20240524184829197

  3. 启动docker compose

    docker-compose up -d
    
    • -d参数:后台启动。
  4. 使用docker ps命令可以看见新增的三个docker容器:

    image-20240524190730297

  5. 浏览器访问:192.168.200.128:80即可进入GitLab的页面。

    本来我想用GitLab来整合Jenkins,但是服务器资源受限,没有配置成功,我换成了github来演示。

4、github整合Jenkins

4.1、关联github
  1. 打开github,找到Settings,找到Developer Settings,打开Psonal access tokens中的Tokens (classic),点击Generate a personal access token生成新的token。

    image-20240526132053005

  2. 填写Note,勾选下面的两个选项。

    image-20240526132356069

  3. 点击生成

    image-20240526132451337

  4. 确保复制你的token,请确保立即复制您的个人访问令牌。你再也看不到了!

    image-20240526132524834

  5. 选择你的项目,创建webhook

    image-20240526143036767

4.2、Jenkins中的github的配置

打开设置:

image-20240526153927365

在设置中找到github的选项(往下划),按照如下操作,添加Github服务器:

image-20240526153403520

上述第4步添加凭据,注意:必须是具有操作权限的github的账户!!

image-20240526153618578

添加并保存退出即可!

4.3、新建任务
  1. 新建Item

    image-20240526154453857

  2. General

  • 添加描述:

image-20240526154548087

  • 添加Github项目地址:

image-20240526154812220

  1. 源码管理:

    • image-20240526155132270

    • 添加Credentials:本篇博客的4.2中的第四步讲到,操作相同,不再赘述。

    • 设置分支

      image-20240526155347509

  2. 构建触发器:

    image-20240526170308832

  3. 构建环境

    image-20240526155751453

    凭据没有的话直接添加就行:

    image-20240526160018806

  4. Build Steps:构建步骤:

    • Set build status to “pending” on GitHub commit

      image-20240526160247886

    • 执行 shell

      image-20240526160401586

  5. 构建后操作

    image-20240526160506678

  6. 最后设置完毕保存即可。

来自曼诺尔雷迪亚兹的提示:上述的配置项只是为了了解并熟悉Jenkins,并且进行快速入门,具体的配置详情可以根据业务需求和个人喜好来具体设置不同的参数。

4.4、立即构建

image-20240526162042927

image-20240526162214977

image-20240526162240293

查看控制台输出:

image-20240526162259337

image-20240526162415535

4.5、Github代码更新之后触发构建
  1. 对代码进行更新并推送

    image-20240526162935826

    Github代码:

    image-20240526163014754

  2. 自动构建:

    image-20240526170200399

  3. 构建成功

    image-20240526170342899

四、配置自动化任务–Pipeline

1、安装Blue Ocean插件

image-20240526172129605

image-20240526172511622

image-20240526172607753

返回控制台就可以看见:

image-20240526172621220

2、新建Github测试项目

image-20240526172747746

我克隆在本地了,因为我要添加一个文件,也可以在Github中添加文件:

本地:

image-20240526172911488

github:

image-20240526172932672

3、编写Jenkinsfile文件

Jenkins流水线官方中文文档 学习Jenkins流水线。

在项目中新建文件Jenkinsfile,文件内容如下:

pipeline {agent {docker{images 'node:10'args '-p 20000:8080'}} stages {stage('Build') { steps {sh 'node -v'sh 'echo "hello world !!"'}}// stage('Test') { //     steps {//         // //     }// }// stage('Deploy') { //     steps {//         // //     }// }}
}

这个 Jenkins Pipeline 使用 Docker 作为代理,在一个包含 Node.js 的 Docker 容器中执行构建步骤。

4、推送到github项目中

image-20240526174313173

5、操作流水线Blue Ocean

  1. 打开Blue Ocean

    image-20240526174406531

  2. 创建流水线

    image-20240526174901301

    需要注意的是,这里的token权限必须要有repo和user:emil才可以,没有的话重新创建token,参照本博客4.1.

    image-20240526174756762

6、选择仓库创建流水线

image-20240526175156571

创建中:

image-20240526175242020

http://www.lryc.cn/news/354320.html

相关文章:

  • 文心一言 VS 讯飞星火 VS chatgpt (267)-- 算法导论20.2 2题
  • C 语言设计模式(结构型)
  • 【云原生--K8S】K8S python接口研究
  • 5.26作业
  • 链接库文件体积优化工具篇:bloaty
  • 使用pyqt绘制一个爱心!
  • 关于 Transformer 的11个常见面试题
  • OS多核多线程锁记录笔记
  • nginx做TCP代理
  • python 异常处理 try
  • 月入10万+管道收益,揭秘旅游卡运营的5个阶段!
  • android_binder源码分析之_binder驱动使用服务
  • 【波点音乐看广告】
  • [SWPUCTF 2021 新生赛]pop
  • 【DevOps】Jenkins + Dockerfile自动部署Maven(SpringBoot)项目
  • 【C++】——入门基础知识超详解
  • ChatGPT技术演进简介
  • C语言 | Leetcode C语言题解之第114题二叉树展开为链表
  • Vue 子组件向父组件传值
  • 【前端笔记】Vue项目报错Error: Cannot find module ‘webpack/lib/RuleSet‘
  • edge浏览器的网页复制
  • 视频播放器-Kodi
  • Helm安装kafka3.7.0无持久化(KRaft 模式集群)
  • 【机器学习】期望最大化(EM)算法
  • 【Python】机器学习中的过采样和欠采样:处理不平衡数据集的关键技术
  • 重新思考:Netflix 的边缘负载均衡
  • 元组的创建和删除
  • CSS3用户界面
  • STL源码刨析:序列式容器之vector
  • Flutter 中的 AbsorbPointer 小部件:全面指南