1597 lines
649 KiB
HTML
1597 lines
649 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh"><head><title>Jenkins</title><meta charset="utf-8"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&family=Noto Serif Simplified Chinese:wght@400;700&family=Source Sans Pro:ital,wght@0,400;0,600;1,400;1,600&display=swap"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="Jenkins"/><meta property="og:description" content="Jenkins 概述 Jenkins 是什么 Jenkins 是一种广泛使用的开源自动化服务器,旨在简化和自动化软件开发过程中的各种任务,特别是在持续集成(CI)和持续交付(CD)方面。 持续集成是一种软件开发实践,强调频繁地将代码集成到共享代码库中,并自动进行构建和测试,以尽早发现和解决集成问题。持续交付进一步扩展了这一概念,通过自动化部署管道,使得代码可以在任何时间点安全地部署到生产环境中。Jenkins ..."/><meta property="og:image" content="https://wiki.7wate.com/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../../../static/icon.png"/><meta name="description" content="Jenkins 概述 Jenkins 是什么 Jenkins 是一种广泛使用的开源自动化服务器,旨在简化和自动化软件开发过程中的各种任务,特别是在持续集成(CI)和持续交付(CD)方面。 持续集成是一种软件开发实践,强调频繁地将代码集成到共享代码库中,并自动进行构建和测试,以尽早发现和解决集成问题。持续交付进一步扩展了这一概念,通过自动化部署管道,使得代码可以在任何时间点安全地部署到生产环境中。Jenkins ..."/><meta name="generator" content="Quartz"/><link href="../../../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><script src="../../../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch("../../../static/contentIndex.json").then(data => data.json())</script></head><body data-slug="Technology/SoftwareEngineering/CI-and-CD/Jenkins"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h2 class="page-title"><a href="../../..">🪴 X·Eden</a></h2><div class="spacer mobile-only"></div><div class="search"><button class="search-button" id="search-button"><p>搜索</p><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title>Search</title><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></button><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="搜索些什么" placeholder="搜索些什么"/><div id="search-layout" data-preview="true"></div></div></div></div><button class="darkmode" id="darkmode"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35" xml:space="preserve" aria-label="暗色模式"><title>暗色模式</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="nightIcon" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background:new 0 0 100 100" xml:space="preserve" aria-label="亮色模式"><title>亮色模式</title><path d="M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.008-14.65,35.369 c0,13.36,5.203,25.921,14.65,35.368s22.008,14.65,35.368,14.65c13.361,0,25.921-5.203,35.369-14.65 c3.872-3.871,7.064-8.328,9.491-13.246C97.826,68.608,97.611,67.309,96.76,66.458z"></path></svg></button><div class="explorer desktop-only"><button type="button" id="explorer" data-behavior="collapse" data-collapsed="collapsed" data-savestate="true" data-tree="[{"path":"Personal","collapsed":true},{"path":"Personal/Blog","collapsed":true},{"path":"Personal/Blog/2018","collapsed":true},{"path":"Personal/Blog/2020","collapsed":true},{"path":"Personal/Blog/2021","collapsed":true},{"path":"Personal/Blog/2022","collapsed":true},{"path":"Personal/Blog/2023","collapsed":true},{"path":"Personal/Blog/2024","collapsed":true},{"path":"Personal/Book","collapsed":true},{"path":"Personal/Book/个人成长","collapsed":true},{"path":"Personal/Book/医学健康","collapsed":true},{"path":"Personal/Book/历史","collapsed":true},{"path":"Personal/Book/哲学宗教","collapsed":true},{"path":"Personal/Book/心理","collapsed":true},{"path":"Personal/Book/政治军事","collapsed":true},{"path":"Personal/Book/教育学习","collapsed":true},{"path":"Personal/Book/文学","collapsed":true},{"path":"Personal/Book/生活百科","collapsed":true},{"path":"Personal/Book/社会文化","collapsed":true},{"path":"Personal/Book/科学技术","collapsed":true},{"path":"Personal/Book/经济理财","collapsed":true},{"path":"Personal/Book/艺术","collapsed":true},{"path":"Personal/Book/计算机","collapsed":true},{"path":"Personal/Journal","collapsed":true},{"path":"Personal/Journal/2022","collapsed":true},{"path":"Personal/Journal/2022/W34","collapsed":true},{"path":"Personal/Journal/2022/W35","collapsed":true},{"path":"Personal/Journal/2022/W36","collapsed":true},{"path":"Personal/Journal/2022/W37","collapsed":true},{"path":"Personal/Journal/2022/W38","collapsed":true},{"path":"Personal/Journal/2022/W39","collapsed":true},{"path":"Personal/Journal/2022/W41","collapsed":true},{"path":"Personal/Journal/2022/W42","collapsed":true},{"path":"Personal/Journal/2022/W43","collapsed":true},{"path":"Personal/Journal/2022/W44","collapsed":true},{"path":"Personal/Journal/2022/W45","collapsed":true},{"path":"Personal/Journal/2022/W46","collapsed":true},{"path":"Personal/Journal/2022/W47","collapsed":true},{"path":"Personal/Journal/2022/W48","collapsed":true},{"path":"Personal/Journal/2022/W49","collapsed":true},{"path":"Personal/Journal/2022/W50","collapsed":true},{"path":"Personal/Journal/2023","collapsed":true},{"path":"Personal/Journal/2023/W2","collapsed":true},{"path":"Personal/Journal/2023/W3","collapsed":true},{"path":"Personal/Journal/2023/W5","collapsed":true},{"path":"Personal/Journal/2023/W6","collapsed":true},{"path":"Personal/Journal/2023/W7","collapsed":true},{"path":"Personal/Journal/2023/W8","collapsed":true},{"path":"Personal/Journal/2023/W10","collapsed":true},{"path":"Personal/Journal/2023/W12","collapsed":true},{"path":"Personal/Journal/2023/W14","collapsed":true},{"path":"Personal/Journal/2023/W16","collapsed":true},{"path":"Personal/Journal/2023/W22","collapsed":true},{"path":"Personal/Journal/2023/W23","collapsed":true},{"path":"Personal/Journal/2023/W24","collapsed":true},{"path":"Personal/Journal/2023/W25","collapsed":true},{"path":"Personal/Journal/2023/W26","collapsed":true},{"path":"Personal/Journal/2023/W31","collapsed":true},{"path":"Personal/Journal/2023/W32","collapsed":true},{"path":"Personal/Journal/2023/W33","collapsed":true},{"path":"Personal/Journal/2023/W35","collapsed":true},{"path":"Personal/Journal/2023/W36","collapsed":true},{"path":"Personal/Journal/2023/W37","collapsed":true},{"path":"Personal/Journal/2023/W40","collapsed":true},{"path":"Personal/Journal/2023/W45","collapsed":true},{"path":"Personal/Journal/2023/W46","collapsed":true},{"path":"Personal/Journal/2023/W48","collapsed":true},{"path":"Personal/Journal/2023/W49","collapsed":true},{"path":"Personal/Journal/2023/W50","collapsed":true},{"path":"Personal/Journal/2024","collapsed":true},{"path":"Personal/Journal/2024/W8","collapsed":true},{"path":"Personal/Journal/2024/W10","collapsed":true},{"path":"Personal/Journal/2024/W11","collapsed":true},{"path":"Personal/Journal/2024/W12","collapsed":true},{"path":"Personal/Journal/2024/W14","collapsed":true},{"path":"Personal/Journal/2024/W16","collapsed":true},{"path":"Personal/Journal/2024/W17","collapsed":true},{"path":"Personal/Journal/2024/W22","collapsed":true},{"path":"Personal/Journal/2024/W23","collapsed":true},{"path":"Personal/Journal/2024/W24","collapsed":true},{"path":"Personal/Journal/2024/W29","collapsed":true},{"path":"Personal/Journal/2024/W30","collapsed":true},{"path":"Personal/Journal/2024/W33","collapsed":true},{"path":"Personal/Journal/2024/W35","collapsed":true},{"path":"Professional","collapsed":true},{"path":"Professional/Company","collapsed":true},{"path":"Professional/Company/数字化","collapsed":true},{"path":"Professional/Company/数字化/规范","collapsed":true},{"path":"Professional/Work","collapsed":true},{"path":"Professional/Work/data-engineer","collapsed":true},{"path":"Professional/Work/full-stack","collapsed":true},{"path":"Professional/Work/full-stack/基础","collapsed":true},{"path":"Professional/Work/full-stack/工具","collapsed":true},{"path":"Professional/Work/full-stack/文化","collapsed":true},{"path":"Professional/Work/roadmap","collapsed":true},{"path":"Professional/Work/roadmap/权益保障","collapsed":true},{"path":"Professional/Work/roadmap/求职经验","collapsed":true},{"path":"Professional/Work/roadmap/简历攻略","collapsed":true},{"path":"Professional/Work/roadmap/职业规划","collapsed":true},{"path":"Professional/Work/roadmap/职场心得","collapsed":true},{"path":"Professional/Work/roadmap/薪酬攻略","collapsed":true},{"path":"Professional/Work/roadmap/面试法则","collapsed":true},{"path":"Professional/Work/sre-engineer","collapsed":true},{"path":"SocialSciences","collapsed":true},{"path":"SocialSciences/English","collapsed":true},{"path":"SocialSciences/Government","collapsed":true},{"path":"SocialSciences/Government/中国","collapsed":true},{"path":"SocialSciences/Government/中国/标准","collapsed":true},{"path":"SocialSciences/Government/中国/法律","collapsed":true},{"path":"Technology","collapsed":true},{"path":"Technology/CloudService","collapsed":true},{"path":"Technology/CloudService/基础","collapsed":true},{"path":"Technology/ComputerNetwork","collapsed":true},{"path":"Technology/ComputerNetwork/Nginx","collapsed":true},{"path":"Technology/ComputerNetwork/公共服务","collapsed":true},{"path":"Technology/ComputerNetwork/应用服务","collapsed":true},{"path":"Technology/ComputerNetwork/网络协议","collapsed":true},{"path":"Technology/ComputerNetwork/网络基础","collapsed":true},{"path":"Technology/ComputerSecurity","collapsed":true},{"path":"Technology/ComputerSecurity/信息安全","collapsed":true},{"path":"Technology/ComputerSecurity/信息安全/OpenPGP","collapsed":true},{"path":"Technology/ComputerSecurity/密码学","collapsed":true},{"path":"Technology/ComputerSecurity/用户安全","collapsed":true},{"path":"Technology/ComputerSecurity/用户安全/权限设计","collapsed":true},{"path":"Technology/ComputerSecurity/用户安全/用户鉴权","collapsed":true},{"path":"Technology/ComputerSecurity/系统安全","collapsed":true},{"path":"Technology/ComputerSecurity/系统安全/防火墙","collapsed":true},{"path":"Technology/ComputerSecurity/网络安全","collapsed":true},{"path":"Technology/ComputerSecurity/网络安全/OpenSSH","collapsed":true},{"path":"Technology/ComputerSecurity/网络安全/OpenSSL","collapsed":true},{"path":"Technology/ComputerStorage","collapsed":true},{"path":"Technology/DatabaseSystem","collapsed":true},{"path":"Technology/DatabaseSystem/PostgreSQL","collapsed":true},{"path":"Technology/DatabaseSystem/SQL-语言","collapsed":true},{"path":"Technology/DatabaseSystem/基础","collapsed":true},{"path":"Technology/GettingStarted","collapsed":true},{"path":"Technology/GettingStarted/命令行工具","collapsed":true},{"path":"Technology/GettingStarted/命令行工具/PowerShell","collapsed":true},{"path":"Technology/GettingStarted/命令行工具/Shell","collapsed":true},{"path":"Technology/GettingStarted/命令行工具/Vim","collapsed":true},{"path":"Technology/GettingStarted/开源指南","collapsed":true},{"path":"Technology/GettingStarted/文本处理","collapsed":true},{"path":"Technology/GettingStarted/版本控制","collapsed":true},{"path":"Technology/GettingStarted/版本控制/Git","collapsed":true},{"path":"Technology/GettingStarted/版本控制/Git/入门","collapsed":true},{"path":"Technology/GettingStarted/版本控制/Git/进阶","collapsed":true},{"path":"Technology/OperatingSystem","collapsed":true},{"path":"Technology/OperatingSystem/Automation","collapsed":true},{"path":"Technology/OperatingSystem/Docker","collapsed":true},{"path":"Technology/OperatingSystem/Docker/基础","collapsed":true},{"path":"Technology/OperatingSystem/Docker/进阶","collapsed":true},{"path":"Technology/OperatingSystem/Docker/高级","collapsed":true},{"path":"Technology/OperatingSystem/Linux","collapsed":true},{"path":"Technology/OperatingSystem/Linux/1.文化","collapsed":true},{"path":"Technology/OperatingSystem/Linux/2.安装","collapsed":true},{"path":"Technology/OperatingSystem/Linux/3.基础操作","collapsed":true},{"path":"Technology/OperatingSystem/Linux/4.系统管理","collapsed":true},{"path":"Technology/OperatingSystem/Linux/5.安全配置","collapsed":true},{"path":"Technology/OperatingSystem/Linux/6.网络管理","collapsed":true},{"path":"Technology/OperatingSystem/Linux/7.存储管理","collapsed":true},{"path":"Technology/OperatingSystem/Virtualization","collapsed":true},{"path":"Technology/OperatingSystem/Virtualization/1.虚拟化概述","collapsed":true},{"path":"Technology/OperatingSystem/Virtualization/2.KVM虚拟化","collapsed":true},{"path":"Technology/OperatingSystem/Windows","collapsed":true},{"path":"Technology/OperatingSystem/Windows/文化","collapsed":true},{"path":"Technology/ProgrammingLanguage","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/入门","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/文化","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/WEB开发","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/数据处理","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/文本处理","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/系统交互","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/网络处理","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/进阶","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/项目","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/项目/虚拟环境","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/项目/风格指南","collapsed":true},{"path":"Technology/SoftwareEngineering","collapsed":true},{"path":"Technology/SoftwareEngineering/CI-and-CD","collapsed":true},{"path":"Technology/SoftwareEngineering/协作规范","collapsed":true},{"path":"Technology/SoftwareEngineering/技术文档","collapsed":true},{"path":"Technology/StructuresAlgorithms","collapsed":true}]" aria-controls="explorer-content" aria-expanded="false"><h2>探索</h2><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="explorer-content"><ul class="overflow" id="explorer-ul"><li><div class="folder-outer open"><ul style="padding-left:0;" class="content" data-folderul><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal"><button class="folder-button"><span class="folder-title">Personal</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog"><button class="folder-button"><span class="folder-title">Blog</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2018"><button class="folder-button"><span class="folder-title">2018</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2018"><li><a href="../../../Personal/Blog/2018/11月28日晚-星期三-霾" data-for="Personal/Blog/2018/11月28日晚-星期三-霾">11月28日 晚 星期三 霾</a></li><li><a href="../../../Personal/Blog/2018/BombSquad-炸弹人小分队" data-for="Personal/Blog/2018/BombSquad-炸弹人小分队">BombSquad-炸弹人小分队</a></li><li><a href="../../../Personal/Blog/2018/如何免费创建一个属于自己的网站" data-for="Personal/Blog/2018/如何免费创建一个属于自己的网站">如何免费创建一个属于自己的网站</a></li><li><a href="../../../Personal/Blog/2018/英雄联盟-S8-全球总决赛" data-for="Personal/Blog/2018/英雄联盟-S8-全球总决赛">英雄联盟 S8 全球总决赛</a></li><li><a href="../../../Personal/Blog/2018/螺蛳粉" data-for="Personal/Blog/2018/螺蛳粉">螺蛳粉</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2020"><button class="folder-button"><span class="folder-title">2020</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2020"><li><a href="../../../Personal/Blog/2020/Don`t-Starve-饥荒" data-for="Personal/Blog/2020/Don`t-Starve-饥荒">Don't Starve-饥荒</a></li><li><a href="../../../Personal/Blog/2020/中国传统历法" data-for="Personal/Blog/2020/中国传统历法">中国传统历法</a></li><li><a href="../../../Personal/Blog/2020/初号机,起飞!" data-for="Personal/Blog/2020/初号机,起飞!">初号机,起飞!</a></li><li><a href="../../../Personal/Blog/2020/吉普赛满天星" data-for="Personal/Blog/2020/吉普赛满天星">吉普赛满天星</a></li><li><a href="../../../Personal/Blog/2020/夏日花记" data-for="Personal/Blog/2020/夏日花记">夏日花记</a></li><li><a href="../../../Personal/Blog/2020/幸福的事情都是需要等待的" data-for="Personal/Blog/2020/幸福的事情都是需要等待的">幸福的事情都是需要等待的</a></li><li><a href="../../../Personal/Blog/2020/开源软件之道" data-for="Personal/Blog/2020/开源软件之道">开源软件之道</a></li><li><a href="../../../Personal/Blog/2020/我的小羊肖恩" data-for="Personal/Blog/2020/我的小羊肖恩">我的小羊肖恩</a></li><li><a href="../../../Personal/Blog/2020/数据恢复杂谈" data-for="Personal/Blog/2020/数据恢复杂谈">数据恢复杂谈</a></li><li><a href="../../../Personal/Blog/2020/注定不平凡的一年" data-for="Personal/Blog/2020/注定不平凡的一年">注定不平凡的一年</a></li><li><a href="../../../Personal/Blog/2020/浅谈个人服务器架构" data-for="Personal/Blog/2020/浅谈个人服务器架构">浅谈个人服务器架构</a></li><li><a href="../../../Personal/Blog/2020/球鞋日记" data-for="Personal/Blog/2020/球鞋日记">球鞋日记</a></li><li><a href="../../../Personal/Blog/2020/記拾月" data-for="Personal/Blog/2020/記拾月">記拾月</a></li><li><a href="../../../Personal/Blog/2020/长安游记" data-for="Personal/Blog/2020/长安游记">长安游记</a></li><li><a href="../../../Personal/Blog/2020/骑行在路上" data-for="Personal/Blog/2020/骑行在路上">骑行在路上</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2021"><button class="folder-button"><span class="folder-title">2021</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2021"><li><a href="../../../Personal/Blog/2021/2021" data-for="Personal/Blog/2021/2021">2021</a></li><li><a href="../../../Personal/Blog/2021/VIVO-IQOO-Neo3-开箱测评" data-for="Personal/Blog/2021/VIVO-IQOO-Neo3-开箱测评">VIVO IQOO Neo3 开箱测评</a></li><li><a href="../../../Personal/Blog/2021/上有天堂、下有苏杭" data-for="Personal/Blog/2021/上有天堂、下有苏杭">上有天堂、下有苏杭</a></li><li><a href="../../../Personal/Blog/2021/我开发的第一款软件" data-for="Personal/Blog/2021/我开发的第一款软件">我开发的第一款软件</a></li><li><a href="../../../Personal/Blog/2021/我站立的地方是中国" data-for="Personal/Blog/2021/我站立的地方是中国">我站立的地方是中国</a></li><li><a href="../../../Personal/Blog/2021/我还在……" data-for="Personal/Blog/2021/我还在……">我还在……</a></li><li><a href="../../../Personal/Blog/2021/星光不问赶路人" data-for="Personal/Blog/2021/星光不问赶路人">星光不问赶路人</a></li><li><a href="../../../Personal/Blog/2021/济南呀济南的泰山之旅" data-for="Personal/Blog/2021/济南呀济南的泰山之旅">济南呀济南的泰山之旅</a></li><li><a href="../../../Personal/Blog/2021/涝疫结合" data-for="Personal/Blog/2021/涝疫结合">涝疫结合</a></li><li><a href="../../../Personal/Blog/2021/申请-Jetbrains-开源项目授权" data-for="Personal/Blog/2021/申请-Jetbrains-开源项目授权">申请 Jetbrains 开源项目授权</a></li><li><a href="../../../Personal/Blog/2021/真·长安游记" data-for="Personal/Blog/2021/真·长安游记">真·长安游记</a></li><li><a href="../../../Personal/Blog/2021/记拾月" data-for="Personal/Blog/2021/记拾月">记拾月</a></li><li><a href="../../../Personal/Blog/2021/贰号机、落幕" data-for="Personal/Blog/2021/贰号机、落幕">贰号机、落幕</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2022"><button class="folder-button"><span class="folder-title">2022</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2022"><li><a href="../../../Personal/Blog/2022/「引用」博客的本质是电线杆子" data-for="Personal/Blog/2022/「引用」博客的本质是电线杆子">「引用」博客的本质是电线杆子</a></li><li><a href="../../../Personal/Blog/2022/2022" data-for="Personal/Blog/2022/2022">2022</a></li><li><a href="../../../Personal/Blog/2022/Halo-主题-Redemption-首发版" data-for="Personal/Blog/2022/Halo-主题-Redemption-首发版">Halo 主题 Redemption 首发版</a></li><li><a href="../../../Personal/Blog/2022/Hello-Halo" data-for="Personal/Blog/2022/Hello-Halo">Hello Halo</a></li><li><a href="../../../Personal/Blog/2022/Redemption" data-for="Personal/Blog/2022/Redemption">Redemption</a></li><li><a href="../../../Personal/Blog/2022/Redemption-主题-0.2.1-版本" data-for="Personal/Blog/2022/Redemption-主题-0.2.1-版本">Redemption 主题 0.2.1 版本</a></li><li><a href="../../../Personal/Blog/2022/一线城市拥有一亩三分地是什么体验" data-for="Personal/Blog/2022/一线城市拥有一亩三分地是什么体验">一线城市拥有一亩三分地是什么体验</a></li><li><a href="../../../Personal/Blog/2022/三步为你博客文章分析情感关键字" data-for="Personal/Blog/2022/三步为你博客文章分析情感关键字">三步为你博客文章分析情感关键字</a></li><li><a href="../../../Personal/Blog/2022/不要在饿的时候吃螺蛳粉!" data-for="Personal/Blog/2022/不要在饿的时候吃螺蛳粉!">不要在饿的时候吃螺蛳粉!</a></li><li><a href="../../../Personal/Blog/2022/习惯养成第一步" data-for="Personal/Blog/2022/习惯养成第一步">习惯养成第一步</a></li><li><a href="../../../Personal/Blog/2022/人在囧途——青海湖" data-for="Personal/Blog/2022/人在囧途——青海湖">人在囧途——青海湖</a></li><li><a href="../../../Personal/Blog/2022/人格类型测试" data-for="Personal/Blog/2022/人格类型测试">人格类型测试</a></li><li><a href="../../../Personal/Blog/2022/你还记得曾经的梦想么?" data-for="Personal/Blog/2022/你还记得曾经的梦想么?">你还记得曾经的梦想么?</a></li><li><a href="../../../Personal/Blog/2022/使用-Docusaurus-搭建优秀个人wiki" data-for="Personal/Blog/2022/使用-Docusaurus-搭建优秀个人wiki">使用 Docusaurus 搭建优秀个人wiki</a></li><li><a href="../../../Personal/Blog/2022/关于感情的事情" data-for="Personal/Blog/2022/关于感情的事情">关于感情的事情</a></li><li><a href="../../../Personal/Blog/2022/关于花" data-for="Personal/Blog/2022/关于花">关于花</a></li><li><a href="../../../Personal/Blog/2022/关于郑州的互联网记忆" data-for="Personal/Blog/2022/关于郑州的互联网记忆">关于郑州的互联网记忆</a></li><li><a href="../../../Personal/Blog/2022/再游嵩山" data-for="Personal/Blog/2022/再游嵩山">再游嵩山</a></li><li><a href="../../../Personal/Blog/2022/最近在折腾什么……" data-for="Personal/Blog/2022/最近在折腾什么……">最近在折腾什么……</a></li><li><a href="../../../Personal/Blog/2022/最近的生活" data-for="Personal/Blog/2022/最近的生活">最近的生活</a></li><li><a href="../../../Personal/Blog/2022/写十万字的博客是一种什么感觉" data-for="Personal/Blog/2022/写十万字的博客是一种什么感觉">写十万字的博客是一种什么感觉</a></li><li><a href="../../../Personal/Blog/2022/写博客的正确姿势---先行版" data-for="Personal/Blog/2022/写博客的正确姿势---先行版">写博客的正确姿势 - 先行版</a></li><li><a href="../../../Personal/Blog/2022/写博客的正确姿势---测试版" data-for="Personal/Blog/2022/写博客的正确姿势---测试版">写博客的正确姿势 - 测试版</a></li><li><a href="../../../Personal/Blog/2022/原点" data-for="Personal/Blog/2022/原点">原点</a></li><li><a href="../../../Personal/Blog/2022/如何免费获得-Jetbrains-正版授权" data-for="Personal/Blog/2022/如何免费获得-Jetbrains-正版授权">如何免费获得 Jetbrains 正版授权</a></li><li><a href="../../../Personal/Blog/2022/我是关系户" data-for="Personal/Blog/2022/我是关系户">我是关系户</a></li><li><a href="../../../Personal/Blog/2022/我要拔智齿!!!" data-for="Personal/Blog/2022/我要拔智齿!!!">我要拔智齿!!!</a></li><li><a href="../../../Personal/Blog/2022/数字文化遗产" data-for="Personal/Blog/2022/数字文化遗产">数字文化遗产</a></li><li><a href="../../../Personal/Blog/2022/新冠笔记" data-for="Personal/Blog/2022/新冠笔记">新冠笔记</a></li><li><a href="../../../Personal/Blog/2022/新手村村长" data-for="Personal/Blog/2022/新手村村长">新手村村长</a></li><li><a href="../../../Personal/Blog/2022/是微风、是晚霞、是来日方长" data-for="Personal/Blog/2022/是微风、是晚霞、是来日方长">是微风、是晚霞、是来日方长</a></li><li><a href="../../../Personal/Blog/2022/月季到了" data-for="Personal/Blog/2022/月季到了">月季到了</a></li><li><a href="../../../Personal/Blog/2022/浅谈一下自己折腾的网站" data-for="Personal/Blog/2022/浅谈一下自己折腾的网站">浅谈一下自己折腾的网站</a></li><li><a href="../../../Personal/Blog/2022/番茄开花啦-~" data-for="Personal/Blog/2022/番茄开花啦-~">番茄开花啦 ~</a></li><li><a href="../../../Personal/Blog/2022/种下了一些瓜果蔬菜" data-for="Personal/Blog/2022/种下了一些瓜果蔬菜">种下了一些瓜果蔬菜</a></li><li><a href="../../../Personal/Blog/2022/罪恶应该被遗传么" data-for="Personal/Blog/2022/罪恶应该被遗传么">罪恶应该被遗传么?</a></li><li><a href="../../../Personal/Blog/2022/自律的痛苦······" data-for="Personal/Blog/2022/自律的痛苦······">自律的痛苦······</a></li><li><a href="../../../Personal/Blog/2022/论成年人的睡眠" data-for="Personal/Blog/2022/论成年人的睡眠">论成年人的睡眠</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」">谈谈我的「数字文具盒」</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---NextCloud" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---NextCloud">谈谈我的「数字文具盒」 - NextCloud</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---Obsidian" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---Obsidian">谈谈我的「数字文具盒」 - Obsidian</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---心得体会" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---心得体会">谈谈我的「数字文具盒」 - 心得体会</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---数字基建" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---数字基建">谈谈我的「数字文具盒」 - 数字基建</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(上)" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(上)">谈谈我的「数字文具盒」 - 生产力工具(上)</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(下)" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(下)">谈谈我的「数字文具盒」 - 生产力工具(下)</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---番外篇" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---番外篇">谈谈我的「数字文具盒」 - 番外篇</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---运行平台" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---运行平台">谈谈我的「数字文具盒」 - 运行平台</a></li><li><a href="../../../Personal/Blog/2022/这个周末" data-for="Personal/Blog/2022/这个周末">这个周末</a></li><li><a href="../../../Personal/Blog/2022/通货膨胀的猪" data-for="Personal/Blog/2022/通货膨胀的猪">通货膨胀的猪</a></li><li><a href="../../../Personal/Blog/2022/闭门锁网" data-for="Personal/Blog/2022/闭门锁网">闭门锁网</a></li><li><a href="../../../Personal/Blog/2022/非黑即白" data-for="Personal/Blog/2022/非黑即白">非黑即白</a></li><li><a href="../../../Personal/Blog/2022/首页加载速度优化方案" data-for="Personal/Blog/2022/首页加载速度优化方案">首页加载速度优化方案</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2023"><button class="folder-button"><span class="folder-title">2023</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2023"><li><a href="../../../Personal/Blog/2023/2023-年度微信读书报告" data-for="Personal/Blog/2023/2023-年度微信读书报告">2023 年度微信读书报告</a></li><li><a href="../../../Personal/Blog/2023/Docusaurus-搭建" data-for="Personal/Blog/2023/Docusaurus-搭建">Docusaurus 搭建</a></li><li><a href="../../../Personal/Blog/2023/Obsidian-使用-Templater-插件的个性化脚本" data-for="Personal/Blog/2023/Obsidian-使用-Templater-插件的个性化脚本">Obsidian 使用 Templater 插件的个性化脚本</a></li><li><a href="../../../Personal/Blog/2023/YubiKey-漂流记" data-for="Personal/Blog/2023/YubiKey-漂流记">YubiKey 历险记</a></li><li><a href="../../../Personal/Blog/2023/不要把幸福建立在别人的痛苦之上" data-for="Personal/Blog/2023/不要把幸福建立在别人的痛苦之上">不要把幸福建立在别人的痛苦之上</a></li><li><a href="../../../Personal/Blog/2023/为什么不推开那扇门?" data-for="Personal/Blog/2023/为什么不推开那扇门?">为什么不推开那扇门?</a></li><li><a href="../../../Personal/Blog/2023/你愿意嫁给自己么?" data-for="Personal/Blog/2023/你愿意嫁给自己么?">你愿意嫁给自己么</a></li><li><a href="../../../Personal/Blog/2023/最近半年的生活" data-for="Personal/Blog/2023/最近半年的生活">最近半年的生活</a></li><li><a href="../../../Personal/Blog/2023/写博客的正确姿势" data-for="Personal/Blog/2023/写博客的正确姿势">写博客的正确姿势</a></li><li><a href="../../../Personal/Blog/2023/唯有热爱可抵岁月漫长" data-for="Personal/Blog/2023/唯有热爱可抵岁月漫长">唯有热爱、可抵岁月漫长</a></li><li><a href="../../../Personal/Blog/2023/回首-2022-展望-2023" data-for="Personal/Blog/2023/回首-2022-展望-2023">回首 2022 展望 2023</a></li><li><a href="../../../Personal/Blog/2023/大学回忆录" data-for="Personal/Blog/2023/大学回忆录">大学回忆录</a></li><li><a href="../../../Personal/Blog/2023/如何不写错别字!" data-for="Personal/Blog/2023/如何不写错别字!">如何不写错别字!</a></li><li><a href="../../../Personal/Blog/2023/如何拍好一张照片" data-for="Personal/Blog/2023/如何拍好一张照片">如何拍好一张照片</a></li><li><a href="../../../Personal/Blog/2023/家里的三块地" data-for="Personal/Blog/2023/家里的三块地">家里的三块地</a></li><li><a href="../../../Personal/Blog/2023/岁月是把猪饲料,把我喂的嘎嘎胖" data-for="Personal/Blog/2023/岁月是把猪饲料,把我喂的嘎嘎胖">岁月是把猪饲料,把我喂的嘎嘎胖</a></li><li><a href="../../../Personal/Blog/2023/拾月游记" data-for="Personal/Blog/2023/拾月游记">拾月游记</a></li><li><a href="../../../Personal/Blog/2023/揭晓你的博客一年之最,尽在-EndOfYear!" data-for="Personal/Blog/2023/揭晓你的博客一年之最,尽在-EndOfYear!">揭晓你的博客一年之最,尽在 EndOfYear!</a></li><li><a href="../../../Personal/Blog/2023/早起、阅读、写作、运动、冥想" data-for="Personal/Blog/2023/早起、阅读、写作、运动、冥想">早起、冥想、阅读、写作、运动</a></li><li><a href="../../../Personal/Blog/2023/浅尝-Gitea-的-Actions" data-for="Personal/Blog/2023/浅尝-Gitea-的-Actions">浅尝 Gitea 的 Actions</a></li><li><a href="../../../Personal/Blog/2023/独立生活能力清单" data-for="Personal/Blog/2023/独立生活能力清单">独立生活能力清单</a></li><li><a href="../../../Personal/Blog/2023/电脑坏了,我换了-Ubuntu" data-for="Personal/Blog/2023/电脑坏了,我换了-Ubuntu">电脑坏了,我换了 Ubuntu</a></li><li><a href="../../../Personal/Blog/2023/看-V2Ex-的-ChatGPT-老哥浅谈办公室政治" data-for="Personal/Blog/2023/看-V2Ex-的-ChatGPT-老哥浅谈办公室政治">看 V2Ex 的 ChatGPT 老哥浅谈办公室政治</a></li><li><a href="../../../Personal/Blog/2023/破万卷书,行万里路!" data-for="Personal/Blog/2023/破万卷书,行万里路!">破万卷书,行万里路!</a></li><li><a href="../../../Personal/Blog/2023/谈谈我的「数字文具盒」---个人工作流" data-for="Personal/Blog/2023/谈谈我的「数字文具盒」---个人工作流">谈谈我的「数字文具盒」 - 个人工作流</a></li><li><a href="../../../Personal/Blog/2023/长安三万里" data-for="Personal/Blog/2023/长安三万里">长安三万里</a></li><li><a href="../../../Personal/Blog/2023/黄山归来不看岳" data-for="Personal/Blog/2023/黄山归来不看岳">黄山归来不看岳</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2024"><button class="folder-button"><span class="folder-title">2024</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2024"><li><a href="../../../Personal/Blog/2024/「救赎之路」更名「向阳而生」" data-for="Personal/Blog/2024/「救赎之路」更名「向阳而生」">「救赎之路」更名「向阳而生」</a></li><li><a href="../../../Personal/Blog/2024/回顾-2023" data-for="Personal/Blog/2024/回顾-2023">2023 年终总结</a></li><li><a href="../../../Personal/Blog/2024/2023-年终问答" data-for="Personal/Blog/2024/2023-年终问答">2023 年终问答</a></li><li><a href="../../../Personal/Blog/2024/CityWalk——公车挑战" data-for="Personal/Blog/2024/CityWalk——公车挑战">CityWalk——公车挑战:探索未知的城市</a></li><li><a href="../../../Personal/Blog/2024/Python-项目终极部署解决方案" data-for="Personal/Blog/2024/Python-项目终极部署解决方案">Python 项目终极部署解决方案</a></li><li><a href="../../../Personal/Blog/2024/一命二运三风水" data-for="Personal/Blog/2024/一命二运三风水">一命二运三风水</a></li><li><a href="../../../Personal/Blog/2024/乌兰哈达火山银河之旅" data-for="Personal/Blog/2024/乌兰哈达火山银河之旅">乌兰哈达火山银河之旅</a></li><li><a href="../../../Personal/Blog/2024/冰箱,让你我错过了多少新鲜的生活?" data-for="Personal/Blog/2024/冰箱,让你我错过了多少新鲜的生活?">冰箱,让你我错过了多少新鲜的生活?</a></li><li><a href="../../../Personal/Blog/2024/回读者信──240816" data-for="Personal/Blog/2024/回读者信──240816">回读者信──240816</a></li><li><a href="../../../Personal/Blog/2024/夜泊西湖听雨声" data-for="Personal/Blog/2024/夜泊西湖听雨声">夜泊西湖听雨声</a></li><li><a href="../../../Personal/Blog/2024/如何开好一场会?" data-for="Personal/Blog/2024/如何开好一场会?">如何开好一场会?</a></li><li><a href="../../../Personal/Blog/2024/如何打破信息茧房?" data-for="Personal/Blog/2024/如何打破信息茧房?">如何打破信息茧房?</a></li><li><a href="../../../Personal/Blog/2024/富人的红灯与穷人的绿灯" data-for="Personal/Blog/2024/富人的红灯与穷人的绿灯">富人的红灯与穷人的绿灯</a></li><li><a href="../../../Personal/Blog/2024/师从-ChatGPT" data-for="Personal/Blog/2024/师从-ChatGPT">师从 ChatGPT</a></li><li><a href="../../../Personal/Blog/2024/我又从-Ubunut-换成了-Fedora" data-for="Personal/Blog/2024/我又从-Ubunut-换成了-Fedora">我又从 Ubunut 换成了 Fedora</a></li><li><a href="../../../Personal/Blog/2024/我的一天" data-for="Personal/Blog/2024/我的一天">我的一天</a></li><li><a href="../../../Personal/Blog/2024/打工三年记" data-for="Personal/Blog/2024/打工三年记">打工三年记</a></li><li><a href="../../../Personal/Blog/2024/新奇的-HR-经历" data-for="Personal/Blog/2024/新奇的-HR-经历">新奇的 HR 经历</a></li><li><a href="../../../Personal/Blog/2024/穷则独善其身,达则兼济天下" data-for="Personal/Blog/2024/穷则独善其身,达则兼济天下">穷则独善其身,达则兼济天下</a></li><li><a href="../../../Personal/Blog/2024/继续开荒我那一亩三分地" data-for="Personal/Blog/2024/继续开荒我那一亩三分地">继续开荒我那一亩三分地</a></li><li><a href="../../../Personal/Blog/2024/記伍月" data-for="Personal/Blog/2024/記伍月">記伍月</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book"><button class="folder-button"><span class="folder-title">Book</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/个人成长"><button class="folder-button"><span class="folder-title">个人成长</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/个人成长"><li><a href="../../../Personal/Book/个人成长/习惯的力量(新版)" data-for="Personal/Book/个人成长/习惯的力量(新版)">习惯的力量(新版)</a></li><li><a href="../../../Personal/Book/个人成长/以极简的方式去生活" data-for="Personal/Book/个人成长/以极简的方式去生活">以极简的方式去生活</a></li><li><a href="../../../Personal/Book/个人成长/写出我心:普通人如何通过写作表达自己" data-for="Personal/Book/个人成长/写出我心:普通人如何通过写作表达自己">写出我心:普通人如何通过写作表达自己</a></li><li><a href="../../../Personal/Book/个人成长/刻意练习:如何从新手到大师" data-for="Personal/Book/个人成长/刻意练习:如何从新手到大师">刻意练习:如何从新手到大师</a></li><li><a href="../../../Personal/Book/个人成长/十分钟冥想" data-for="Personal/Book/个人成长/十分钟冥想">十分钟冥想</a></li><li><a href="../../../Personal/Book/个人成长/即兴表达" data-for="Personal/Book/个人成长/即兴表达">即兴表达</a></li><li><a href="../../../Personal/Book/个人成长/学习之道" data-for="Personal/Book/个人成长/学习之道">学习之道</a></li><li><a href="../../../Personal/Book/个人成长/学会写作:自我进阶的高效方法" data-for="Personal/Book/个人成长/学会写作:自我进阶的高效方法">学会写作:自我进阶的高效方法</a></li><li><a href="../../../Personal/Book/个人成长/底层逻辑" data-for="Personal/Book/个人成长/底层逻辑">底层逻辑</a></li><li><a href="../../../Personal/Book/个人成长/底层逻辑:看清这个世界的底牌" data-for="Personal/Book/个人成长/底层逻辑:看清这个世界的底牌">底层逻辑:看清这个世界的底牌</a></li><li><a href="../../../Personal/Book/个人成长/当下的力量(白金版)" data-for="Personal/Book/个人成长/当下的力量(白金版)">当下的力量(白金版)</a></li><li><a href="../../../Personal/Book/个人成长/我的第一本人生规划手册" data-for="Personal/Book/个人成长/我的第一本人生规划手册">我的第一本人生规划手册</a></li><li><a href="../../../Personal/Book/个人成长/超级面试官:快速提升识人技能的面试实战手册" data-for="Personal/Book/个人成长/超级面试官:快速提升识人技能的面试实战手册">超级面试官:快速提升识人技能的面试实战手册</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/医学健康"><button class="folder-button"><span class="folder-title">医学健康</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/医学健康"><li><a href="../../../Personal/Book/医学健康/你是你吃出来的(套装共2册)" data-for="Personal/Book/医学健康/你是你吃出来的(套装共2册)">你是你吃出来的(套装共2册)</a></li><li><a href="../../../Personal/Book/医学健康/小小药箱护健康教您用好家庭小药箱" data-for="Personal/Book/医学健康/小小药箱护健康教您用好家庭小药箱">小小药箱护健康教您用好家庭小药箱</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/历史"><button class="folder-button"><span class="folder-title">历史</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/历史"><li><a href="../../../Personal/Book/历史/信息简史" data-for="Personal/Book/历史/信息简史">信息简史</a></li><li><a href="../../../Personal/Book/历史/这里是中国2" data-for="Personal/Book/历史/这里是中国2">这里是中国2</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/哲学宗教"><button class="folder-button"><span class="folder-title">哲学宗教</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/哲学宗教"><li><a href="../../../Personal/Book/哲学宗教/半小时漫画中国哲学史(套装全2册)" data-for="Personal/Book/哲学宗教/半小时漫画中国哲学史(套装全2册)">半小时漫画中国哲学史(套装全2册)</a></li><li><a href="../../../Personal/Book/哲学宗教/第一性原理" data-for="Personal/Book/哲学宗教/第一性原理">第一性原理</a></li><li><a href="../../../Personal/Book/哲学宗教/结构化思维" data-for="Personal/Book/哲学宗教/结构化思维">结构化思维</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/心理"><button class="folder-button"><span class="folder-title">心理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/心理"><li><a href="../../../Personal/Book/心理/乌合之众(果麦经典)" data-for="Personal/Book/心理/乌合之众(果麦经典)">乌合之众(果麦经典)</a></li><li><a href="../../../Personal/Book/心理/十分钟冥想" data-for="Personal/Book/心理/十分钟冥想">十分钟冥想</a></li><li><a href="../../../Personal/Book/心理/认知觉醒:开启自我改变的原动力" data-for="Personal/Book/心理/认知觉醒:开启自我改变的原动力">认知觉醒:开启自我改变的原动力</a></li><li><a href="../../../Personal/Book/心理/认知驱动:做成一件对他人很有用的事" data-for="Personal/Book/心理/认知驱动:做成一件对他人很有用的事">认知驱动:做成一件对他人很有用的事</a></li><li><a href="../../../Personal/Book/心理/谈性说爱:写给女性的性心理24讲" data-for="Personal/Book/心理/谈性说爱:写给女性的性心理24讲">谈性说爱:写给女性的性心理24讲</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/政治军事"><button class="folder-button"><span class="folder-title">政治军事</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/政治军事"><li><a href="../../../Personal/Book/政治军事/实践论" data-for="Personal/Book/政治军事/实践论">实践论</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/教育学习"><button class="folder-button"><span class="folder-title">教育学习</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/教育学习"><li><a href="../../../Personal/Book/教育学习/如何阅读一本书" data-for="Personal/Book/教育学习/如何阅读一本书">如何阅读一本书</a></li><li><a href="../../../Personal/Book/教育学习/赖世雄的英语学习法" data-for="Personal/Book/教育学习/赖世雄的英语学习法">赖世雄的英语学习法</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/文学"><button class="folder-button"><span class="folder-title">文学</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/文学"><li><a href="../../../Personal/Book/文学/凤凰项目:一个IT运维的传奇故事(修订版)" data-for="Personal/Book/文学/凤凰项目:一个IT运维的传奇故事(修订版)">凤凰项目:一个IT运维的传奇故事(修订版)</a></li><li><a href="../../../Personal/Book/文学/老舍谈写作" data-for="Personal/Book/文学/老舍谈写作">老舍谈写作</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/生活百科"><button class="folder-button"><span class="folder-title">生活百科</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/生活百科"><li><a href="../../../Personal/Book/生活百科/聂卫平围棋教程(从15级到10级)" data-for="Personal/Book/生活百科/聂卫平围棋教程(从15级到10级)">聂卫平围棋教程(从15级到10级)</a></li><li><a href="../../../Personal/Book/生活百科/聂卫平围棋教程(从入门到15级)" data-for="Personal/Book/生活百科/聂卫平围棋教程(从入门到15级)">聂卫平围棋教程(从入门到15级)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/社会文化"><button class="folder-button"><span class="folder-title">社会文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/社会文化"><li><a href="../../../Personal/Book/社会文化/人体简史" data-for="Personal/Book/社会文化/人体简史">人体简史</a></li><li><a href="../../../Personal/Book/社会文化/你不可不知的法律常识" data-for="Personal/Book/社会文化/你不可不知的法律常识">你不可不知的法律常识</a></li><li><a href="../../../Personal/Book/社会文化/半小时漫画《论语》" data-for="Personal/Book/社会文化/半小时漫画《论语》">半小时漫画《论语》</a></li><li><a href="../../../Personal/Book/社会文化/民法典与百姓生活100问" data-for="Personal/Book/社会文化/民法典与百姓生活100问">民法典与百姓生活100问</a></li><li><a href="../../../Personal/Book/社会文化/这里是中国" data-for="Personal/Book/社会文化/这里是中国">这里是中国</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/科学技术"><button class="folder-button"><span class="folder-title">科学技术</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/科学技术"><li><a href="../../../Personal/Book/科学技术/贝尔实验室与美国革新大时代" data-for="Personal/Book/科学技术/贝尔实验室与美国革新大时代">贝尔实验室与美国革新大时代</a></li><li><a href="../../../Personal/Book/科学技术/高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例" data-for="Personal/Book/科学技术/高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例">高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/经济理财"><button class="folder-button"><span class="folder-title">经济理财</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/经济理财"><li><a href="../../../Personal/Book/经济理财/人力资源管理从入门到精通" data-for="Personal/Book/经济理财/人力资源管理从入门到精通">人力资源管理从入门到精通</a></li><li><a href="../../../Personal/Book/经济理财/十分钟冥想" data-for="Personal/Book/经济理财/十分钟冥想">十分钟冥想</a></li><li><a href="../../../Personal/Book/经济理财/半小时漫画股票实战法" data-for="Personal/Book/经济理财/半小时漫画股票实战法">半小时漫画股票实战法</a></li><li><a href="../../../Personal/Book/经济理财/小米创业思考" data-for="Personal/Book/经济理财/小米创业思考">小米创业思考</a></li><li><a href="../../../Personal/Book/经济理财/底层逻辑:半秒钟看透问题本质" data-for="Personal/Book/经济理财/底层逻辑:半秒钟看透问题本质">底层逻辑:半秒钟看透问题本质</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/艺术"><button class="folder-button"><span class="folder-title">艺术</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/艺术"><li><a href="../../../Personal/Book/艺术/江湖丛谈(注音注释插图本)" data-for="Personal/Book/艺术/江湖丛谈(注音注释插图本)">江湖丛谈(注音注释插图本)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/计算机"><button class="folder-button"><span class="folder-title">计算机</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/计算机"><li><a href="../../../Personal/Book/计算机/Flask-Web开发:基于Python的Web应用开发实战(第2版)" data-for="Personal/Book/计算机/Flask-Web开发:基于Python的Web应用开发实战(第2版)">Flask Web开发:基于Python的Web应用开发实战(第2版)</a></li><li><a href="../../../Personal/Book/计算机/IT基础架构:系统运维实践" data-for="Personal/Book/计算机/IT基础架构:系统运维实践">IT基础架构:系统运维实践</a></li><li><a href="../../../Personal/Book/计算机/Linux命令行与shell脚本编程大全(第4版)" data-for="Personal/Book/计算机/Linux命令行与shell脚本编程大全(第4版)">Linux命令行与shell脚本编程大全(第4版)</a></li><li><a href="../../../Personal/Book/计算机/Linux是怎样工作的" data-for="Personal/Book/计算机/Linux是怎样工作的">Linux是怎样工作的</a></li><li><a href="../../../Personal/Book/计算机/Python工匠:案例、技巧与工程实践" data-for="Personal/Book/计算机/Python工匠:案例、技巧与工程实践">Python工匠:案例、技巧与工程实践</a></li><li><a href="../../../Personal/Book/计算机/Python编程:从入门到实践(第2版)" data-for="Personal/Book/计算机/Python编程:从入门到实践(第2版)">Python编程:从入门到实践(第2版)</a></li><li><a href="../../../Personal/Book/计算机/Python编程轻松进阶" data-for="Personal/Book/计算机/Python编程轻松进阶">Python编程轻松进阶</a></li><li><a href="../../../Personal/Book/计算机/SQL必知必会(第5版)" data-for="Personal/Book/计算机/SQL必知必会(第5版)">SQL必知必会(第5版)</a></li><li><a href="../../../Personal/Book/计算机/SRE:Google运维解密" data-for="Personal/Book/计算机/SRE:Google运维解密">SRE:Google运维解密</a></li><li><a href="../../../Personal/Book/计算机/UNIX传奇:历史与回忆" data-for="Personal/Book/计算机/UNIX传奇:历史与回忆">UNIX传奇:历史与回忆</a></li><li><a href="../../../Personal/Book/计算机/VMware-vSphere-7.0云平台运维与管理(第2版)" data-for="Personal/Book/计算机/VMware-vSphere-7.0云平台运维与管理(第2版)">VMware vSphere 7.0云平台运维与管理(第2版)</a></li><li><a href="../../../Personal/Book/计算机/人人都懂设计模式:从生活中领悟设计模式(Python实现)" data-for="Personal/Book/计算机/人人都懂设计模式:从生活中领悟设计模式(Python实现)">人人都懂设计模式:从生活中领悟设计模式(Python实现)</a></li><li><a href="../../../Personal/Book/计算机/从0到1:HTML+CSS快速上手" data-for="Personal/Book/计算机/从0到1:HTML+CSS快速上手">从0到1:HTML+CSS快速上手</a></li><li><a href="../../../Personal/Book/计算机/从0到1:HTML5+CSS3修炼之道" data-for="Personal/Book/计算机/从0到1:HTML5+CSS3修炼之道">从0到1:HTML5+CSS3修炼之道</a></li><li><a href="../../../Personal/Book/计算机/从0到1:JavaScript-快速上手" data-for="Personal/Book/计算机/从0到1:JavaScript-快速上手">从0到1:JavaScript 快速上手</a></li><li><a href="../../../Personal/Book/计算机/从0到1:jQuery快速上手" data-for="Personal/Book/计算机/从0到1:jQuery快速上手">从0到1:jQuery快速上手</a></li><li><a href="../../../Personal/Book/计算机/明解Python" data-for="Personal/Book/计算机/明解Python">明解Python</a></li><li><a href="../../../Personal/Book/计算机/每天5分钟玩转Docker容器技术" data-for="Personal/Book/计算机/每天5分钟玩转Docker容器技术">每天5分钟玩转Docker容器技术</a></li><li><a href="../../../Personal/Book/计算机/流畅的Python" data-for="Personal/Book/计算机/流畅的Python">流畅的Python</a></li><li><a href="../../../Personal/Book/计算机/硅谷之火:个人计算机的诞生与衰落(第3版)" data-for="Personal/Book/计算机/硅谷之火:个人计算机的诞生与衰落(第3版)">硅谷之火:个人计算机的诞生与衰落(第3版)</a></li><li><a href="../../../Personal/Book/计算机/秒懂设计模式" data-for="Personal/Book/计算机/秒懂设计模式">秒懂设计模式</a></li><li><a href="../../../Personal/Book/计算机/程序员的README" data-for="Personal/Book/计算机/程序员的README">程序员的README</a></li><li><a href="../../../Personal/Book/计算机/精通Python设计模式(第2版)" data-for="Personal/Book/计算机/精通Python设计模式(第2版)">精通Python设计模式(第2版)</a></li><li><a href="../../../Personal/Book/计算机/网络安全等级保护2.0:定级、测评、实施与运维" data-for="Personal/Book/计算机/网络安全等级保护2.0:定级、测评、实施与运维">网络安全等级保护2.0:定级、测评、实施与运维</a></li><li><a href="../../../Personal/Book/计算机/网络工程师红宝书:思科华为华三实战案例荟萃" data-for="Personal/Book/计算机/网络工程师红宝书:思科华为华三实战案例荟萃">网络工程师红宝书:思科华为华三实战案例荟萃</a></li><li><a href="../../../Personal/Book/计算机/网络是怎样连接的" data-for="Personal/Book/计算机/网络是怎样连接的">网络是怎样连接的</a></li><li><a href="../../../Personal/Book/计算机/网络运维亲历记-(网络运维纪实文学)" data-for="Personal/Book/计算机/网络运维亲历记-(网络运维纪实文学)">网络运维亲历记 (网络运维纪实文学)</a></li><li><a href="../../../Personal/Book/计算机/虚拟化工程师运维实战:VMware服务器虚拟化+Citrix桌面应用虚拟化+Veeam备份+Zabbix监控" data-for="Personal/Book/计算机/虚拟化工程师运维实战:VMware服务器虚拟化+Citrix桌面应用虚拟化+Veeam备份+Zabbix监控">虚拟化工程师运维实战:VMware服务器虚拟化+Citrix桌面/应用虚拟化+Veeam备份+Zabbix监控</a></li><li><a href="../../../Personal/Book/计算机/计算机:一部历史" data-for="Personal/Book/计算机/计算机:一部历史">计算机:一部历史</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal"><button class="folder-button"><span class="folder-title">Journal</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022"><button class="folder-button"><span class="folder-title">2022</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W34"><button class="folder-button"><span class="folder-title">W34</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W34"><li><a href="../../../Personal/Journal/2022/W34/2022-08-24" data-for="Personal/Journal/2022/W34/2022-08-24">2022-08-24</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-25" data-for="Personal/Journal/2022/W34/2022-08-25">2022-08-25</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-26" data-for="Personal/Journal/2022/W34/2022-08-26">2022-08-26</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-27" data-for="Personal/Journal/2022/W34/2022-08-27">2022-08-27</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-28" data-for="Personal/Journal/2022/W34/2022-08-28">2022-08-28</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-W34" data-for="Personal/Journal/2022/W34/2022-W34">2022-W34</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W35"><button class="folder-button"><span class="folder-title">W35</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W35"><li><a href="../../../Personal/Journal/2022/W35/2022-08-29" data-for="Personal/Journal/2022/W35/2022-08-29">2022-08-29</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-08-30" data-for="Personal/Journal/2022/W35/2022-08-30">2022-08-30</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-08-31" data-for="Personal/Journal/2022/W35/2022-08-31">2022-08-31</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-09-01" data-for="Personal/Journal/2022/W35/2022-09-01">2022-09-01</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-W35" data-for="Personal/Journal/2022/W35/2022-W35">2022-W35</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W36"><button class="folder-button"><span class="folder-title">W36</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W36"><li><a href="../../../Personal/Journal/2022/W36/2022-09-05" data-for="Personal/Journal/2022/W36/2022-09-05">2022-09-05</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-09-06" data-for="Personal/Journal/2022/W36/2022-09-06">2022-09-06</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-09-07" data-for="Personal/Journal/2022/W36/2022-09-07">2022-09-07</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-09-08" data-for="Personal/Journal/2022/W36/2022-09-08">2022-09-08</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-W36" data-for="Personal/Journal/2022/W36/2022-W36">2022-W36</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W37"><button class="folder-button"><span class="folder-title">W37</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W37"><li><a href="../../../Personal/Journal/2022/W37/2022-09-12" data-for="Personal/Journal/2022/W37/2022-09-12">2022-09-12</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-13" data-for="Personal/Journal/2022/W37/2022-09-13">2022-09-13</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-14" data-for="Personal/Journal/2022/W37/2022-09-14">2022-09-14</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-15" data-for="Personal/Journal/2022/W37/2022-09-15">2022-09-15</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-16" data-for="Personal/Journal/2022/W37/2022-09-16">2022-09-16</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-17" data-for="Personal/Journal/2022/W37/2022-09-17">2022-09-17</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-18" data-for="Personal/Journal/2022/W37/2022-09-18">2022-09-18</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-W37" data-for="Personal/Journal/2022/W37/2022-W37">2022-W37</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W38"><button class="folder-button"><span class="folder-title">W38</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W38"><li><a href="../../../Personal/Journal/2022/W38/2022-09-19" data-for="Personal/Journal/2022/W38/2022-09-19">2022-09-19</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-09-20" data-for="Personal/Journal/2022/W38/2022-09-20">2022-09-20</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-09-21" data-for="Personal/Journal/2022/W38/2022-09-21">2022-09-21</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-09-22" data-for="Personal/Journal/2022/W38/2022-09-22">2022-09-22</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-W38" data-for="Personal/Journal/2022/W38/2022-W38">2022-W38</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W39"><button class="folder-button"><span class="folder-title">W39</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W39"><li><a href="../../../Personal/Journal/2022/W39/2022-09-28" data-for="Personal/Journal/2022/W39/2022-09-28">2022-09-28</a></li><li><a href="../../../Personal/Journal/2022/W39/2022-09-29" data-for="Personal/Journal/2022/W39/2022-09-29">2022-09-29</a></li><li><a href="../../../Personal/Journal/2022/W39/2022-W39" data-for="Personal/Journal/2022/W39/2022-W39">2022-W39</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W41"><button class="folder-button"><span class="folder-title">W41</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W41"><li><a href="../../../Personal/Journal/2022/W41/2022-10-10" data-for="Personal/Journal/2022/W41/2022-10-10">2022-10-10</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-11" data-for="Personal/Journal/2022/W41/2022-10-11">2022-10-11</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-12" data-for="Personal/Journal/2022/W41/2022-10-12">2022-10-12</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-13" data-for="Personal/Journal/2022/W41/2022-10-13">2022-10-13</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-14" data-for="Personal/Journal/2022/W41/2022-10-14">2022-10-14</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-16" data-for="Personal/Journal/2022/W41/2022-10-16">2022-10-16</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-W41" data-for="Personal/Journal/2022/W41/2022-W41">2022-W41</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W42"><button class="folder-button"><span class="folder-title">W42</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W42"><li><a href="../../../Personal/Journal/2022/W42/2022-10-17" data-for="Personal/Journal/2022/W42/2022-10-17">2022-10-17</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-10-18" data-for="Personal/Journal/2022/W42/2022-10-18">2022-10-18</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-10-19" data-for="Personal/Journal/2022/W42/2022-10-19">2022-10-19</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-10-21" data-for="Personal/Journal/2022/W42/2022-10-21">2022-10-21</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-W42" data-for="Personal/Journal/2022/W42/2022-W42">2022-W42</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W43"><button class="folder-button"><span class="folder-title">W43</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W43"><li><a href="../../../Personal/Journal/2022/W43/2022-10-24" data-for="Personal/Journal/2022/W43/2022-10-24">2022-10-24</a></li><li><a href="../../../Personal/Journal/2022/W43/2022-10-26" data-for="Personal/Journal/2022/W43/2022-10-26">2022-10-26</a></li><li><a href="../../../Personal/Journal/2022/W43/2022-W43" data-for="Personal/Journal/2022/W43/2022-W43">2022-W43</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W44"><button class="folder-button"><span class="folder-title">W44</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W44"><li><a href="../../../Personal/Journal/2022/W44/2022-11-02" data-for="Personal/Journal/2022/W44/2022-11-02">2022-11-02</a></li><li><a href="../../../Personal/Journal/2022/W44/2022-W44" data-for="Personal/Journal/2022/W44/2022-W44">2022-W44</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W45"><button class="folder-button"><span class="folder-title">W45</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W45"><li><a href="../../../Personal/Journal/2022/W45/2022-11-10" data-for="Personal/Journal/2022/W45/2022-11-10">2022-11-10</a></li><li><a href="../../../Personal/Journal/2022/W45/2022-11-11" data-for="Personal/Journal/2022/W45/2022-11-11">2022-11-11</a></li><li><a href="../../../Personal/Journal/2022/W45/2022-11-12" data-for="Personal/Journal/2022/W45/2022-11-12">2022-11-12</a></li><li><a href="../../../Personal/Journal/2022/W45/2022-11-13" data-for="Personal/Journal/2022/W45/2022-11-13">2022-11-13</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W46"><button class="folder-button"><span class="folder-title">W46</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W46"><li><a href="../../../Personal/Journal/2022/W46/2022-11-18" data-for="Personal/Journal/2022/W46/2022-11-18">2022-11-18</a></li><li><a href="../../../Personal/Journal/2022/W46/2022-11-20" data-for="Personal/Journal/2022/W46/2022-11-20">2022-11-20</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W47"><button class="folder-button"><span class="folder-title">W47</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W47"><li><a href="../../../Personal/Journal/2022/W47/2022-11-21" data-for="Personal/Journal/2022/W47/2022-11-21">2022-11-21</a></li><li><a href="../../../Personal/Journal/2022/W47/2022-11-22" data-for="Personal/Journal/2022/W47/2022-11-22">2022-11-22</a></li><li><a href="../../../Personal/Journal/2022/W47/2022-W47" data-for="Personal/Journal/2022/W47/2022-W47">2022-W47</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W48"><button class="folder-button"><span class="folder-title">W48</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W48"><li><a href="../../../Personal/Journal/2022/W48/2022-11-28" data-for="Personal/Journal/2022/W48/2022-11-28">2022-11-28</a></li><li><a href="../../../Personal/Journal/2022/W48/2022-11-29" data-for="Personal/Journal/2022/W48/2022-11-29">2022-11-29</a></li><li><a href="../../../Personal/Journal/2022/W48/2022-12-01" data-for="Personal/Journal/2022/W48/2022-12-01">2022-12-01</a></li><li><a href="../../../Personal/Journal/2022/W48/2022-12-04" data-for="Personal/Journal/2022/W48/2022-12-04">2022-12-04</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W49"><button class="folder-button"><span class="folder-title">W49</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W49"><li><a href="../../../Personal/Journal/2022/W49/2022-12-06" data-for="Personal/Journal/2022/W49/2022-12-06">2022-12-06</a></li><li><a href="../../../Personal/Journal/2022/W49/2022-W49" data-for="Personal/Journal/2022/W49/2022-W49">2022-W49</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W50"><button class="folder-button"><span class="folder-title">W50</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W50"><li><a href="../../../Personal/Journal/2022/W50/2022-12-12" data-for="Personal/Journal/2022/W50/2022-12-12">2022-12-12</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023"><button class="folder-button"><span class="folder-title">2023</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W2"><button class="folder-button"><span class="folder-title">W2</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W2"><li><a href="../../../Personal/Journal/2023/W2/2023-W2" data-for="Personal/Journal/2023/W2/2023-W2">2023-W2</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W3"><button class="folder-button"><span class="folder-title">W3</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W3"><li><a href="../../../Personal/Journal/2023/W3/2023-01-16" data-for="Personal/Journal/2023/W3/2023-01-16">2023-01-16</a></li><li><a href="../../../Personal/Journal/2023/W3/2023-01-18" data-for="Personal/Journal/2023/W3/2023-01-18">2023-01-18</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W5"><button class="folder-button"><span class="folder-title">W5</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W5"><li><a href="../../../Personal/Journal/2023/W5/2023-W5" data-for="Personal/Journal/2023/W5/2023-W5">2023-W5</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W6"><button class="folder-button"><span class="folder-title">W6</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W6"><li><a href="../../../Personal/Journal/2023/W6/2023-W6" data-for="Personal/Journal/2023/W6/2023-W6">2023-W6</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W7"><button class="folder-button"><span class="folder-title">W7</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W7"><li><a href="../../../Personal/Journal/2023/W7/2023-02-14" data-for="Personal/Journal/2023/W7/2023-02-14">2023-02-14</a></li><li><a href="../../../Personal/Journal/2023/W7/2023-02-15" data-for="Personal/Journal/2023/W7/2023-02-15">2023-02-15</a></li><li><a href="../../../Personal/Journal/2023/W7/2023-02-16" data-for="Personal/Journal/2023/W7/2023-02-16">2023-02-16</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W8"><button class="folder-button"><span class="folder-title">W8</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W8"><li><a href="../../../Personal/Journal/2023/W8/2023-02-20" data-for="Personal/Journal/2023/W8/2023-02-20">2023-02-20</a></li><li><a href="../../../Personal/Journal/2023/W8/2023-02-22" data-for="Personal/Journal/2023/W8/2023-02-22">2023-02-22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W10"><button class="folder-button"><span class="folder-title">W10</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W10"><li><a href="../../../Personal/Journal/2023/W10/2023-W10" data-for="Personal/Journal/2023/W10/2023-W10">2023-W10</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W12"><button class="folder-button"><span class="folder-title">W12</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W12"><li><a href="../../../Personal/Journal/2023/W12/2023-03-20" data-for="Personal/Journal/2023/W12/2023-03-20">2023-03-20</a></li><li><a href="../../../Personal/Journal/2023/W12/2023-03-21" data-for="Personal/Journal/2023/W12/2023-03-21">2023-03-21</a></li><li><a href="../../../Personal/Journal/2023/W12/2023-W12" data-for="Personal/Journal/2023/W12/2023-W12">2023-W12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W14"><button class="folder-button"><span class="folder-title">W14</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W14"><li><a href="../../../Personal/Journal/2023/W14/2023-04-08" data-for="Personal/Journal/2023/W14/2023-04-08">2023-04-08</a></li><li><a href="../../../Personal/Journal/2023/W14/2023-W14" data-for="Personal/Journal/2023/W14/2023-W14">2023-W14</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W16"><button class="folder-button"><span class="folder-title">W16</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W16"><li><a href="../../../Personal/Journal/2023/W16/2023-04-21" data-for="Personal/Journal/2023/W16/2023-04-21">2023-04-21</a></li><li><a href="../../../Personal/Journal/2023/W16/2023-04-23" data-for="Personal/Journal/2023/W16/2023-04-23">2023-04-23</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W22"><button class="folder-button"><span class="folder-title">W22</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W22"><li><a href="../../../Personal/Journal/2023/W22/2023-05-31" data-for="Personal/Journal/2023/W22/2023-05-31">2023-05-31</a></li><li><a href="../../../Personal/Journal/2023/W22/2023-06-01" data-for="Personal/Journal/2023/W22/2023-06-01">2023-06-01</a></li><li><a href="../../../Personal/Journal/2023/W22/2023-W22" data-for="Personal/Journal/2023/W22/2023-W22">2023-W22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W23"><button class="folder-button"><span class="folder-title">W23</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W23"><li><a href="../../../Personal/Journal/2023/W23/2023-06-05" data-for="Personal/Journal/2023/W23/2023-06-05">2023-06-05</a></li><li><a href="../../../Personal/Journal/2023/W23/2023-06-08" data-for="Personal/Journal/2023/W23/2023-06-08">2023-06-08</a></li><li><a href="../../../Personal/Journal/2023/W23/2023-W23" data-for="Personal/Journal/2023/W23/2023-W23">2023-W23</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W24"><button class="folder-button"><span class="folder-title">W24</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W24"><li><a href="../../../Personal/Journal/2023/W24/2023-06-12" data-for="Personal/Journal/2023/W24/2023-06-12">2023-06-12</a></li><li><a href="../../../Personal/Journal/2023/W24/2023-06-13" data-for="Personal/Journal/2023/W24/2023-06-13">2023-06-13</a></li><li><a href="../../../Personal/Journal/2023/W24/2023-06-15" data-for="Personal/Journal/2023/W24/2023-06-15">2023-06-15</a></li><li><a href="../../../Personal/Journal/2023/W24/2023-W24" data-for="Personal/Journal/2023/W24/2023-W24">2023-W24</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W25"><button class="folder-button"><span class="folder-title">W25</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W25"><li><a href="../../../Personal/Journal/2023/W25/2023-W25" data-for="Personal/Journal/2023/W25/2023-W25">2023-W25</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W26"><button class="folder-button"><span class="folder-title">W26</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W26"><li><a href="../../../Personal/Journal/2023/W26/2023-06-26" data-for="Personal/Journal/2023/W26/2023-06-26">2023-06-26</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W31"><button class="folder-button"><span class="folder-title">W31</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W31"><li><a href="../../../Personal/Journal/2023/W31/2023-W31" data-for="Personal/Journal/2023/W31/2023-W31">2023-W31</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W32"><button class="folder-button"><span class="folder-title">W32</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W32"><li><a href="../../../Personal/Journal/2023/W32/2023-08-07" data-for="Personal/Journal/2023/W32/2023-08-07">2023-08-07</a></li><li><a href="../../../Personal/Journal/2023/W32/2023-08-08" data-for="Personal/Journal/2023/W32/2023-08-08">2023-08-08</a></li><li><a href="../../../Personal/Journal/2023/W32/2023-W32" data-for="Personal/Journal/2023/W32/2023-W32">2023-W32</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W33"><button class="folder-button"><span class="folder-title">W33</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W33"><li><a href="../../../Personal/Journal/2023/W33/2023-W33" data-for="Personal/Journal/2023/W33/2023-W33">2023-W33</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W35"><button class="folder-button"><span class="folder-title">W35</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W35"><li><a href="../../../Personal/Journal/2023/W35/2023-W35" data-for="Personal/Journal/2023/W35/2023-W35">2023-W35</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W36"><button class="folder-button"><span class="folder-title">W36</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W36"><li><a href="../../../Personal/Journal/2023/W36/2023-W36" data-for="Personal/Journal/2023/W36/2023-W36">2023-W36</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W37"><button class="folder-button"><span class="folder-title">W37</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W37"><li><a href="../../../Personal/Journal/2023/W37/2023-W37" data-for="Personal/Journal/2023/W37/2023-W37">2023-W37</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W40"><button class="folder-button"><span class="folder-title">W40</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W40"><li><a href="../../../Personal/Journal/2023/W40/2023-W40" data-for="Personal/Journal/2023/W40/2023-W40">2023-W40</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W45"><button class="folder-button"><span class="folder-title">W45</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W45"><li><a href="../../../Personal/Journal/2023/W45/2023-11-12" data-for="Personal/Journal/2023/W45/2023-11-12">2023-11-12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W46"><button class="folder-button"><span class="folder-title">W46</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W46"><li><a href="../../../Personal/Journal/2023/W46/2023-11-15" data-for="Personal/Journal/2023/W46/2023-11-15">2023-11-15</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W48"><button class="folder-button"><span class="folder-title">W48</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W48"><li><a href="../../../Personal/Journal/2023/W48/2023-W48" data-for="Personal/Journal/2023/W48/2023-W48">2023-W48</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W49"><button class="folder-button"><span class="folder-title">W49</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W49"><li><a href="../../../Personal/Journal/2023/W49/2023-12-07" data-for="Personal/Journal/2023/W49/2023-12-07">2023-12-07</a></li><li><a href="../../../Personal/Journal/2023/W49/2023-W49" data-for="Personal/Journal/2023/W49/2023-W49">2023-W49</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W50"><button class="folder-button"><span class="folder-title">W50</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W50"><li><a href="../../../Personal/Journal/2023/W50/2023-12-12" data-for="Personal/Journal/2023/W50/2023-12-12">2023-12-12</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024"><button class="folder-button"><span class="folder-title">2024</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W8"><button class="folder-button"><span class="folder-title">W8</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W8"><li><a href="../../../Personal/Journal/2024/W8/2024-02-22" data-for="Personal/Journal/2024/W8/2024-02-22">2024-02-22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W10"><button class="folder-button"><span class="folder-title">W10</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W10"><li><a href="../../../Personal/Journal/2024/W10/2024-03-05" data-for="Personal/Journal/2024/W10/2024-03-05">2024-03-05</a></li><li><a href="../../../Personal/Journal/2024/W10/2024-03-06" data-for="Personal/Journal/2024/W10/2024-03-06">2024-03-06</a></li><li><a href="../../../Personal/Journal/2024/W10/2024-03-07" data-for="Personal/Journal/2024/W10/2024-03-07">2024-03-07</a></li><li><a href="../../../Personal/Journal/2024/W10/2024-W10" data-for="Personal/Journal/2024/W10/2024-W10">2024-W10</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W11"><button class="folder-button"><span class="folder-title">W11</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W11"><li><a href="../../../Personal/Journal/2024/W11/2024-03-11" data-for="Personal/Journal/2024/W11/2024-03-11">2024-03-11</a></li><li><a href="../../../Personal/Journal/2024/W11/2024-03-12" data-for="Personal/Journal/2024/W11/2024-03-12">2024-03-12</a></li><li><a href="../../../Personal/Journal/2024/W11/2024-03-13" data-for="Personal/Journal/2024/W11/2024-03-13">2024-03-13</a></li><li><a href="../../../Personal/Journal/2024/W11/2024-W11" data-for="Personal/Journal/2024/W11/2024-W11">2024-W11</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W12"><button class="folder-button"><span class="folder-title">W12</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W12"><li><a href="../../../Personal/Journal/2024/W12/2024-03-20" data-for="Personal/Journal/2024/W12/2024-03-20">2024-03-20</a></li><li><a href="../../../Personal/Journal/2024/W12/2024-W12" data-for="Personal/Journal/2024/W12/2024-W12">2024-W12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W14"><button class="folder-button"><span class="folder-title">W14</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W14"><li><a href="../../../Personal/Journal/2024/W14/2024-W14" data-for="Personal/Journal/2024/W14/2024-W14">2024-W14</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W16"><button class="folder-button"><span class="folder-title">W16</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W16"><li><a href="../../../Personal/Journal/2024/W16/2024-W16" data-for="Personal/Journal/2024/W16/2024-W16">2024-W16</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W17"><button class="folder-button"><span class="folder-title">W17</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W17"><li><a href="../../../Personal/Journal/2024/W17/2024-04-24" data-for="Personal/Journal/2024/W17/2024-04-24">2024-04-24</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W22"><button class="folder-button"><span class="folder-title">W22</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W22"><li><a href="../../../Personal/Journal/2024/W22/2024-06-02" data-for="Personal/Journal/2024/W22/2024-06-02">2024-06-02</a></li><li><a href="../../../Personal/Journal/2024/W22/2024-W22" data-for="Personal/Journal/2024/W22/2024-W22">2024-W22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W23"><button class="folder-button"><span class="folder-title">W23</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W23"><li><a href="../../../Personal/Journal/2024/W23/2024-06-03" data-for="Personal/Journal/2024/W23/2024-06-03">2024-06-03</a></li><li><a href="../../../Personal/Journal/2024/W23/2024-06-04" data-for="Personal/Journal/2024/W23/2024-06-04">2024-06-04</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W24"><button class="folder-button"><span class="folder-title">W24</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W24"><li><a href="../../../Personal/Journal/2024/W24/2024-06-12" data-for="Personal/Journal/2024/W24/2024-06-12">2024-06-12</a></li><li><a href="../../../Personal/Journal/2024/W24/2024-W24" data-for="Personal/Journal/2024/W24/2024-W24">2024-W24</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W29"><button class="folder-button"><span class="folder-title">W29</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W29"><li><a href="../../../Personal/Journal/2024/W29/2024-W29" data-for="Personal/Journal/2024/W29/2024-W29">2024-W29</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W30"><button class="folder-button"><span class="folder-title">W30</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W30"><li><a href="../../../Personal/Journal/2024/W30/2024-07-22" data-for="Personal/Journal/2024/W30/2024-07-22">2024-07-22</a></li><li><a href="../../../Personal/Journal/2024/W30/2024-07-25" data-for="Personal/Journal/2024/W30/2024-07-25">2024-07-25</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W33"><button class="folder-button"><span class="folder-title">W33</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W33"><li><a href="../../../Personal/Journal/2024/W33/2024-08-12" data-for="Personal/Journal/2024/W33/2024-08-12">2024-08-12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W35"><button class="folder-button"><span class="folder-title">W35</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W35"><li><a href="../../../Personal/Journal/2024/W35/2024-08-31" data-for="Personal/Journal/2024/W35/2024-08-31">2024-08-31</a></li></ul></div></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional"><button class="folder-button"><span class="folder-title">Professional</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Company"><button class="folder-button"><span class="folder-title">Company</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Company"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Company/数字化"><button class="folder-button"><span class="folder-title">数字化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Company/数字化"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Company/数字化/规范"><button class="folder-button"><span class="folder-title">规范</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Company/数字化/规范"><li><a href="../../../Professional/Company/数字化/规范/企业计算机命名规范" data-for="Professional/Company/数字化/规范/企业计算机命名规范">企业计算机命名规范</a></li><li><a href="../../../Professional/Company/数字化/规范/企业域名分配规范" data-for="Professional/Company/数字化/规范/企业域名分配规范">域名分配规范</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work"><button class="folder-button"><span class="folder-title">Work</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/data-engineer"><button class="folder-button"><span class="folder-title">data-engineer</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/data-engineer"><li><a href="../../../Professional/Work/data-engineer/home" data-for="Professional/Work/data-engineer/home">数据工程师(data-engineer)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack"><button class="folder-button"><span class="folder-title">full-stack</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack/基础"><li><a href="../../../Professional/Work/full-stack/基础/CSS" data-for="Professional/Work/full-stack/基础/CSS">CSS</a></li><li><a href="../../../Professional/Work/full-stack/基础/HTML" data-for="Professional/Work/full-stack/基础/HTML">HTML</a></li><li><a href="../../../Professional/Work/full-stack/基础/JavaScript" data-for="Professional/Work/full-stack/基础/JavaScript">JavaScript</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack/工具"><button class="folder-button"><span class="folder-title">工具</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack/工具"><li><a href="../../../Professional/Work/full-stack/工具/PM2-工具" data-for="Professional/Work/full-stack/工具/PM2-工具">PM2 工具</a></li><li><a href="../../../Professional/Work/full-stack/工具/Webpack" data-for="Professional/Work/full-stack/工具/Webpack">Webpack</a></li><li><a href="../../../Professional/Work/full-stack/工具/包管理工具" data-for="Professional/Work/full-stack/工具/包管理工具">包管理器</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack/文化"><button class="folder-button"><span class="folder-title">文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack/文化"><li><a href="../../../Professional/Work/full-stack/文化/历史发展" data-for="Professional/Work/full-stack/文化/历史发展">历史发展</a></li><li><a href="../../../Professional/Work/full-stack/文化/概述" data-for="Professional/Work/full-stack/文化/概述">概述</a></li><li><a href="../../../Professional/Work/full-stack/文化/现代化开发工具链" data-for="Professional/Work/full-stack/文化/现代化开发工具链">现代化开发工具链</a></li></ul></div></li><li><a href="../../../Professional/Work/full-stack/home" data-for="Professional/Work/full-stack/home">前端工程师(Front-End Engineer)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap"><button class="folder-button"><span class="folder-title">roadmap</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/权益保障"><button class="folder-button"><span class="folder-title">权益保障</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/权益保障"><li><a href="../../../Professional/Work/roadmap/权益保障/仲裁指南" data-for="Professional/Work/roadmap/权益保障/仲裁指南">仲裁指南</a></li><li><a href="../../../Professional/Work/roadmap/权益保障/职场维权实战经验" data-for="Professional/Work/roadmap/权益保障/职场维权实战经验">职场维权实战经验</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/求职经验"><button class="folder-button"><span class="folder-title">求职经验</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/求职经验"><li><a href="../../../Professional/Work/roadmap/求职经验/互联网行业-郑州" data-for="Professional/Work/roadmap/求职经验/互联网行业-郑州">互联网行业-郑州</a></li><li><a href="../../../Professional/Work/roadmap/求职经验/写给软件工程师的建议" data-for="Professional/Work/roadmap/求职经验/写给软件工程师的建议">写给软件工程师的建议</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/简历攻略"><button class="folder-button"><span class="folder-title">简历攻略</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/简历攻略"><li><a href="../../../Professional/Work/roadmap/简历攻略/IT-类简历" data-for="Professional/Work/roadmap/简历攻略/IT-类简历">IT 类简历</a></li><li><a href="../../../Professional/Work/roadmap/简历攻略/简历原则" data-for="Professional/Work/roadmap/简历攻略/简历原则">简历原则</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/职业规划"><button class="folder-button"><span class="folder-title">职业规划</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/职业规划"><li><a href="../../../Professional/Work/roadmap/职业规划/开发者职业路线图" data-for="Professional/Work/roadmap/职业规划/开发者职业路线图">开发者职业路线图</a></li><li><a href="../../../Professional/Work/roadmap/职业规划/职业宏观规划图" data-for="Professional/Work/roadmap/职业规划/职业宏观规划图">职业宏观规划图</a></li><li><a href="../../../Professional/Work/roadmap/职业规划/职业宏观路线图" data-for="Professional/Work/roadmap/职业规划/职业宏观路线图">职业宏观路线图</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/职场心得"><button class="folder-button"><span class="folder-title">职场心得</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/职场心得"><li><a href="../../../Professional/Work/roadmap/职场心得/华为新员工的-8-个阶段" data-for="Professional/Work/roadmap/职场心得/华为新员工的-8-个阶段">华为新员工的 8 个阶段</a></li><li><a href="../../../Professional/Work/roadmap/职场心得/如何平衡工作和生活" data-for="Professional/Work/roadmap/职场心得/如何平衡工作和生活">如何平衡工作和生活</a></li><li><a href="../../../Professional/Work/roadmap/职场心得/如何度过新手村" data-for="Professional/Work/roadmap/职场心得/如何度过新手村">如何度过新手村</a></li><li><a href="../../../Professional/Work/roadmap/职场心得/如何有效应对职场政治" data-for="Professional/Work/roadmap/职场心得/如何有效应对职场政治">如何有效应对职场政治</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/薪酬攻略"><button class="folder-button"><span class="folder-title">薪酬攻略</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/薪酬攻略"><li><a href="../../../Professional/Work/roadmap/薪酬攻略/社会保障" data-for="Professional/Work/roadmap/薪酬攻略/社会保障">社会保障</a></li><li><a href="../../../Professional/Work/roadmap/薪酬攻略/绩效考核" data-for="Professional/Work/roadmap/薪酬攻略/绩效考核">绩效考核</a></li><li><a href="../../../Professional/Work/roadmap/薪酬攻略/薪酬制度" data-for="Professional/Work/roadmap/薪酬攻略/薪酬制度">薪酬制度</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/面试法则"><button class="folder-button"><span class="folder-title">面试法则</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/面试法则"><li><a href="../../../Professional/Work/roadmap/面试法则/反向面试" data-for="Professional/Work/roadmap/面试法则/反向面试">反向面试</a></li><li><a href="../../../Professional/Work/roadmap/面试法则/面试-10-大常见问题" data-for="Professional/Work/roadmap/面试法则/面试-10-大常见问题">面试 10 大常见问题</a></li></ul></div></li><li><a href="../../../Professional/Work/roadmap/home" data-for="Professional/Work/roadmap/home">求职之路</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/sre-engineer"><button class="folder-button"><span class="folder-title">sre-engineer</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/sre-engineer"><li><a href="../../../Professional/Work/sre-engineer/home" data-for="Professional/Work/sre-engineer/home">SRE (站点可靠性工程师)</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences"><button class="folder-button"><span class="folder-title">SocialSciences</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/English"><button class="folder-button"><span class="folder-title">English</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/English"><li><a href="../../../SocialSciences/English/字母音标" data-for="SocialSciences/English/字母音标">字母音标</a></li><li><a href="../../../SocialSciences/English/语法基础" data-for="SocialSciences/English/语法基础">语法基础</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government"><button class="folder-button"><span class="folder-title">Government</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government/中国"><button class="folder-button"><span class="folder-title">中国</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government/中国"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government/中国/标准"><button class="folder-button"><span class="folder-title">标准</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government/中国/标准"><li><a href="../../../SocialSciences/Government/中国/标准/标准组织" data-for="SocialSciences/Government/中国/标准/标准组织">标准组织</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government/中国/法律"><button class="folder-button"><span class="folder-title">法律</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government/中国/法律"><li><a href="../../../SocialSciences/Government/中国/法律/法律文书" data-for="SocialSciences/Government/中国/法律/法律文书">法律文书</a></li></ul></div></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology"><button class="folder-button"><span class="folder-title">Technology</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/CloudService"><button class="folder-button"><span class="folder-title">CloudService</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/CloudService"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/CloudService/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/CloudService/基础"><li><a href="../../../Technology/CloudService/基础/IT-基础架构" data-for="Technology/CloudService/基础/IT-基础架构">IT 基础架构</a></li><li><a href="../../../Technology/CloudService/基础/云计算" data-for="Technology/CloudService/基础/云计算">云计算概述</a></li><li><a href="../../../Technology/CloudService/基础/功能即服务(FaaS)" data-for="Technology/CloudService/基础/功能即服务(FaaS)">功能即服务(FaaS)</a></li><li><a href="../../../Technology/CloudService/基础/基础架构即服务(IaaS)" data-for="Technology/CloudService/基础/基础架构即服务(IaaS)">基础架构即服务(IaaS)</a></li><li><a href="../../../Technology/CloudService/基础/平台即服务(PaaS)" data-for="Technology/CloudService/基础/平台即服务(PaaS)">平台即服务(PaaS)</a></li><li><a href="../../../Technology/CloudService/基础/软件即服务(SaaS)" data-for="Technology/CloudService/基础/软件即服务(SaaS)">软件即服务(SaaS)</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork"><button class="folder-button"><span class="folder-title">ComputerNetwork</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/Nginx"><button class="folder-button"><span class="folder-title">Nginx</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/Nginx"><li><a href="../../../Technology/ComputerNetwork/Nginx/概述" data-for="Technology/ComputerNetwork/Nginx/概述">Nginx 概述</a></li><li><a href="../../../Technology/ComputerNetwork/Nginx/内容缓存" data-for="Technology/ComputerNetwork/Nginx/内容缓存">内容缓存</a></li><li><a href="../../../Technology/ComputerNetwork/Nginx/基础配置" data-for="Technology/ComputerNetwork/Nginx/基础配置">基础配置</a></li><li><a href="../../../Technology/ComputerNetwork/Nginx/负载均衡" data-for="Technology/ComputerNetwork/Nginx/负载均衡">负载均衡</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/公共服务"><button class="folder-button"><span class="folder-title">公共服务</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/公共服务"><li><a href="../../../Technology/ComputerNetwork/公共服务/IPv4-DNS-服务" data-for="Technology/ComputerNetwork/公共服务/IPv4-DNS-服务">IPv4 DNS 服务</a></li><li><a href="../../../Technology/ComputerNetwork/公共服务/IPv6-DNS-服务" data-for="Technology/ComputerNetwork/公共服务/IPv6-DNS-服务">IPv6 DNS 服务</a></li><li><a href="../../../Technology/ComputerNetwork/公共服务/Mirror-镜像站" data-for="Technology/ComputerNetwork/公共服务/Mirror-镜像站">Mirror 镜像站</a></li><li><a href="../../../Technology/ComputerNetwork/公共服务/NTP-服务器" data-for="Technology/ComputerNetwork/公共服务/NTP-服务器">NTP 服务器</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/应用服务"><button class="folder-button"><span class="folder-title">应用服务</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/应用服务"><li><a href="../../../Technology/ComputerNetwork/应用服务/CDN-内容分发网络" data-for="Technology/ComputerNetwork/应用服务/CDN-内容分发网络">CDN 内容分发网络</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/网络协议"><button class="folder-button"><span class="folder-title">网络协议</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/网络协议"><li><a href="../../../Technology/ComputerNetwork/网络协议/DHCP-动态主机配置协议" data-for="Technology/ComputerNetwork/网络协议/DHCP-动态主机配置协议">DHCP 动态主机配置协议</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/DNS-域名系统" data-for="Technology/ComputerNetwork/网络协议/DNS-域名系统">DNS 域名系统</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/IP-网际协议" data-for="Technology/ComputerNetwork/网络协议/IP-网际协议">IP 网际协议</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/TCP-传输控制协议" data-for="Technology/ComputerNetwork/网络协议/TCP-传输控制协议">TCP 传输控制协议</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/UDP-用户数据报协议" data-for="Technology/ComputerNetwork/网络协议/UDP-用户数据报协议">UDP 用户数据报协议</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/网络基础"><button class="folder-button"><span class="folder-title">网络基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/网络基础"><li><a href="../../../Technology/ComputerNetwork/网络基础/网络基础" data-for="Technology/ComputerNetwork/网络基础/网络基础">网络基础</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity"><button class="folder-button"><span class="folder-title">ComputerSecurity</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/信息安全"><button class="folder-button"><span class="folder-title">信息安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/信息安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/信息安全/OpenPGP"><button class="folder-button"><span class="folder-title">OpenPGP</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/信息安全/OpenPGP"><li><a href="../../../Technology/ComputerSecurity/信息安全/OpenPGP/GnuPG-简明指南" data-for="Technology/ComputerSecurity/信息安全/OpenPGP/GnuPG-简明指南">GnuPG 简明指南</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/密码学"><button class="folder-button"><span class="folder-title">密码学</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/密码学"><li><a href="../../../Technology/ComputerSecurity/密码学/简明指南" data-for="Technology/ComputerSecurity/密码学/简明指南">简明指南</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/用户安全"><button class="folder-button"><span class="folder-title">用户安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/用户安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/用户安全/权限设计"><button class="folder-button"><span class="folder-title">权限设计</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/用户安全/权限设计"><li><a href="../../../Technology/ComputerSecurity/用户安全/权限设计/主流权限系统的设计" data-for="Technology/ComputerSecurity/用户安全/权限设计/主流权限系统的设计">主流权限系统的设计</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/用户安全/用户鉴权"><button class="folder-button"><span class="folder-title">用户鉴权</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/用户安全/用户鉴权"><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/HTTP-基本鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/HTTP-基本鉴权">HTTP 基本鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/JWT(JSON-Web-Token)鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/JWT(JSON-Web-Token)鉴权">JWT 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/OAuth-鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/OAuth-鉴权">OAuth 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/Session-Cookie-鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/Session-Cookie-鉴权">Session-Cookie 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/单点登录(Single-Sign-On)" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/单点登录(Single-Sign-On)">SSO 单点登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/Token-鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/Token-鉴权">Token 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/一键登录(适用于原生APP)" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/一键登录(适用于原生APP)">一键登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/唯一登录" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/唯一登录">唯一登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/扫码登录" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/扫码登录">扫码登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/联合登录和信任登录" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/联合登录和信任登录">联合登录和信任登录</a></li></ul></div></li><li><a href="../../../Technology/ComputerSecurity/用户安全/简明指南" data-for="Technology/ComputerSecurity/用户安全/简明指南">简明指南</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/系统安全"><button class="folder-button"><span class="folder-title">系统安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/系统安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/系统安全/防火墙"><button class="folder-button"><span class="folder-title">防火墙</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/系统安全/防火墙"><li><a href="../../../Technology/ComputerSecurity/系统安全/防火墙/网络端口大全" data-for="Technology/ComputerSecurity/系统安全/防火墙/网络端口大全">网络端口大全</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/网络安全"><button class="folder-button"><span class="folder-title">网络安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/网络安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/网络安全/OpenSSH"><button class="folder-button"><span class="folder-title">OpenSSH</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/网络安全/OpenSSH"><li><a href="../../../Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-使用方法" data-for="Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-使用方法">OpenSSH 使用方法</a></li><li><a href="../../../Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-概述" data-for="Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-概述">OpenSSH 概述</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/网络安全/OpenSSL"><button class="folder-button"><span class="folder-title">OpenSSL</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/网络安全/OpenSSL"><li><a href="../../../Technology/ComputerSecurity/网络安全/OpenSSL/简明指南" data-for="Technology/ComputerSecurity/网络安全/OpenSSL/简明指南">简明指南</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerStorage"><button class="folder-button"><span class="folder-title">ComputerStorage</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerStorage"><li><a href="../../../Technology/ComputerStorage/0.-大纲" data-for="Technology/ComputerStorage/0.-大纲">0. 大纲</a></li><li><a href="../../../Technology/ComputerStorage/1.-存储基础" data-for="Technology/ComputerStorage/1.-存储基础">1. 存储基础</a></li><li><a href="../../../Technology/ComputerStorage/2.-存储硬件" data-for="Technology/ComputerStorage/2.-存储硬件">2. 存储硬件</a></li><li><a href="../../../Technology/ComputerStorage/3.-存储架构" data-for="Technology/ComputerStorage/3.-存储架构">3. 存储架构</a></li><li><a href="../../../Technology/ComputerStorage/4.-文件系统" data-for="Technology/ComputerStorage/4.-文件系统">4. 文件系统</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem"><button class="folder-button"><span class="folder-title">DatabaseSystem</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem/PostgreSQL"><button class="folder-button"><span class="folder-title">PostgreSQL</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem/PostgreSQL"><li><a href="../../../Technology/DatabaseSystem/PostgreSQL/基本概念" data-for="Technology/DatabaseSystem/PostgreSQL/基本概念">基本概念</a></li><li><a href="../../../Technology/DatabaseSystem/PostgreSQL/安装配置" data-for="Technology/DatabaseSystem/PostgreSQL/安装配置">安装配置</a></li><li><a href="../../../Technology/DatabaseSystem/PostgreSQL/简介" data-for="Technology/DatabaseSystem/PostgreSQL/简介">简介</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem/SQL-语言"><button class="folder-button"><span class="folder-title">SQL 语言</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem/SQL-语言"><li><a href="../../../Technology/DatabaseSystem/SQL-语言/基础语法" data-for="Technology/DatabaseSystem/SQL-语言/基础语法">基础语法</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem/基础"><li><a href="../../../Technology/DatabaseSystem/基础/关系型数据库" data-for="Technology/DatabaseSystem/基础/关系型数据库">关系型数据库</a></li><li><a href="../../../Technology/DatabaseSystem/基础/数据库概述" data-for="Technology/DatabaseSystem/基础/数据库概述">数据库概述</a></li><li><a href="../../../Technology/DatabaseSystem/基础/非关系型数据库" data-for="Technology/DatabaseSystem/基础/非关系型数据库">非关系型数据库</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted"><button class="folder-button"><span class="folder-title">GettingStarted</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具"><button class="folder-button"><span class="folder-title">命令行工具</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具/PowerShell"><button class="folder-button"><span class="folder-title">PowerShell</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具/PowerShell"><li><a href="../../../Technology/GettingStarted/命令行工具/PowerShell/PowerShell-入门" data-for="Technology/GettingStarted/命令行工具/PowerShell/PowerShell-入门">PowerShell 入门</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/PowerShell/PowerShell-进阶" data-for="Technology/GettingStarted/命令行工具/PowerShell/PowerShell-进阶">PowerShell 进阶</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/PowerShell/PowerShell-高级" data-for="Technology/GettingStarted/命令行工具/PowerShell/PowerShell-高级">PowerShell 高级</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具/Shell"><button class="folder-button"><span class="folder-title">Shell</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具/Shell"><li><a href="../../../Technology/GettingStarted/命令行工具/Shell/Shell-命令操作" data-for="Technology/GettingStarted/命令行工具/Shell/Shell-命令操作">Linux 命令行操作</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Shell/Shell-必备锦囊" data-for="Technology/GettingStarted/命令行工具/Shell/Shell-必备锦囊">Shell 必备锦囊</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Shell/Shell-是什么" data-for="Technology/GettingStarted/命令行工具/Shell/Shell-是什么">Shell 是什么</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具/Vim"><button class="folder-button"><span class="folder-title">Vim</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具/Vim"><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/5.Vim-参考手册" data-for="Technology/GettingStarted/命令行工具/Vim/5.Vim-参考手册">Vim 参考手册</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/4.Vim-实用技巧" data-for="Technology/GettingStarted/命令行工具/Vim/4.Vim-实用技巧">Vim 实用技巧</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/6.Vim-帮助文档" data-for="Technology/GettingStarted/命令行工具/Vim/6.Vim-帮助文档">Vim 帮助文档</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/1.Vim-入门" data-for="Technology/GettingStarted/命令行工具/Vim/1.Vim-入门">Vim 快速入门</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/2.VIM-配置管理" data-for="Technology/GettingStarted/命令行工具/Vim/2.VIM-配置管理">VIM 配置管理</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/3.Vim-高级功能" data-for="Technology/GettingStarted/命令行工具/Vim/3.Vim-高级功能">Vim 高级功能</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/开源指南"><button class="folder-button"><span class="folder-title">开源指南</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/开源指南"><li><a href="../../../Technology/GettingStarted/开源指南/如何向开源社区提问" data-for="Technology/GettingStarted/开源指南/如何向开源社区提问">如何向开源社区提问</a></li><li><a href="../../../Technology/GettingStarted/开源指南/如何有效报告-BUG" data-for="Technology/GettingStarted/开源指南/如何有效报告-BUG">如何有效报告 BUG</a></li><li><a href="../../../Technology/GettingStarted/开源指南/开源指北" data-for="Technology/GettingStarted/开源指南/开源指北">开源指北</a></li><li><a href="../../../Technology/GettingStarted/开源指南/提问的智慧" data-for="Technology/GettingStarted/开源指南/提问的智慧">提问的智慧</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/文本处理"><button class="folder-button"><span class="folder-title">文本处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/文本处理"><li><a href="../../../Technology/GettingStarted/文本处理/正则表达式" data-for="Technology/GettingStarted/文本处理/正则表达式">正则表达式</a></li><li><a href="../../../Technology/GettingStarted/文本处理/结构化文件" data-for="Technology/GettingStarted/文本处理/结构化文件">结构化文件</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制"><button class="folder-button"><span class="folder-title">版本控制</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制/Git"><button class="folder-button"><span class="folder-title">Git</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制/Git"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制/Git/入门"><button class="folder-button"><span class="folder-title">入门</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制/Git/入门"><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/分支" data-for="Technology/GettingStarted/版本控制/Git/入门/分支">分支</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/协议" data-for="Technology/GettingStarted/版本控制/Git/入门/协议">协议</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/基础" data-for="Technology/GettingStarted/版本控制/Git/入门/基础">基础</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/起步" data-for="Technology/GettingStarted/版本控制/Git/入门/起步">起步</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制/Git/进阶"><button class="folder-button"><span class="folder-title">进阶</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制/Git/进阶"><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/Git-LFS" data-for="Technology/GettingStarted/版本控制/Git/进阶/Git-LFS">Git-LFS</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/参考手册" data-for="Technology/GettingStarted/版本控制/Git/进阶/参考手册">参考手册</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/工作流" data-for="Technology/GettingStarted/版本控制/Git/进阶/工作流">工作流</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/常用命令" data-for="Technology/GettingStarted/版本控制/Git/进阶/常用命令">常用命令</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/常用技巧" data-for="Technology/GettingStarted/版本控制/Git/进阶/常用技巧">常用技巧</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/思维导图" data-for="Technology/GettingStarted/版本控制/Git/进阶/思维导图">思维导图</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/钩子" data-for="Technology/GettingStarted/版本控制/Git/进阶/钩子">钩子</a></li></ul></div></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem"><button class="folder-button"><span class="folder-title">OperatingSystem</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Automation"><button class="folder-button"><span class="folder-title">Automation</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Automation"><li><a href="../../../Technology/OperatingSystem/Automation/Ansible" data-for="Technology/OperatingSystem/Automation/Ansible">Ansible</a></li><li><a href="../../../Technology/OperatingSystem/Automation/Cloud-init-快速部署" data-for="Technology/OperatingSystem/Automation/Cloud-init-快速部署">Cloud-init</a></li><li><a href="../../../Technology/OperatingSystem/Automation/PXE--系统部署" data-for="Technology/OperatingSystem/Automation/PXE--系统部署">PXE 自动化部署</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker"><button class="folder-button"><span class="folder-title">Docker</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker/基础"><li><a href="../../../Technology/OperatingSystem/Docker/基础/基础概念" data-for="Technology/OperatingSystem/Docker/基础/基础概念">基础概念</a></li><li><a href="../../../Technology/OperatingSystem/Docker/基础/安装配置" data-for="Technology/OperatingSystem/Docker/基础/安装配置">安装配置</a></li><li><a href="../../../Technology/OperatingSystem/Docker/基础/简介" data-for="Technology/OperatingSystem/Docker/基础/简介">简介</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker/进阶"><button class="folder-button"><span class="folder-title">进阶</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker/进阶"><li><a href="../../../Technology/OperatingSystem/Docker/进阶/Docker-Compose" data-for="Technology/OperatingSystem/Docker/进阶/Docker-Compose">Docker Compose</a></li><li><a href="../../../Technology/OperatingSystem/Docker/进阶/Docker-Dockerfile" data-for="Technology/OperatingSystem/Docker/进阶/Docker-Dockerfile">Docker Dockerfile</a></li><li><a href="../../../Technology/OperatingSystem/Docker/进阶/Docker-使用" data-for="Technology/OperatingSystem/Docker/进阶/Docker-使用">Docker 使用</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker/高级"><button class="folder-button"><span class="folder-title">高级</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker/高级"><li><a href="../../../Technology/OperatingSystem/Docker/高级/Docker-命令手册" data-for="Technology/OperatingSystem/Docker/高级/Docker-命令手册">Docker 命令手册</a></li><li><a href="../../../Technology/OperatingSystem/Docker/高级/Docker-存储" data-for="Technology/OperatingSystem/Docker/高级/Docker-存储">Docker 存储</a></li><li><a href="../../../Technology/OperatingSystem/Docker/高级/Docker-网络" data-for="Technology/OperatingSystem/Docker/高级/Docker-网络">Docker 网络</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux"><button class="folder-button"><span class="folder-title">Linux</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/1.文化"><button class="folder-button"><span class="folder-title">1.文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/1.文化"><li><a href="../../../Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-历史与发展" data-for="Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-历史与发展">GNU&Linux 历史与发展</a></li><li><a href="../../../Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-社区与文化" data-for="Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-社区与文化">GNU&Linux 社区与文化</a></li><li><a href="../../../Technology/OperatingSystem/Linux/1.文化/开源软件的概念与重要性" data-for="Technology/OperatingSystem/Linux/1.文化/开源软件的概念与重要性">开源软件的概念与重要性</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/2.安装"><button class="folder-button"><span class="folder-title">2.安装</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/2.安装"><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/GRUB-引导程序" data-for="Technology/OperatingSystem/Linux/2.安装/GRUB-引导程序">GRUB 引导程序</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-下-0-1-手动安装-Arch-Linux" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-下-0-1-手动安装-Arch-Linux">Linux 下 0-1 手动安装 Arch Linux</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-下源代码编译与安装实战" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-下源代码编译与安装实战">Linux 下源代码编译与安装实战</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-发行版镜像" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-发行版镜像">Linux 发行版镜像</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-安装和配置" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-安装和配置">Linux 安装和配置</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-无法启动排查指南" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-无法启动排查指南">Linux 无法启动排查指南</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/3.基础操作"><button class="folder-button"><span class="folder-title">3.基础操作</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/3.基础操作"><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-包管理器" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-包管理器">Linux 包管理器</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Shell-命令行操作" data-for="Technology/OperatingSystem/Linux/3.基础操作/Shell-命令行操作">Linux 命令行操作</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-文件管理" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-文件管理">Linux 文件管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-环境变量" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-环境变量">Linux 环境变量</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-用户和权限" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-用户和权限">Linux 用户和权限</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/4.系统管理"><button class="folder-button"><span class="folder-title">4.系统管理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/4.系统管理"><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-内核管理" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-内核管理">Linux 内核管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-基本配置" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-基本配置">Linux 基本配置</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-日志管理" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-日志管理">Linux 日志管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-服务管理" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-服务管理">Linux 服务管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-系统启动详解" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-系统启动详解">Linux 服务管理</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/5.安全配置"><button class="folder-button"><span class="folder-title">5.安全配置</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/5.安全配置"><li><a href="../../../Technology/OperatingSystem/Linux/5.安全配置/Linux-系统安全与防护" data-for="Technology/OperatingSystem/Linux/5.安全配置/Linux-系统安全与防护">Linux 系统安全与防护</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/6.网络管理"><button class="folder-button"><span class="folder-title">6.网络管理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/6.网络管理"><li><a href="../../../Technology/OperatingSystem/Linux/6.网络管理/Linux-网络管理" data-for="Technology/OperatingSystem/Linux/6.网络管理/Linux-网络管理">Linux 网络管理</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/7.存储管理"><button class="folder-button"><span class="folder-title">7.存储管理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/7.存储管理"><li><a href="../../../Technology/OperatingSystem/Linux/7.存储管理/Linux-文件系统" data-for="Technology/OperatingSystem/Linux/7.存储管理/Linux-文件系统">Linux 文件系统</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Virtualization"><button class="folder-button"><span class="folder-title">Virtualization</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Virtualization"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Virtualization/1.虚拟化概述"><button class="folder-button"><span class="folder-title">1.虚拟化概述</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Virtualization/1.虚拟化概述"><li><a href="../../../Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化平台简介" data-for="Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化平台简介">虚拟化平台简介</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化概述" data-for="Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化概述">虚拟化概述</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Virtualization/2.KVM虚拟化"><button class="folder-button"><span class="folder-title">2.KVM虚拟化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Virtualization/2.KVM虚拟化"><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/1.-KVM-概述" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/1.-KVM-概述">1. KVM 概述</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/2.-KVM-安装配置" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/2.-KVM-安装配置">2. KVM 安装配置</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/3.-KVM-管理工具" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/3.-KVM-管理工具">3. KVM 管理工具</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/4.-KVM-网络配置" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/4.-KVM-网络配置">4. KVM 网络配置</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/5.-KVM-存储管理" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/5.-KVM-存储管理">5. KVM 存储管理</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/6.-KVM-性能优化" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/6.-KVM-性能优化">6. KVM 性能优化</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/7.-KVM-系统监控" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/7.-KVM-系统监控">7. KVM 系统监控</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Windows"><button class="folder-button"><span class="folder-title">Windows</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Windows"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Windows/文化"><button class="folder-button"><span class="folder-title">文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Windows/文化"><li><a href="../../../Technology/OperatingSystem/Windows/文化/微软及其Windows系统的历史发展" data-for="Technology/OperatingSystem/Windows/文化/微软及其Windows系统的历史发展">微软及其Windows系统的历史发展</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage"><button class="folder-button"><span class="folder-title">ProgrammingLanguage</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python"><button class="folder-button"><span class="folder-title">Python</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/入门"><button class="folder-button"><span class="folder-title">入门</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/入门"><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/函数方法" data-for="Technology/ProgrammingLanguage/Python/入门/函数方法">函数方法</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/基础语法" data-for="Technology/ProgrammingLanguage/Python/入门/基础语法">基础语法</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/控制语句" data-for="Technology/ProgrammingLanguage/Python/入门/控制语句">控制语句</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/数据类型" data-for="Technology/ProgrammingLanguage/Python/入门/数据类型">数据类型</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/数据结构" data-for="Technology/ProgrammingLanguage/Python/入门/数据结构">数据结构</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/模块和包" data-for="Technology/ProgrammingLanguage/Python/入门/模块和包">模块和包</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/面对对象" data-for="Technology/ProgrammingLanguage/Python/入门/面对对象">面对对象</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/文化"><button class="folder-button"><span class="folder-title">文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/文化"><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/发展历史" data-for="Technology/ProgrammingLanguage/Python/文化/发展历史">发展历史</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/生命周期" data-for="Technology/ProgrammingLanguage/Python/文化/生命周期">生命周期</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/社区文化" data-for="Technology/ProgrammingLanguage/Python/文化/社区文化">社区文化</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/设计哲学" data-for="Technology/ProgrammingLanguage/Python/文化/设计哲学">设计哲学</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/语言特性" data-for="Technology/ProgrammingLanguage/Python/文化/语言特性">语言特性</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块"><button class="folder-button"><span class="folder-title">模块</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/WEB开发"><button class="folder-button"><span class="folder-title">WEB开发</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/WEB开发"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/WEB开发/Jinja-模板引擎" data-for="Technology/ProgrammingLanguage/Python/模块/WEB开发/Jinja-模板引擎">Jinja 模板引擎</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/数据处理"><button class="folder-button"><span class="folder-title">数据处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/数据处理"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/数据处理/configparser-配置文件解析器" data-for="Technology/ProgrammingLanguage/Python/模块/数据处理/configparser-配置文件解析器">configparser 配置文件解析器</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/数据处理/csv-文件读写" data-for="Technology/ProgrammingLanguage/Python/模块/数据处理/csv-文件读写">csv 文件读写</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/数据处理/json-编码和解码器" data-for="Technology/ProgrammingLanguage/Python/模块/数据处理/json-编码和解码器">json 编码和解码器</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/文本处理"><button class="folder-button"><span class="folder-title">文本处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/文本处理"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/文本处理/re-----正则表达式操作" data-for="Technology/ProgrammingLanguage/Python/模块/文本处理/re-----正则表达式操作">re --- 正则表达式操作</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/系统交互"><button class="folder-button"><span class="folder-title">系统交互</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/系统交互"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/dotenv-环境变量管理" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/dotenv-环境变量管理">dotenv 环境变量管理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/logging-日志记录工具" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/logging-日志记录工具">logging 日志记录工具</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/loguru-日志库" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/loguru-日志库">loguru 日志库</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/os-多种操作系统接口" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/os-多种操作系统接口">os 多种操作系统接口</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/subprocess-子进程管理" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/subprocess-子进程管理">subprocess 子进程管理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/sys-系统相关的形参和函数" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/sys-系统相关的形参和函数">sys 系统相关的形参和函数</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/网络处理"><button class="folder-button"><span class="folder-title">网络处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/网络处理"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/网络处理/requests-HTTP-库" data-for="Technology/ProgrammingLanguage/Python/模块/网络处理/requests-HTTP-库">requests HTTP 库</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/网络处理/socket-底层网络接口" data-for="Technology/ProgrammingLanguage/Python/模块/网络处理/socket-底层网络接口">socket 底层网络接口</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/网络处理/urllib-URL-处理模块" data-for="Technology/ProgrammingLanguage/Python/模块/网络处理/urllib-URL-处理模块">urllib URL 处理模块</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/进阶"><button class="folder-button"><span class="folder-title">进阶</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/进阶"><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/函数式编程" data-for="Technology/ProgrammingLanguage/Python/进阶/函数式编程">函数式编程</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/垃圾回收" data-for="Technology/ProgrammingLanguage/Python/进阶/垃圾回收">垃圾回收</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/并行和并发" data-for="Technology/ProgrammingLanguage/Python/进阶/并行和并发">并行和并发</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/异常处理" data-for="Technology/ProgrammingLanguage/Python/进阶/异常处理">异常处理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/数据库操作" data-for="Technology/ProgrammingLanguage/Python/进阶/数据库操作">数据库操作</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/文件和IO操作" data-for="Technology/ProgrammingLanguage/Python/进阶/文件和IO操作">文件和IO操作</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/测试和调试" data-for="Technology/ProgrammingLanguage/Python/进阶/测试和调试">测试和调试</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/资源管理" data-for="Technology/ProgrammingLanguage/Python/进阶/资源管理">资源管理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/面向对象进阶" data-for="Technology/ProgrammingLanguage/Python/进阶/面向对象进阶">面向对象</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/项目"><button class="folder-button"><span class="folder-title">项目</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/项目"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/项目/虚拟环境"><button class="folder-button"><span class="folder-title">虚拟环境</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/项目/虚拟环境"><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/pip" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/pip">pip</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/pipenv" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/pipenv">pipenv</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/poetry" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/poetry">poetry</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/pyenv" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/pyenv">pyenv</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/virtualenv" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/virtualenv">Virtualenv</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/概述" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/概述">概述</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/项目/风格指南"><button class="folder-button"><span class="folder-title">风格指南</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/项目/风格指南"><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/风格指南/风格指南" data-for="Technology/ProgrammingLanguage/Python/项目/风格指南/风格指南">Python 风格指南</a></li></ul></div></li></ul></div></li></ul></div></li><li><a href="../../../Technology/ProgrammingLanguage/home" data-for="Technology/ProgrammingLanguage/home">程序设计语言</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering"><button class="folder-button"><span class="folder-title">SoftwareEngineering</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering/CI-and-CD"><button class="folder-button"><span class="folder-title">CI&CD</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering/CI-and-CD"><li><a href="../../../Technology/SoftwareEngineering/CI-and-CD/GitHub-Actions" data-for="Technology/SoftwareEngineering/CI-and-CD/GitHub-Actions">GitHub Actions</a></li><li><a href="../../../Technology/SoftwareEngineering/CI-and-CD/GitLab-Runner" data-for="Technology/SoftwareEngineering/CI-and-CD/GitLab-Runner">GitLab Runner</a></li><li><a href="../../../Technology/SoftwareEngineering/CI-and-CD/Jenkins" data-for="Technology/SoftwareEngineering/CI-and-CD/Jenkins">Jenkins</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering/协作规范"><button class="folder-button"><span class="folder-title">协作规范</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering/协作规范"><li><a href="../../../Technology/SoftwareEngineering/协作规范/8.交流反馈(Issue)" data-for="Technology/SoftwareEngineering/协作规范/8.交流反馈(Issue)">交流反馈(Issue)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/1.关于(Readme)" data-for="Technology/SoftwareEngineering/协作规范/1.关于(Readme)">关于(Readme)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/4.分支(Branch)" data-for="Technology/SoftwareEngineering/协作规范/4.分支(Branch)">分支(Branch)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/2.开源协议(License)" data-for="Technology/SoftwareEngineering/协作规范/2.开源协议(License)">开源协议(License)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/5.日志(Commit)" data-for="Technology/SoftwareEngineering/协作规范/5.日志(Commit)">日志(Commit)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/7.注释(Comments)" data-for="Technology/SoftwareEngineering/协作规范/7.注释(Comments)">注释(Comments)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/6.版本(Tag)" data-for="Technology/SoftwareEngineering/协作规范/6.版本(Tag)">版本(Tag)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/3.贡献者协议(Contributing)" data-for="Technology/SoftwareEngineering/协作规范/3.贡献者协议(Contributing)">贡献者协议(Contributing)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering/技术文档"><button class="folder-button"><span class="folder-title">技术文档</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering/技术文档"><li><a href="../../../Technology/SoftwareEngineering/技术文档/3.命名约定" data-for="Technology/SoftwareEngineering/技术文档/3.命名约定">命名约定</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/5.文档内容" data-for="Technology/SoftwareEngineering/技术文档/5.文档内容">文档内容</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/6.文档结构" data-for="Technology/SoftwareEngineering/技术文档/6.文档结构">文档结构</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/2.标点符号" data-for="Technology/SoftwareEngineering/技术文档/2.标点符号">标点符号</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/1.简介" data-for="Technology/SoftwareEngineering/技术文档/1.简介">简介</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/4.语言风格" data-for="Technology/SoftwareEngineering/技术文档/4.语言风格">语言风格</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/7.附录资料" data-for="Technology/SoftwareEngineering/技术文档/7.附录资料">附录资料</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/StructuresAlgorithms"><button class="folder-button"><span class="folder-title">StructuresAlgorithms</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/StructuresAlgorithms"><li><a href="../../../Technology/StructuresAlgorithms/数据结构" data-for="Technology/StructuresAlgorithms/数据结构">数据结构</a></li><li><a href="../../../Technology/StructuresAlgorithms/算法" data-for="Technology/StructuresAlgorithms/算法">算法</a></li></ul></div></li></ul></div></li><li><div class="folder-outer "><ul style="padding-left:0;" class="content" data-folderul></ul></div></li></ul></div></li><li id="explorer-end"></li></ul></div></div><div class="recent-notes desktop-only"><h3>博客</h3><ul class="recent-ul"><li class="recent-li"><div class="section"><div class="desc"><h3><a href="../../../Personal/Blog/2024/回读者信──240816" class="internal">回读者信──240816</a></h3></div><p class="meta">2024年8月16日</p></div></li><li class="recent-li"><div class="section"><div class="desc"><h3><a href="../../../Personal/Blog/2024/乌兰哈达火山银河之旅" class="internal">乌兰哈达火山银河之旅</a></h3></div><p class="meta">2024年6月27日</p></div></li><li class="recent-li"><div class="section"><div class="desc"><h3><a href="../../../Personal/Blog/2024/冰箱,让你我错过了多少新鲜的生活?" class="internal">冰箱,让你我错过了多少新鲜的生活?</a></h3></div><p class="meta">2024年6月27日</p></div></li></ul></div></div><div class="center"><div class="page-header"><div class="popover-hint"><nav class="breadcrumb-container" aria-label="breadcrumbs"><div class="breadcrumb-element"><a href="../../../">Home</a><p> ❯ </p></div><div class="breadcrumb-element"><a href="../../../Technology/">Technology</a><p> ❯ </p></div><div class="breadcrumb-element"><a href="../../../Technology/SoftwareEngineering/">SoftwareEngineering</a><p> ❯ </p></div><div class="breadcrumb-element"><a href="../../../Technology/SoftwareEngineering/CI-and-CD/">CI and CD</a><p> ❯ </p></div><div class="breadcrumb-element"><a href>Jenkins</a></div></nav><h1 class="article-title">Jenkins</h1><p show-comma="true" class="content-meta"><span>2024年9月06日</span><span>110分钟阅读</span></p></div></div><article class="popover-hint"><h2 id="jenkins-概述">Jenkins 概述<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-概述" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p><img src="https://static.7wate.com/2024/08/09/a76a2f574c2b5.svg" alt="Jenkins_logo_with_title.svg"/></p>
|
||
<h3 id="jenkins-是什么">Jenkins 是什么<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-是什么" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Jenkins 是一种广泛使用的开源自动化服务器,旨在简化和自动化软件开发过程中的各种任务,特别是在持续集成(CI)和持续交付(CD)方面。</strong> 持续集成是一种软件开发实践,强调频繁地将代码集成到共享代码库中,并自动进行构建和测试,以尽早发现和解决集成问题。持续交付进一步扩展了这一概念,通过自动化部署管道,使得代码可以在任何时间点安全地部署到生产环境中。Jenkins 通过插件体系支持构建、测试和部署的自动化工作流,是 CI/CD 实践的重要工具。</p>
|
||
<h3 id="jenkins-的历史与发展">Jenkins 的历史与发展<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-的历史与发展" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 的前身是 Hudson,由 Sun Microsystems 的开发者 Kohsuke Kawaguchi 于 2004 年创建。Hudson 在快速开发和社区支持下迅速流行,然而在 2011 年,由于与 Oracle(Sun Microsystems 被 Oracle 收购)在商标权和项目控制方面的分歧,Hudson 社区分裂,Kawaguchi 和大部分社区成员创建了一个新的项目 Jenkins。自此之后,Jenkins 迅速成为 CI/CD 领域的主流工具,并在全球范围内得到了广泛应用和支持。</p>
|
||
<p>Jenkins 的发展伴随着软件开发方式的演变,从最初的自动化构建工具,逐渐扩展为一个可以支持复杂持续交付和 DevOps 实践的平台。随着社区贡献的插件数量不断增加,Jenkins 的功能覆盖了从源码管理、编译、测试到部署的各个环节。近年来,Jenkins 社区推出了 Jenkins X,专注于云原生 CI/CD,进一步推动了 Jenkins 在容器化和微服务架构中的应用。</p>
|
||
<h3 id="jenkins-的架构及工作原理">Jenkins 的架构及工作原理<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-的架构及工作原理" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong><img src="https://static.7wate.com/2024/08/09/b662feac8fb27.gif" alt="jenkins-architecture.gif"/></strong></p>
|
||
<p>Jenkins 的核心架构由三部分组成:<strong>主服务器(Master)</strong>、<strong>构建代理(Agent/Slave)</strong> 和 <strong>工作节点(Node)</strong>。主服务器负责管理 Jenkins 的核心功能,包括调度构建作业、分配工作给构建代理、监控代理的执行情况以及提供用户接口。构建代理是实际执行构建、测试等任务的工作节点,可以分布在不同的物理或虚拟机器上。通过分布式架构,Jenkins 能够高效处理大规模并行任务。</p>
|
||
<p><img src="https://static.7wate.com/2024/08/09/b2cbab52bc188.png" alt="Jenkins Pipeline"/></p>
|
||
<p>Jenkins 的工作原理基于流水线(Pipeline)模型,流水线定义了构建、测试、部署等一系列任务的执行步骤。用户可以通过 Jenkins UI 或 Jenkinsfile(文本文件形式)来定义流水线。Jenkins 通过与源码管理系统(如 Git)、构建工具(如 Maven、Gradle)和部署工具(如 Kubernetes、Ansible)等的集成,实现自动化的端到端软件交付流程。</p>
|
||
<h3 id="jenkins-与其他-cicd-工具的对比">Jenkins 与其他 CI/CD 工具的对比<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-与其他-cicd-工具的对比" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 作为 CI/CD 工具的代表,与其他流行的工具如 GitLab CI、Travis CI、CircleCI、Bamboo 等存在差异。<strong>Jenkins 的优势在于其高度的可扩展性和灵活性,通过数千种插件可以与各种工具和平台集成,适用于从小型团队到大型企业的各种规模的项目。然而,这种灵活性也带来了较高的配置和维护成本。</strong></p>
|
||
<p>相比之下,GitLab CI 与 GitLab 紧密集成,适合使用 GitLab 进行源码管理的团队;Travis CI 和 CircleCI 提供简便的配置和云端执行,适合中小型团队的持续集成需求;Bamboo 则与 Atlassian 生态系统深度集成,适合使用 Jira、Bitbucket 等 Atlassian 工具链的团队。</p>
|
||
<p><strong>选择哪种工具往往取决于团队的现有技术栈、规模、预算以及特定需求。</strong></p>
|
||
<h2 id="jenkins-安装和配置">Jenkins 安装和配置<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-安装和配置" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>Jenkins 提供 <a href="https://www.jenkins.io/doc/book/installing/linux/" class="external">多种安装方式<svg aria-hidden="true" class="external-icon" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>,用户可以根据需求和环境选择适合的 <a href="https://www.jenkins.io/doc/book/installing/linux/" class="external">安装方法<svg aria-hidden="true" class="external-icon" viewBox="0 0 512 512"><path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"></path></svg></a>。</p>
|
||
<h3 id="初始配置和界面概览">初始配置和界面概览<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#初始配置和界面概览" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><img src="https://static.7wate.com/2024/08/09/88eaa910e3de8.png" alt="Updated-jenkins-view.png"/></p>
|
||
<p>在完成 Jenkins 的安装后,用户需要进行初始配置。第一次启动 Jenkins 时,会提示输入管理员密码,之后进入配置向导。配置向导会引导用户安装推荐的插件、创建管理员用户、配置邮件通知等基础设置。</p>
|
||
<p><strong>Jenkins 的用户界面直观且功能强大。</strong> 主界面分为多个部分,包括主菜单(Dashboard)、视图(Views)、构建队列(Build Queue)和系统管理(Manage Jenkins)。用户可以在主菜单中创建新的 Job、查看当前的构建状态和历史记录、配置 Jenkins 系统设置等。</p>
|
||
<p><img src="https://static.7wate.com/2024/08/15/bf11ac9982e36.png" alt="Jenkins 的用户界面"/></p>
|
||
<h3 id="系统配置全局安全设置系统信息环境变量配置">系统配置:全局安全设置、系统信息、环境变量配置<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#系统配置全局安全设置系统信息环境变量配置" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>系统配置是 Jenkins 正常运行的核心,良好的系统配置有助于提升 Jenkins 的性能、安全性和易用性。</p>
|
||
<ol>
|
||
<li><strong>全局安全设置</strong>:Jenkins 提供多种安全控制机制,包括用户身份验证、授权策略、SSL/TLS 加密、Agent 通信加密等。管理员可以配置基于角色的访问控制(Role-Based Access Control,RBAC),限制用户对不同项目和资源的访问权限。</li>
|
||
<li><strong>系统信息</strong>:Jenkins 系统信息页面显示了有关 Jenkins 实例的详细信息,包括 JVM 参数、系统属性、环境变量、插件版本等。这些信息对于故障排查和性能优化非常重要。</li>
|
||
<li><strong>环境变量配置</strong>:Jenkins 支持配置全局和 Job 级别的环境变量,这些变量可以在构建过程中使用。例如,可以配置 JAVA_HOME、MAVEN_HOME 等环境变量,确保构建脚本在执行时能够找到正确的工具和依赖项。</li>
|
||
</ol>
|
||
<p><img src="https://static.7wate.com/2024/08/15/bf11ac9982e36.png" alt="Jenkins 系统配置"/></p>
|
||
<h3 id="用户管理创建用户和角色权限分配">用户管理:创建用户和角色,权限分配<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#用户管理创建用户和角色权限分配" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>用户管理是 Jenkins 系统配置中的重要部分。**Jenkins 支持多种用户管理方式,包括内置用户数据库、LDAP、Active Directory 等。**管理员可以创建用户账户,并通过角色策略分配权限,确保不同用户具有适当的操作权限。</p>
|
||
<ul>
|
||
<li><strong>创建用户和角色</strong>:管理员可以通过 Jenkins UI 创建新用户,并为用户分配特定的角色。角色可以是系统管理员、开发人员、测试人员等,根据角色的不同,用户在 Jenkins 中的操作权限也会有所不同。</li>
|
||
<li><strong>权限分配</strong>:Jenkins 通过授权策略控制用户的操作权限。常见的授权策略包括基于项目的矩阵权限策略、基于角色的权限策略等。管理员可以灵活配置用户对不同 Job、视图、节点的访问和操作权限,确保系统的安全性和管理的可控性。</li>
|
||
</ul>
|
||
<h2 id="jenkins-插件系统">Jenkins 插件系统<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-插件系统" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>Jenkins 的强大功能和灵活性主要得益于其丰富的插件系统。插件为 Jenkins 提供了各种扩展能力,如源码管理、构建工具、测试框架、部署工具的集成,以及 UI 增强、安全性增强等。通过插件,Jenkins 可以适应不同的开发流程、工具链和部署环境。</p>
|
||
<ul>
|
||
<li><strong>插件的重要性</strong>:Jenkins 的核心非常轻量级,而其大部分功能都是通过插件实现的。这种设计使得 Jenkins 能够根据项目需求进行定制化,避免了功能冗余和系统过度复杂化。插件生态的活跃程度也是 Jenkins 社区的重要标志,数以千计的插件为全球用户提供了广泛的选择。</li>
|
||
<li><strong>插件管理方法</strong>:插件管理是 Jenkins 系统维护的重要内容。管理员可以通过 Jenkins UI 的插件管理界面安装、更新和卸载插件。安装插件时,推荐选择通过官方插件库进行,确保插件的安全性和稳定性。管理员还需要定期检查插件的更新,并测试更新前后的兼容性,以避免系统问题。</li>
|
||
</ul>
|
||
<p><img src="https://static.7wate.com/2024/08/15/b69f41e5c3660.png" alt="Jenkins 插件系统"/></p>
|
||
<h3 id="常用插件介绍与配置">常用插件介绍与配置<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#常用插件介绍与配置" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th><strong>插件</strong></th><th><strong>主要功能</strong></th><th><strong>应用场景</strong></th><th><strong>工作环节</strong></th><th><strong>额外说明</strong></th></tr></thead><tbody><tr><td><strong>Git Plugin</strong></td><td>支持 Jenkins 与 Git 版本控制系统的集成。</td><td>适用于使用 Git 作为版本控制系统的项目,实现代码的拉取、分支管理、触发基于 Git 事件的构建。</td><td>源码管理</td><td>与 GitHub、GitLab 等平台集成良好,支持 Webhook、Pull Request 构建触发。</td></tr><tr><td><strong>Pipeline Plugin</strong></td><td>允许用户使用代码(Jenkinsfile)定义构建、测试和部署流程。</td><td>适用于需要复杂 CI/CD 流水线的项目,支持 Declarative 和 Scripted 两种 Pipeline 语法,提升自动化程度和流程可重复性。</td><td>构建/流水线</td><td>Pipeline 是 Jenkins 自动化的核心插件,几乎所有复杂的 Jenkins 实践都依赖它。</td></tr><tr><td><strong>Blue Ocean</strong></td><td>提供现代化的 Jenkins UI,提升 Pipeline 可视化体验。</td><td>适用于希望通过直观的图形界面管理和监控 Pipeline 的团队,特别是在大型团队和复杂项目中。</td><td>用户界面/可视化</td><td>提供更好的 Pipeline 可视化和执行状态展示,便于调试和分析。</td></tr><tr><td><strong>Maven Integration Plugin</strong></td><td>提供对 Apache Maven 项目的集成支持。</td><td>适用于使用 Maven 进行构建的 Java 项目,简化 Maven 生命周期管理和依赖处理。</td><td>构建/编译</td><td>支持自动化处理 Maven 构建、测试、打包、部署,集成代码质量分析工具(如 SonarQube)。</td></tr><tr><td><strong>Docker Plugin</strong></td><td>支持在 Docker 容器中运行 Jenkins 构建任务。</td><td>适用于希望在隔离环境中运行构建任务的项目,特别是需要一致性构建环境的场景,如构建微服务、容器化应用等。</td><td>构建/环境管理</td><td>通过容器化技术确保构建环境的一致性,支持 Docker 镜像的构建、推送和运行。</td></tr><tr><td><strong>Credentials Plugin</strong></td><td>提供安全管理和存储凭证(如密码、SSH 密钥、API Tokens)。</td><td>适用于需要在构建过程中使用敏感信息的项目,如推送代码到 Git 仓库、访问 API、登录服务器等。</td><td>安全/凭证管理</td><td>与其他插件集成良好,支持在 Pipeline 中安全使用凭证,避免明文暴露敏感信息。</td></tr><tr><td><strong>GitHub Plugin</strong></td><td>提供与 GitHub 的深度集成支持,管理 Webhook、Pull Request 触发构建。</td><td>适用于在 GitHub 上托管代码的项目,自动化处理 Pull Request 流程、代码变更触发构建等。</td><td>源码管理/集成</td><td>与 Git Plugin 搭配使用,提供对 GitHub 特定功能的支持,如检查状态、自动合并等。</td></tr><tr><td><strong>Slack Notification Plugin</strong></td><td>支持将 Jenkins 构建状态通知发送到 Slack 频道。</td><td>适用于需要即时通知构建状态的团队,特别是在 DevOps 实践中,通过 Slack 实时通知团队成员构建成功或失败。</td><td>通知</td><td>提供消息格式化、频道选择等配置选项,支持根据构建结果触发不同的通知。</td></tr><tr><td><strong>JUnit Plugin</strong></td><td>解析并展示 JUnit 测试结果,生成测试报告。</td><td>适用于需要集成单元测试的项目,通过自动化测试提升代码质量,生成并展示测试结果和趋势分析。</td><td>测试/报告生成</td><td>支持解析 JUnit 格式的 XML 报告,适用于 Java 项目和使用类似测试框架的其他项目。</td></tr><tr><td><strong>SonarQube Plugin</strong></td><td>与 SonarQube 集成,进行代码质量分析。</td><td>适用于需要进行代码静态分析的项目,通过集成 SonarQube,自动化分析代码质量,生成报告。</td><td>代码质量/分析</td><td>适用于希望持续监控代码质量的团队,特别是在大型项目和敏捷开发环境中。</td></tr><tr><td><strong>Parameterized Trigger Plugin</strong></td><td>允许触发其他 Jenkins Job 并传递参数。</td><td>适用于需要跨 Job 触发构建任务的项目,特别是在复杂的 CI/CD 流程中,通过参数化触发实现灵活的构建配置。</td><td>构建/触发器</td><td>支持在 Pipeline 中调用和配置,传递动态参数以适应不同的构建需求。</td></tr><tr><td><strong>Active Choices Plugin</strong></td><td>允许在参数化构建中动态生成参数选项。</td><td>适用于需要用户在构建时根据特定条件选择不同参数的场景,例如多分支部署、不同环境配置等。</td><td>构建/参数化</td><td>提供参数化选择的动态生成,根据条件展示不同的选项,提升参数化构建的灵活性。</td></tr><tr><td><strong>ThinBackup Plugin</strong></td><td>提供 Jenkins 配置和数据的备份与恢复功能。</td><td>适用于需要定期备份 Jenkins 配置、Job 数据等的场景,确保在系统故障时可以快速恢复。</td><td>备份/恢复</td><td>支持增量备份、定时备份等功能,简化 Jenkins 的运维管理。</td></tr><tr><td><strong>Build Pipeline Plugin</strong></td><td>允许将多个 Job 组合成一个可视化的流水线。</td><td>适用于需要通过多个 Job 组合实现复杂流水线的项目,提升流程的可视化和可管理性。</td><td>流水线/可视化</td><td>提供可视化的流水线展示和管理,适用于 DevOps 实践中多阶段自动化流程的实现。</td></tr><tr><td><strong>Job DSL Plugin</strong></td><td>通过代码定义 Jenkins Job,支持批量创建和管理 Job。</td><td>适用于需要自动化配置 Jenkins Job 的团队,特别是在大规模项目中,通过 DSL 脚本简化 Job 管理。</td><td>构建/配置管理</td><td>支持通过代码定义和管理 Job,与版本控制系统集成,提升可维护性和可移植性。</td></tr><tr><td><strong>Mailer Plugin</strong></td><td>发送构建结果通知邮件。</td><td>适用于需要通过邮件通知构建结果的项目,通过自动化邮件通知开发团队构建状态、测试结果等。</td><td>通知</td><td>提供简单的邮件配置选项,支持根据构建结果发送不同的通知邮件。</td></tr><tr><td><strong>AnsiColor Plugin</strong></td><td>在 Jenkins 控制台输出中显示带颜色的日志。</td><td>适用于希望在控制台中通过颜色区分不同类型日志信息的场景,如错误、警告、调试信息等。</td><td>日志/可视化</td><td>提供对多种终端颜色的支持,提升控制台日志的可读性,便于调试和分析。</td></tr><tr><td><strong>Kubernetes Plugin</strong></td><td>支持在 Kubernetes 集群中动态创建 Jenkins Agent,运行构建任务。</td><td>适用于在 Kubernetes 环境中运行 Jenkins 的团队,自动化创建和管理构建节点,确保构建环境的弹性和可扩展性。</td><td>构建/环境管理</td><td>通过 Kubernetes 动态管理 Jenkins Agent,适用于大规模分布式构建环境。</td></tr><tr><td><strong>JIRA Plugin</strong></td><td>与 Atlassian JIRA 集成,自动化工单管理。</td><td>适用于使用 JIRA 进行项目管理的团队,通过 Jenkins 自动创建、更新、关闭 JIRA 工单。</td><td>项目管理/工单管理</td><td>提供 JIRA 和 Jenkins 之间的双向集成,提升项目管理自动化水平,适用于敏捷开发团队。</td></tr><tr><td><strong>Artifactory Plugin</strong></td><td>集成 JFrog Artifactory,用于管理和发布构件。</td><td>适用于需要管理构件存储和发布的项目,通过集成 Artifactory,自动化管理构件的版本、依赖和分发。</td><td>构件管理/发布</td><td>支持与 Artifactory 的双向集成,自动化管理构件生命周期,适用于企业级 DevOps 实践。</td></tr></tbody></table></div>
|
||
<h3 id="插件的更新和备份策略">插件的更新和备份策略<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#插件的更新和备份策略" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>插件的更新和备份策略是 Jenkins 管理中的关键环节。为了保证系统的稳定性和安全性,管理员需要定期更新插件,并在更新前后做好备份。</p>
|
||
<ul>
|
||
<li><strong>插件更新</strong>:插件更新可以通过 Jenkins 的插件管理界面完成。更新前,管理员应先阅读插件的更新日志,了解新版本的改动和潜在影响。更新完成后,建议进行系统测试,确保新插件与现有配置和流水线兼容。</li>
|
||
<li><strong>备份策略</strong>:定期备份 Jenkins 的配置和插件文件对于应对系统故障和数据丢失非常重要。备份内容包括 Jenkins 的配置文件、Job 定义、插件目录等。管理员可以使用 Jenkins 的备份插件(如 ThinBackup)或脚本定期备份这些数据,并将备份文件存储在安全的远程位置。</li>
|
||
</ul>
|
||
<h3 id="插件冲突与兼容性问题的解决">插件冲突与兼容性问题的解决<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#插件冲突与兼容性问题的解决" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>插件冲突和兼容性问题是 Jenkins 管理中常见的挑战。当多个插件同时作用于系统时,可能会出现功能冲突或性能问题。为了有效应对这些问题,管理员可以采取以下措施:</p>
|
||
<ul>
|
||
<li><strong>隔离测试</strong>:在更新或安装新插件之前,建议先在测试环境中进行隔离测试。通过模拟生产环境的工作流,管理员可以检测到潜在的插件冲突,并在生产环境中更新前解决这些问题。</li>
|
||
<li><strong>日志分析</strong>:Jenkins 提供了详细的日志功能,当系统出现问题时,管理员可以通过分析日志文件查找冲突的原因。常见的日志文件包括 Jenkins 主日志、Job 执行日志和插件日志等。</li>
|
||
<li><strong>社区支持</strong>:Jenkins 社区是解决插件冲突和兼容性问题的重要资源。管理员可以通过 Jenkins 官方论坛、Stack Overflow 等平台寻求社区帮助,也可以直接联系插件的维护者报告问题或获取支持。</li>
|
||
</ul>
|
||
<h2 id="jenkins-job">Jenkins Job<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-job" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<h3 id="自由风格项目freestyle-project">自由风格项目(Freestyle Project)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#自由风格项目freestyle-project" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>自由风格项目是 Jenkins 中最基本的 Job 类型,也是使用最广泛的。它提供了高度的灵活性,允许用户通过图形用户界面(GUI)配置和管理构建、测试、部署等任务。</p>
|
||
<ul>
|
||
<li><strong>简单配置</strong>:用户可以通过点击和选择的方式配置构建步骤,而无需编写代码。</li>
|
||
<li><strong>多种构建步骤</strong>:支持执行 shell 脚本、批处理命令、调用 Ant、Maven、Gradle 等构建工具,以及集成单元测试和代码质量检查工具。</li>
|
||
<li><strong>灵活的触发机制</strong>:支持 SCM 轮询、定时构建、Webhook 触发等多种构建触发机制。</li>
|
||
<li><strong>插件支持</strong>:自由风格项目可以通过安装和配置插件,扩展其功能,如集成 Git、Subversion 版本控制,使用 SonarQube 进行代码质量分析等。</li>
|
||
</ul>
|
||
<p>自由风格项目适用于需要快速搭建和配置的简单构建任务,如小型项目的编译、测试和部署。它也是新手用户学习 Jenkins 基本操作的入门选择。</p>
|
||
<h3 id="流水线项目pipeline-project">流水线项目(Pipeline Project)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#流水线项目pipeline-project" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>流水线项目是 Jenkins 提供的另一种强大的 Job 类型,它以代码的形式(通常存储在 Jenkinsfile 中)定义构建、测试、部署等整个流程。Pipeline 使用 Groovy 语言编写,提供了比自由风格项目更强大的功能和灵活性。</p>
|
||
<ul>
|
||
<li><strong>Pipeline as Code</strong>:流水线定义存储在代码中(Jenkinsfile),并与项目的版本控制系统集成,使构建流程的版本管理、审查和协作成为可能。</li>
|
||
<li><strong>复杂的流水线</strong>:支持定义多阶段(Stages)的流水线,可以串行、并行或条件性地执行不同任务。支持并行执行测试、自动化部署等高级功能。</li>
|
||
<li><strong>两种语法模式</strong>:支持 Declarative 和 Scripted 两种语法模式。Declarative 语法更简洁,适合大多数场景;Scripted 语法则更灵活,适合高级用户编写复杂逻辑。</li>
|
||
<li><strong>共享库</strong>:可以通过共享库(Shared Library)复用代码片段,提升流水线的可维护性和重用性。</li>
|
||
</ul>
|
||
<p>流水线项目适合需要高度定制化和自动化的复杂 CI/CD 流程,尤其是在大型团队和企业级项目中。它在微服务、容器化应用和云原生开发中尤为常用。</p>
|
||
<h3 id="多分支流水线项目multibranch-pipeline-project">多分支流水线项目(Multibranch Pipeline Project)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#多分支流水线项目multibranch-pipeline-project" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>多分支流水线项目是对流水线项目的扩展,自动化管理版本控制系统中的多个分支,并为每个分支创建独立的 Pipeline Job。它自动检测新分支,并根据 Jenkinsfile 定义的流程执行构建和测试。</p>
|
||
<ul>
|
||
<li><strong>自动分支检测</strong>:Jenkins 自动扫描版本控制系统中的所有分支,并为每个分支创建单独的 Job。这意味着新分支一旦创建,Jenkins 就会自动为其触发构建。</li>
|
||
<li><strong>分支隔离</strong>:每个分支都有独立的构建历史和流水线,避免了不同分支间的冲突和干扰。</li>
|
||
<li><strong>支持多种版本控制系统</strong>:支持 Git、Subversion 等版本控制系统,可以通过插件扩展更多 VCS 的支持。</li>
|
||
<li><strong>Pull Request 构建</strong>:集成 GitHub、GitLab 等平台时,可以自动检测 Pull Request,并在合并之前执行构建和测试,确保代码质量。</li>
|
||
</ul>
|
||
<p>多分支流水线项目适合采用 Git Flow 或其他多分支开发模型的项目,特别是在需要频繁创建和合并分支的团队中。它在大规模、多团队协作的开发环境中表现出色。</p>
|
||
<h3 id="maven-项目maven-project">Maven 项目(Maven Project)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#maven-项目maven-project" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Maven 项目是专为 Apache Maven 构建工具设计的 Jenkins Job 类型。它集成了 Maven 的构建生命周期,简化了 Maven 项目的配置和管理。</p>
|
||
<ul>
|
||
<li><strong>Maven 集成</strong>:自动化处理 Maven 的构建生命周期,包括编译、测试、打包、部署等步骤。Jenkins 能够直接解析和使用 <code>pom.xml</code> 文件中的配置信息。</li>
|
||
<li><strong>依赖管理</strong>:通过 Maven 项目,Jenkins 可以自动管理项目的依赖关系,并在构建时下载所需的库和插件。</li>
|
||
<li><strong>报告和分析</strong>:支持生成和展示 Maven 的构建报告、测试报告和代码覆盖率报告(如使用 JaCoCo、Cobertura)。</li>
|
||
<li><strong>多模块支持</strong>:Maven 项目能够处理多模块的 Maven 项目,自动化管理每个模块的构建流程。</li>
|
||
</ul>
|
||
<p>Maven 项目专为使用 Maven 构建工具的 Java 项目设计,适合需要利用 Maven 的强大依赖管理和生命周期功能的开发团队。</p>
|
||
<h3 id="外部任务external-job">外部任务(External Job)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#外部任务external-job" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>外部任务是 Jenkins 提供的一种特殊 Job 类型,主要用于监控和集成在 Jenkins 外部执行的任务。它允许 Jenkins 记录这些任务的执行状态和结果。</p>
|
||
<ul>
|
||
<li><strong>任务监控</strong>:Jenkins 可以监控外部脚本或命令的执行状态,并记录它们的运行日志和结果。</li>
|
||
<li><strong>轻量集成</strong>:外部任务不直接在 Jenkins 内部执行,但可以通过脚本或外部工具将任务状态反馈到 Jenkins。</li>
|
||
<li><strong>灵活性</strong>:适合不希望或不能直接在 Jenkins 中执行的任务,如特定的系统任务、批处理作业或定制的自动化脚本。</li>
|
||
</ul>
|
||
<p>外部任务适合那些已经存在且不方便迁移到 Jenkins 内部的自动化任务,或需要与其他自动化工具集成的场景。</p>
|
||
<h3 id="pipeline-as-code-项目pipeline-as-code-project">Pipeline as Code 项目(Pipeline-as-Code Project)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#pipeline-as-code-项目pipeline-as-code-project" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Pipeline as Code 项目是 Jenkins 鼓励的一种 CI/CD 实践,它将整个 Pipeline 定义通过代码的方式管理,通常与多分支流水线项目结合使用。虽然在技术上,它并不是一个单独的 Job 类型,但它代表了一种管理和执行 Pipeline 的方式。</p>
|
||
<ul>
|
||
<li><strong>代码版本化</strong>:Pipeline 定义与项目代码一起存储在版本控制系统中,所有变更都通过代码审查和版本控制管理。</li>
|
||
<li><strong>自动触发</strong>:每次代码变更都会触发相应分支的 Pipeline 执行,确保代码在每次提交后都被自动测试和部署。</li>
|
||
<li><strong>集成最佳实践</strong>:Pipeline as Code 项目通常集成了 DevOps 的最佳实践,如持续集成、持续交付、安全扫描、自动化测试等。</li>
|
||
</ul>
|
||
<p>Pipeline as Code 项目适合推行 DevOps 文化的团队,尤其是那些希望将自动化流程与代码管理无缝集成的团队。</p>
|
||
<h3 id="组合项目matrix-project">组合项目(Matrix Project)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#组合项目matrix-project" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>组合项目,也称为矩阵项目,是 Jenkins 中的一种特殊 Job 类型,允许用户在多个维度(如操作系统、JDK 版本等)上并行运行多个构建配置。</p>
|
||
<ul>
|
||
<li><strong>多维度构建</strong>:允许定义多个轴(如操作系统、编译器版本、依赖版本等),并为每个组合运行独立的构建。</li>
|
||
<li><strong>并行执行</strong>:可以在多台机器或多个 Agent 上并行执行构建任务,大大加快测试和构建速度。</li>
|
||
<li><strong>结果聚合</strong>:组合项目可以汇总和展示所有维度的构建结果,帮助用户全面了解构建的兼容性和性能。</li>
|
||
</ul>
|
||
<p>组合项目适合需要在不同环境中验证代码兼容性的大型项目,如跨平台应用的构建和测试、不同 JDK 版本下的 Java 应用构建等。</p>
|
||
<h3 id="外部工作流external-workflow">外部工作流(External Workflow)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#外部工作流external-workflow" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>外部工作流是一种允许 Jenkins 与外部工作流引擎集成的 Job 类型。它类似于外部任务,但专注于与外部工作流系统的集成和监控。</p>
|
||
<ul>
|
||
<li><strong>工作流集成</strong>:可以与外部工作流系统(如 Apache Airflow、Apache Oozie)集成,管理复杂的分布式任务。</li>
|
||
<li><strong>状态监控</strong>:Jenkins 可以监控外部工作流的状态和进度,并在工作流完成时记录结果。</li>
|
||
<li><strong>灵活扩展</strong>:支持通过脚本和插件与更多外部工作流工具集成。</li>
|
||
</ul>
|
||
<p>外部工作流适合需要与现有工作流系统集成的企业,特别是那些依赖分布式计算和批处理作业的场景。</p>
|
||
<h3 id="构建流水线插件项目build-pipeline-plugin-project">构建流水线插件项目(Build Pipeline Plugin Project)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#构建流水线插件项目build-pipeline-plugin-project" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>构建流水线插件项目是 Jenkins 的一种扩展,通过 Build Pipeline Plugin,用户可以将多个自由风格项目或其他 Job 类型组合成一个流水线,定义复杂的构建、测试和部署流程。</p>
|
||
<ul>
|
||
<li><strong>可视化流水线</strong>:提供图形化界面展示多个 Job 之间的依赖关系和执行顺序,便于管理和监控复杂的流水线流程。</li>
|
||
<li><strong>任务编排</strong>:支持配置多个 Job 的触发条件和依赖关系,实现复杂任务的编排和自动化执行。</li>
|
||
<li><strong>手动审批</strong>:支持在流水线的关键步骤中加入手动审批环节,适合需要人为干预的发布流程。</li>
|
||
</ul>
|
||
<p>构建流水线插件项目适合需要将多个 Jenkins Job 组合成复杂流水线的项目,尤其在 DevOps 实践中,通过可视化管理和监控多个任务的执行,提升团队协作效率。</p>
|
||
<h3 id="配置源码管理gitsubversion">配置源码管理(Git、Subversion)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#配置源码管理gitsubversion" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 通过源码管理插件支持多种版本控制系统,包括 Git、Subversion、Mercurial 等。在配置 Job 时,用户可以指定项目的源码管理系统,以便 Jenkins 能够自动拉取最新代码进行构建。</p>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th><strong>源码管理系统</strong></th><th><strong>概述</strong></th><th><strong>主要特点</strong></th><th><strong>使用场景</strong></th></tr></thead><tbody><tr><td><strong>Git</strong></td><td>分布式版本控制系统,广泛用于开源和企业项目中。</td><td>分布式架构,支持离线操作、强大的分支管理功能、高效的合并与冲突解决、与 GitHub、GitLab 等平台无缝集成</td><td>适用于几乎所有类型的软件项目,特别是需要复杂分支管理、多团队协作、开源项目和 DevOps 流程的开发环境。</td></tr><tr><td><strong>Subversion (SVN)</strong></td><td>集中式版本控制系统,支持精细化权限控制,广泛应用于企业。</td><td>集中式架构,便于集中管理、精细的访问控制和权限管理、支持目录级版本控制、提供日志和版本历史的详细记录</td><td>适用于需要严格权限控制的企业级项目,特别是那些需要维护大量历史版本记录和对特定目录进行精确管理的情况。</td></tr><tr><td><strong>Mercurial</strong></td><td>分布式版本控制系统,类似于 Git,但更注重性能和易用性。</td><td>分布式架构,支持离线操作、易于使用,性能优异、良好的跨平台支持、简洁清晰的分支和合并模型</td><td>适用于对性能和易用性有较高要求的开发团队,尤其是中小型项目,或者在 Git 之外需要额外的分布式版本控制方案时。</td></tr><tr><td><strong>Perforce (Helix Core)</strong></td><td>商业化集中式版本控制系统,强大而复杂,支持大规模项目的版本控制。</td><td>强大的文件锁定和版本控制机制、集中式管理,支持大规模项目、高效处理大型文件、支持代码和数字资产的版本管理</td><td>适用于大型企业和游戏、影视制作等需要处理大型文件和复杂项目依赖的场景,特别是那些需要精确控制和严格管理的开发流程。</td></tr><tr><td><strong>ClearCase</strong></td><td>IBM 提供的集中式版本控制系统,适合复杂企业环境。</td><td>支持复杂的版本管理和配置管理、强大的访问控制、集成化管理开发和配置工具、支持多站点、多平台环境</td><td>适用于有严格配置管理要求的企业级项目,特别是在复杂企业环境中需要管理多种平台和分布式开发团队时。</td></tr><tr><td><strong>TFS (Azure DevOps Server)</strong></td><td>微软提供的版本控制系统,集成了项目管理和 CI/CD 工具。</td><td>集成了版本控制、构建、发布、测试和项目管理、支持 Git 和 TFVC、与 Azure DevOps 深度集成,支持 CI/CD 流水线</td><td>适用于使用微软技术栈的企业,特别是在使用 Azure 云服务的环境中,或者希望将版本控制与项目管理和 DevOps 工具无缝集成的团队。</td></tr><tr><td><strong>CVS (Concurrent Versions System)</strong></td><td>早期流行的集中式版本控制系统,现已逐渐被其他 VCS 取代。</td><td>集中式管理、简单易用、基本的版本控制功能、早期开发工具集成支持</td><td>适用于维护旧有的遗留系统或非常小型的项目,对于那些历史悠久的代码库或不需要复杂功能的项目依然可能有所使用。</td></tr><tr><td><strong>Bitbucket</strong></td><td>Atlassian 提供的 Git 版本控制系统,集成了项目管理工具和 CI/CD。</td><td>Git 支持、与 Jira、Confluence 集成、支持 Pull Request 审查、内置 CI/CD 管道(Bitbucket Pipelines)</td><td>适用于与 Atlassian 工具链(如 Jira、Confluence)深度集成的团队,特别是在使用 Bitbucket Cloud 或 Server 的开发环境中。</td></tr><tr><td><strong>GitHub</strong></td><td>全球最流行的 Git 托管平台,广泛应用于开源项目和企业开发。</td><td>Git 支持、强大的 Pull Request 和代码审查功能、支持 GitHub Actions 实现 CI/CD、大量社区插件和工具支持</td><td>适用于开源项目和需要与全球开发者社区协作的项目,以及希望使用 GitHub 提供的丰富 CI/CD 功能和集成能力的企业和个人开发者。</td></tr></tbody></table></div>
|
||
<h3 id="构建触发器scm-轮询webhook定时任务">构建触发器:SCM 轮询、Webhook、定时任务<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#构建触发器scm-轮询webhook定时任务" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 支持多种构建触发器,用户可以灵活配置 Job 的触发条件,确保构建流程在合适的时机自动启动。</p>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th><strong>构建触发器</strong></th><th><strong>概述</strong></th><th><strong>主要特点</strong></th><th><strong>使用场景</strong></th></tr></thead><tbody><tr><td><strong>SCM 轮询</strong> (Poll SCM)</td><td>定期检查源码管理系统(SCM)的变更,当检测到代码变更时触发构建。</td><td>使用 Cron 表达式配置轮询频率、自动检测源码变更并触发构建、简单易用,配置灵活</td><td>适用于需要定期检查代码变更的项目,特别是小型团队或不频繁的代码更新场景。</td></tr><tr><td><strong>Webhook</strong></td><td>通过 Webhook 通知直接触发 Jenkins 构建任务。</td><td>实时性强,无需轮询、减少服务器负载、与 GitHub、GitLab 等 VCS 平台无缝集成</td><td>适用于希望实时响应代码变更的项目,特别是在大型团队中需要快速反馈或与 GitHub、GitLab 集成的场景。</td></tr><tr><td><strong>定时构建</strong> (Scheduled Build)</td><td>在预设的时间点或周期性地触发构建任务。</td><td>使用 Cron 表达式配置构建时间、支持定时执行构建、可以用于生成每日构建、定期测试等任务</td><td>适用于需要定期生成构建版本、执行定期任务(如回归测试)或确保构建环境稳定的项目。</td></tr><tr><td><strong>手动触发</strong> (Manual Trigger)</td><td>由用户手动启动的构建任务。</td><td>灵活控制构建启动时间、支持用户通过 UI 或 API 手动触发、适用于测试和特殊场景</td><td>适用于需要人为控制构建时间的场景,如代码发布前的最后检查、手动执行特定测试等。</td></tr><tr><td><strong>上游/下游项目触发</strong> (Upstream/Downstream Trigger)</td><td>当一个 Job 完成时,自动触发另一个相关的 Job。</td><td>支持多 Job 之间的依赖关系、允许创建复杂的构建链、可以配置在上游任务成功、失败或完成时触发</td><td>适用于多个构建任务之间存在依赖关系的场景,特别是需要串联多个构建任务或在构建完成后自动执行测试、部署等后续任务的项目。</td></tr><tr><td><strong>构建后操作触发</strong> (Post-Build Actions)</td><td>在构建完成后根据结果触发后续操作或构建任务。</td><td>灵活配置不同结果的触发条件、支持在构建失败、成功、总是等不同情况下触发、适用于自动化发布、通知等后续操作</td><td>适用于需要根据构建结果自动执行某些操作的场景,如在构建失败时发送通知、在成功时发布 Artefact 或触发下游构建任务。</td></tr><tr><td><strong>远程触发</strong> (Remote Trigger)</td><td>通过 HTTP 请求远程触发 Jenkins 构建。</td><td>支持通过 URL 触发构建、可以配置触发器令牌进行安全控制、适用于系统集成和自动化脚本</td><td>适用于需要从外部系统或脚本中触发 Jenkins 构建的场景,如通过自动化测试平台、持续集成工具或其他应用直接触发 Jenkins Job。</td></tr><tr><td><strong>节点标签触发</strong> (Node Label Trigger)</td><td>根据特定节点或标签触发构建任务。</td><td>基于节点标签分配构建任务、支持在特定环境或机器上执行构建、提供更多构建调度的灵活性</td><td>适用于需要在特定机器或环境中执行构建的场景,特别是当不同的构建任务需要不同的硬件资源或软件配置时。</td></tr><tr><td><strong>参数化触发</strong> (Parameterized Trigger)</td><td>允许用户在触发构建时传递参数,实现动态构建。</td><td>用户可以在构建时输入参数、支持根据输入参数动态调整构建流程、适用于需要在不同环境中运行或根据用户输入动态配置的场景</td><td>适用于需要根据用户输入或外部条件调整构建流程的场景,如在不同环境中部署、生成不同配置的构建 Artefact 或执行特定的测试组合等。</td></tr><tr><td><strong>Pipeline 触发器</strong> (Pipeline Trigger)</td><td>当一个 Pipeline 完成时,触发另一个 Pipeline 或 Job。</td><td>支持流水线之间的依赖和触发、灵活配置触发条件、集成复杂的 CI/CD 流水线</td><td>适用于多个 Pipeline 或 Job 之间存在依赖关系的复杂 CI/CD 流程,特别是在大规模自动化部署和测试环境中。</td></tr></tbody></table></div>
|
||
<h3 id="构建步骤编译测试打包部署">构建步骤:编译、测试、打包、部署<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#构建步骤编译测试打包部署" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>构建步骤定义了 Job 的具体执行内容,是整个 Jenkins 自动化流程的核心部分。根据项目需求,构建步骤可以包括以下内容:</p>
|
||
<pre><code class="mermaid">graph LR
|
||
A[开始] --> B[编译]
|
||
B --> C[测试]
|
||
C --> D[打包]
|
||
D --> E[部署]
|
||
E --> F[结束]
|
||
|
||
subgraph 编译阶段
|
||
B1[选择编译工具]
|
||
B2[指定编译路径和选项]
|
||
B --> B1 --> B2
|
||
end
|
||
|
||
subgraph 测试阶段
|
||
C1[单元测试]
|
||
C2[集成测试]
|
||
C3[端到端测试]
|
||
C --> C1 --> C2 --> C3
|
||
end
|
||
|
||
subgraph 打包阶段
|
||
D1[生成 JAR/WAR 文件]
|
||
D2[生成前端压缩包]
|
||
D --> D1 --> D2
|
||
end
|
||
|
||
subgraph 部署阶段
|
||
E1[选择部署工具]
|
||
E2[部署到测试或生产环境]
|
||
E --> E1 --> E2
|
||
end
|
||
|
||
</code></pre>
|
||
<ul>
|
||
<li><strong>编译</strong>:对于编程语言的编译项目,如 Java、C++ 等,构建步骤首先执行代码编译。Jenkins 支持多种编译工具,如 Maven、Gradle、Ant 等。配置编译步骤时,用户需要指定编译工具的路径、目标文件和编译选项。</li>
|
||
<li><strong>测试</strong>:测试是 CI 流程中的关键环节,Jenkins 支持集成多种测试框架,如 JUnit、Testing、Selenium 等。用户可以配置单元测试、集成测试和端到端测试的执行步骤,并在构建过程中自动生成测试报告。</li>
|
||
<li><strong>打包</strong>:编译和测试通过后,构建步骤通常包括打包操作。对于 Java 项目,打包步骤可能生成 JAR 或 WAR 文件;对于前端项目,可能生成压缩后的静态资源包。打包步骤可以集成版本控制,确保每个构建都生成唯一标识的可发布包。</li>
|
||
<li><strong>部署</strong>:最后,Jenkins 可以自动将打包好的应用部署到测试环境或生产环境。部署步骤可以使用各种工具,如 Ansible、Docker、Kubernetes 等,实现从构建到发布的全流程自动化。</li>
|
||
</ul>
|
||
<h2 id="pipeline-脚本">Pipeline 脚本<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#pipeline-脚本" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>Pipeline 是 Jenkins 用于定义和执行自动化流程的核心概念。通过 Pipeline,用户可以以代码形式定义从构建、测试到部署的整个流程。Pipeline 的优势包括:</p>
|
||
<ul>
|
||
<li><strong>可维护性</strong>:由于 Pipeline 定义在代码中(Jenkinsfile),团队可以将其纳入版本控制,与项目源码同步管理。任何对 Pipeline 的修改都能通过代码审查流程进行,确保变更的安全性和可追溯性。</li>
|
||
<li><strong>复用性</strong>:Pipeline 支持将常用的步骤和逻辑封装成共享库,供多个项目复用。这不仅提高了开发效率,还减少了重复配置带来的维护成本。</li>
|
||
<li><strong>可视化</strong>:Jenkins 提供了强大的 Pipeline 可视化工具(如 Blue Ocean),帮助团队实时监控和管理 Pipeline 的执行状态,及时发现和解决问题。</li>
|
||
</ul>
|
||
<h3 id="declarative-pipeline">Declarative Pipeline<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#declarative-pipeline" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Declarative Pipeline 是 Jenkins 中使用最广泛的 Pipeline 语法,旨在提供更简洁、易读的语法结构,适合大多数项目的自动化需求。</strong></p>
|
||
<p>Declarative Pipeline 的基本结构如下:</p>
|
||
<pre><code class="mermaid">graph LR
|
||
A[pipeline] --> B[agent any]
|
||
B --> C[environment]
|
||
C --> D[stages]
|
||
D --> E1[Stage Build]
|
||
E1 --> E2[Steps: Execute Build Tasks]
|
||
D --> F1[Stage Test]
|
||
F1 --> F2[Steps: Execute Test Tasks]
|
||
D --> G1[Stage Deploy]
|
||
G1 --> G2[Steps: Execute Deploy Tasks]
|
||
D --> H[post]
|
||
H --> I1[Always: Cleanup]
|
||
H --> I2[Success: Success Notification]
|
||
H --> I3[Failure: Failure Notification]
|
||
|
||
subgraph Declarative Pipeline Structure
|
||
B -.-> C -.-> D -.-> H
|
||
end
|
||
</code></pre>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent any</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make build'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make test'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make deploy'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> post {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> always {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Cleaning up...'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> deleteDir()</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<ul>
|
||
<li><strong>pipeline</strong>:定义 Pipeline 的顶级指令块,包含所有 Pipeline 相关的配置。</li>
|
||
<li><strong>agent</strong>:定义 Pipeline 运行的执行环境。<code>any</code> 表示可以在任何可用的 Agent 上执行。也可以指定特定的 Agent 或容器。</li>
|
||
<li><strong>stages</strong>:包含多个 <code>stage</code> 块,每个 <code>stage</code> 表示一个独立的构建阶段。</li>
|
||
<li><strong>steps</strong>:在 <code>stage</code> 内部定义具体的执行步骤。<code>sh</code> 是执行 Shell 命令的常用指令。</li>
|
||
<li><strong>post</strong>:定义在 Pipeline 结束后执行的步骤,如清理工作、通知、报告生成等。</li>
|
||
</ul>
|
||
<p>Declarative Pipeline 提供了丰富的条件控制(如 <code>when</code>、<code>input</code>)、并行执行(<code>parallel</code>)以及环境变量管理(<code>environment</code>),适合定义结构化和易维护的流水线。</p>
|
||
<h3 id="scripted-pipeline">Scripted Pipeline<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#scripted-pipeline" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Scripted Pipeline 提供了更大的灵活性和控制力,但其语法相对复杂,通常用于需要高度定制的场景。</strong></p>
|
||
<p>Scripted Pipeline 的基本结构如下:</p>
|
||
<pre><code class="mermaid">graph LR
|
||
A[node] --> B[try]
|
||
B --> C[stage Build]
|
||
C --> D[Steps: Execute Build Tasks]
|
||
B --> E[stage Test]
|
||
E --> F[Steps: Execute Test Tasks]
|
||
B --> G[stage Deploy]
|
||
G --> H[Steps: Execute Deploy Tasks]
|
||
B --> I[catch Exception]
|
||
I --> J[Steps: Handle Failure]
|
||
B --> K[finally]
|
||
K --> L[Steps: Cleanup]
|
||
|
||
subgraph Scripted Pipeline Structure
|
||
A -.-> B -.-> I -.-> K
|
||
end
|
||
</code></pre>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">node {</span></span>
|
||
<span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make build'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make test'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make deploy'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> currentBuild</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'FAILURE'</span></span>
|
||
<span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> throw</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">finally</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Cleaning up...'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> deleteDir()</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<ul>
|
||
<li><strong>node</strong>:表示一个执行节点。所有的 Pipeline 步骤都在 <code>node</code> 块中定义。</li>
|
||
<li><strong>stage</strong>:定义构建的不同阶段,与 Declarative Pipeline 类似。</li>
|
||
<li><strong>try-catch-finally</strong>:Scripted Pipeline 中可以使用标准的 Groovy 语法进行异常处理和流程控制。</li>
|
||
</ul>
|
||
<p>由于 Scripted Pipeline 基于 Groovy 语言,用户可以在其中编写复杂的逻辑、调用自定义函数和类,适合高级用户和特殊需求。</p>
|
||
<h3 id="stages-步骤">Stages 步骤<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#stages-步骤" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Stages</strong> 是 Jenkins Pipeline 中的核心构建块,每个 <code>stage</code> 代表了 Pipeline 执行过程中的一个主要步骤或阶段。Stages 可以用于划分构建、测试、部署等不同的任务,帮助组织和管理复杂的构建流程。</p>
|
||
<ul>
|
||
<li><strong>阶段划分</strong>:Stages 将整个 Pipeline 分割为多个独立的部分,每个部分都代表一个逻辑步骤,如编译代码、运行测试、部署应用等。</li>
|
||
<li><strong>并行执行</strong>:多个 Stages 可以在 <code>parallel</code> 指令下并行执行,减少总的执行时间。</li>
|
||
<li><strong>条件执行</strong>:Stages 可以基于条件(如环境变量、分支名称等)选择性地执行,提升 Pipeline 的灵活性。</li>
|
||
<li><strong>可视化</strong>:Jenkins 提供了直观的界面展示 Stages 的执行情况,便于监控和调试。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent any</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make build'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make test'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make deploy'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th><strong>命令关键字</strong></th><th><strong>描述</strong></th><th><strong>使用场景</strong></th></tr></thead><tbody><tr><td><strong><code>stage</code></strong></td><td>定义 Pipeline 的一个阶段,每个阶段包含特定的构建、测试或部署任务。</td><td>用于将 Pipeline 划分为多个逻辑阶段,如“构建”、“测试”、“部署”等,便于组织和管理复杂的流程。</td></tr><tr><td><strong><code>steps</code></strong></td><td>在 <code>stage</code> 中定义具体执行的步骤或操作。</td><td>用于在一个 <code>stage</code> 内执行一组具体的任务,如运行 Shell 命令、调用外部服务、存档文件等。</td></tr><tr><td><strong><code>parallel</code></strong></td><td>并行执行多个 <code>stage</code>,提高 Pipeline 的执行效率。</td><td>用于同时执行多个任务,如并行运行测试、构建不同的模块或部署到多个环境。</td></tr><tr><td><strong><code>when</code></strong></td><td>基于条件执行某个 <code>stage</code> 或步骤。</td><td>用于根据分支、环境变量、文件存在与否等条件控制某个阶段的执行,如仅在特定分支上运行部署阶段。</td></tr><tr><td><strong><code>agent</code></strong></td><td>指定在哪个 Jenkins 节点或容器中运行该 <code>stage</code>。</td><td>用于为特定阶段分配执行环境,特别是在需要不同的构建环境或资源时,如在特定的 Docker 容器中运行测试。</td></tr><tr><td><strong><code>post</code></strong></td><td>定义在 <code>stage</code> 完成后执行的操作。</td><td>用于在阶段完成后触发清理、通知、存档等操作,确保即使阶段失败也能执行必要的后续步骤。</td></tr><tr><td><strong><code>environment</code></strong></td><td>为特定 <code>stage</code> 定义环境变量。</td><td>用于为某个阶段设置临时的环境变量,如 API 密钥、构建标志等,确保变量仅在该阶段有效。</td></tr><tr><td><strong><code>input</code></strong></td><td>在 <code>stage</code> 开始前等待用户输入或确认。</td><td>用于在高风险操作(如生产环境部署)前暂停并等待人工确认,确保安全性。</td></tr><tr><td><strong><code>options</code></strong></td><td>为特定 <code>stage</code> 配置选项,如超时时间、重试次数等。</td><td>用于控制某个阶段的行为,例如设置超时时间防止阶段长时间挂起,或在阶段失败时自动重试。</td></tr><tr><td><strong><code>tools</code></strong></td><td>指定特定阶段使用的构建工具版本,如 Maven、Gradle。</td><td>用于确保某个阶段使用正确版本的构建工具,特别是在不同阶段需要不同工具版本时,如不同版本的 JDK 或 Maven。</td></tr><tr><td><strong><code>timeout</code></strong></td><td>为特定 <code>stage</code> 设置执行超时时间,超时后自动终止。</td><td>用于防止某个阶段长时间执行,特别是在长时间运行的任务中,确保流程的整体执行时间在可控范围内。</td></tr><tr><td><strong><code>retry</code></strong></td><td>在 <code>stage</code> 中步骤失败时重试指定次数。</td><td>用于处理偶发的临时性错误,例如网络请求失败、外部服务响应超时等,确保任务的健壮性。</td></tr><tr><td><strong><code>failFast</code></strong></td><td>在并行执行的 <code>stage</code> 中,一旦某个 <code>stage</code> 失败,立即终止其他并行 <code>stage</code>。</td><td>用于节省资源,当某个关键阶段失败时立即停止所有并行任务,避免不必要的资源消耗。</td></tr><tr><td><strong><code>input</code></strong></td><td>在 <code>stage</code> 开始前暂停执行,等待用户输入或确认。</td><td>用于在关键阶段(如生产部署)前需要人工确认时,确保操作的安全性。</td></tr><tr><td><strong><code>lock</code></strong></td><td>在执行 <code>stage</code> 时获取锁,确保该阶段的操作是独占的。</td><td>用于在多个 Pipeline 需要访问共享资源(如数据库、环境配置)时,避免并发冲突,确保资源安全地被独占访问。</td></tr><tr><td><strong><code>stages</code></strong></td><td>定义嵌套的多个 <code>stage</code>,用于创建分层的 Pipeline。</td><td>用于组织更复杂的流程,例如在一个大的 <code>stage</code> 内包含多个子 <code>stage</code>,以实现多层次的执行结构。</td></tr></tbody></table></div>
|
||
<h3 id="steps-步骤">Steps 步骤<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#steps-步骤" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Steps</strong> 是 Pipeline 中执行具体任务的最小单元,每个 <code>step</code> 代表一个独立的操作,如执行命令、调用工具、发送通知等。Steps 是构建自动化流程的基础,可以根据需求灵活组合和配置。</p>
|
||
<ul>
|
||
<li><strong>灵活组合</strong>:Steps 可以按需组合,构建出适合特定项目需求的执行流程。</li>
|
||
<li><strong>参数化执行</strong>:许多 Steps 支持传入参数,实现动态配置和执行。</li>
|
||
<li><strong>条件控制</strong>:Steps 可以与条件语句结合,实现复杂的逻辑控制,如在特定情况下跳过某些步骤。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'npm install'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'npm test'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> archiveArtifacts </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">artifacts</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'**/target/*.jar'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">fingerprint</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th><strong>命令关键字</strong></th><th><strong>描述</strong></th><th><strong>使用场景</strong></th></tr></thead><tbody><tr><td><strong><code>sh</code></strong></td><td>在 Unix/Linux 系统上执行 Shell 命令。</td><td>用于执行 Shell 脚本、命令行操作,如编译代码、运行测试、部署应用等。</td></tr><tr><td><strong><code>bat</code></strong></td><td>在 Windows 系统上执行批处理命令。</td><td>适用于在 Windows 环境下执行构建、测试、部署任务。</td></tr><tr><td><strong><code>checkout</code></strong></td><td>从版本控制系统(如 Git、SVN)检出代码。</td><td>用于在 Pipeline 中拉取最新代码,以确保构建和测试基于最新的源码。</td></tr><tr><td><strong><code>echo</code></strong></td><td>在控制台输出消息。</td><td>用于在 Pipeline 中输出调试信息、状态消息或变量值,便于跟踪和分析执行过程。</td></tr><tr><td><strong><code>sleep</code></strong></td><td>暂停 Pipeline 执行指定时间。</td><td>用于在步骤之间插入延迟,例如等待外部服务响应、控制构建节奏等。</td></tr><tr><td><strong><code>dir</code></strong></td><td>切换到指定的工作目录,并在该目录中执行后续步骤。</td><td>用于在特定目录下执行构建任务,如切换到项目目录进行编译、测试等操作。</td></tr><tr><td><strong><code>withEnv</code></strong></td><td>设置环境变量,并在定义的步骤范围内使用。</td><td>用于临时改变环境变量,例如配置 PATH、设置 API 密钥等,确保这些变量仅在特定步骤中生效。</td></tr><tr><td><strong><code>archiveArtifacts</code></strong></td><td>存档构建生成的工件(如 JAR 文件、日志、报告等)。</td><td>用于将构建生成的文件存档,便于后续使用、分发或备份。</td></tr><tr><td><strong><code>junit</code></strong></td><td>解析 JUnit 测试结果并生成测试报告。</td><td>用于在 Jenkins 中展示单元测试结果,并生成测试趋势分析。</td></tr><tr><td><strong><code>mail</code></strong></td><td>发送电子邮件通知。</td><td>用于在 Pipeline 执行过程中发送通知,例如在构建失败时通知开发团队。</td></tr><tr><td><strong><code>input</code></strong></td><td>暂停 Pipeline 执行,等待用户输入或确认。</td><td>用于在关键步骤(如生产环境部署前)等待人工确认,确保操作安全。</td></tr><tr><td><strong><code>timeout</code></strong></td><td>为步骤或阶段设置超时时间,超时后自动终止。</td><td>用于限制步骤或阶段的最长执行时间,防止长时间挂起的任务阻塞 Pipeline。</td></tr><tr><td><strong><code>retry</code></strong></td><td>在失败时重试指定次数。</td><td>用于处理可能出现暂时性错误的操作,例如网络请求失败、依赖下载失败等。</td></tr><tr><td><strong><code>parallel</code></strong></td><td>并行执行多个步骤或阶段。</td><td>用于提高 Pipeline 执行效率,特别是在多任务并行的场景下,如同时在多个环境中运行测试。</td></tr><tr><td><strong><code>build</code></strong></td><td>在 Pipeline 中触发其他 Jenkins Job。</td><td>用于在一个 Pipeline 中调用其他 Job,例如在构建完成后触发部署 Job 或运行测试 Job。</td></tr><tr><td><strong><code>tool</code></strong></td><td>在 Pipeline 中指定构建工具(如 Maven、Gradle)。</td><td>用于配置和使用特定版本的构建工具,确保环境的一致性。</td></tr><tr><td><strong><code>withCredentials</code></strong></td><td>在 Pipeline 中使用存储的凭证进行操作。</td><td>用于在需要认证的操作中安全地使用敏感信息,如推送代码到 Git 仓库、访问 API、登录服务器等。</td></tr><tr><td><strong><code>script</code></strong></td><td>在 Declarative Pipeline 中执行 Groovy 脚本。</td><td>用于实现复杂的逻辑控制,或调用自定义的 Groovy 函数。</td></tr><tr><td><strong><code>stash</code></strong></td><td>保存文件以供后续使用。</td><td>用于在不同的节点或步骤之间共享文件。</td></tr><tr><td><strong><code>unstash</code></strong></td><td>恢复之前保存的文件。</td><td>用于在需要共享的步骤中使用之前保存的文件。</td></tr><tr><td><strong><code>catchError</code></strong></td><td>捕获错误并继续执行 Pipeline,防止因非致命错误导致整个 Pipeline 中断。</td><td>用于在 Pipeline 执行过程中捕获并处理可能的错误,确保即使出现错误也能继续执行其他步骤。</td></tr><tr><td><strong><code>timestamps</code></strong></td><td>为 Pipeline 控制台输出添加时间戳。</td><td>用于记录每个步骤的精确执行时间,便于调试和性能分析。</td></tr><tr><td><strong><code>cleanWs</code></strong></td><td>清理工作区,删除构建过程中生成的临时文件和目录。</td><td>用于在 Pipeline 结束后清理 Jenkins 工作区,释放磁盘空间,确保环境整洁。</td></tr><tr><td><strong><code>ws</code></strong></td><td>在特定的工作空间目录中运行步骤。</td><td>用于在指定的工作区中执行步骤,特别是在多个 Pipeline 共享同一个节点时,避免工作区冲突。</td></tr></tbody></table></div>
|
||
<h3 id="post-actions-步骤">Post Actions 步骤<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#post-actions-步骤" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Post Actions</strong> 是在 Pipeline 执行完毕后触发的操作,用于处理构建结果、清理资源、发送通知等。<code>post</code> 块根据构建的不同结果(如 <code>success</code>、<code>failure</code>、<code>always</code>)执行相应的操作,确保在任何情况下都能正确处理构建流程的结束阶段。</p>
|
||
<ul>
|
||
<li><strong>结果驱动</strong>:Post Actions 根据构建结果自动触发相应的动作,确保在成功时发布、在失败时报警。</li>
|
||
<li><strong>资源清理</strong>:Post Actions 可以用于释放资源、清理临时文件、关闭连接等,避免资源泄漏或积累。</li>
|
||
<li><strong>通知机制</strong>:Post Actions 支持集成通知系统(如邮件、Slack),在构建完成后通知相关人员或系统。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">post {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> success {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build succeeded!'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mail </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">to</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'team@example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span data-line><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> subject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Build #${env.BUILD_NUMBER} succeeded"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span data-line><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> body</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Great news! The build succeeded."</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> failure {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build failed!'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mail </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">to</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'team@example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span data-line><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> subject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Build #${env.BUILD_NUMBER} failed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span data-line><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> body</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Unfortunately, the build failed. Please check the logs."</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> always {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cleanWs() </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 清理工作区</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h2 id="pipeline-实现动态参数化构建">Pipeline 实现动态参数化构建<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#pipeline-实现动态参数化构建" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>参数化 Pipeline 是 Jenkins 提供的一种灵活机制,允许在执行构建时动态传入参数,以实现更为灵活的构建流程。Jenkins 支持多种类型的参数,如字符串、布尔值、选择列表、密码等。这种动态化的构建方式特别适用于多分支开发或多环境部署的场景。</p>
|
||
<h3 id="使用参数">使用参数<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#使用参数" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>在 Jenkinsfile 中,可以通过 <code>parameters</code> 块定义各种类型的参数。这些参数可以在构建时由用户输入,或者采用默认值。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> parameters {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> string(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'BRANCH'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">defaultValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'master'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'分支名称'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> booleanParam(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'DEPLOY'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">defaultValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'是否部署'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Building branch: ${params.BRANCH}"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>在 Pipeline 中,可以通过 <code>params</code> 对象访问传入的参数值。这些参数值可以用于控制构建流程中的各种逻辑,如条件判断、分支选择等。</p>
|
||
<p>参数化 Pipeline 的主要优势在于其灵活性,能够适应不同环境需求或用户输入。这种方式特别适合多分支开发或针对不同部署环境的需求,使构建流程更加智能和可控。</p>
|
||
<h3 id="条件语句">条件语句<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#条件语句" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>条件语句用于根据不同的输入参数或环境变量,决定构建的执行路径。通过 <code>when</code> 指令,可以在 Declarative Pipeline 中实现条件执行,从而根据特定条件执行相应的构建步骤。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> when {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> branch </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'master'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploying to production...'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h3 id="循环结构">循环结构<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#循环结构" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>循环结构在处理重复性任务时非常有用,例如遍历文件列表或批量执行测试。在 Jenkins Pipeline 中,可以通过 <code>for</code> 循环实现这一功能,从而简化处理多个相似任务的代码复杂度。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Batch Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> script {</span></span>
|
||
<span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"><</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Running test ${i}"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h3 id="并行执行">并行执行<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#并行执行" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>并行执行是 Jenkins Pipeline 的一大优势,允许多个步骤或阶段同时运行,从而加快构建过程。这一功能特别适用于并行测试和多平台构建,能够显著缩短总的构建时间。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Parallel Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> parallel {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Unit Tests'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Running unit tests...'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Integration Tests'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Running integration tests...'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>通过并行执行,构建流程可以充分利用 Jenkins 的多核处理能力,提高整体效率,尤其是在大规模项目中,这种方式能够极大地提升构建速度并优化资源利用率。</p>
|
||
<h2 id="groovy-语法">Groovy 语法<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#groovy-语法" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>Jenkinsfile 采用 <strong>Groovy</strong> 作为脚本语言,其丰富的语法特性使 Jenkins Pipeline 具备高度的灵活性和表达能力。深入掌握 Groovy 语法在 Jenkinsfile 中的应用,是编写高效且复杂的 Pipeline 的基础。以下是 Groovy 语法在 Jenkinsfile 中的关键应用场景:</p>
|
||
<h3 id="变量和常量的定义">变量和常量的定义<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#变量和常量的定义" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>在 Jenkinsfile 中,可以使用变量和常量来存储数据和配置项。变量使用 <code>def</code> 关键字定义,而常量则通过 <code>final</code> 关键字来定义,使其在代码执行过程中不可更改。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> myVar </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'value'</span></span>
|
||
<span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">final</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> String</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> CONSTANT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'constantValue'</span></span></code></pre></figure>
|
||
<h3 id="条件语句的使用">条件语句的使用<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#条件语句的使用" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>条件语句是控制流程的核心。通过 <code>if-else</code> 语句,可以根据不同的条件在 Pipeline 中执行不同的构建步骤。例如,可以根据分支名称来决定是否执行生产环境的部署。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (env</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">BRANCH_NAME</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'master'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 执行生产环境的部署</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span data-line><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 执行测试环境的部署</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h3 id="循环结构的实现">循环结构的实现<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#循环结构的实现" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Groovy 支持多种循环结构,如 <code>for</code>、<code>while</code> 和 <code>each</code>,在 Jenkinsfile 中可以用于自动化重复任务。循环的使用能够大大简化处理多个相似任务的代码复杂度。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"><</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Iteration ${i}"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h3 id="函数和闭包的封装">函数和闭包的封装<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#函数和闭包的封装" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>函数和闭包是 Groovy 的强大特性之一。它们允许将重复或复杂的逻辑封装成模块化的代码段,从而提升代码的复用性和可维护性。在 Jenkinsfile 中,这种封装对于结构化和清晰的 Pipeline 编写尤为重要。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> greet</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello, ${name}!"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">greet(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Jenkins'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></figure>
|
||
<h3 id="异常处理机制">异常处理机制<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#异常处理机制" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>为了保证 Pipeline 的健壮性,Groovy 提供了 <code>try-catch-finally</code> 结构来捕获和处理运行时可能发生的异常。通过异常处理机制,可以确保即使在错误发生时,Pipeline 也能进行适当的处理和资源清理,避免出现不可预料的问题。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span data-line><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 可能抛出异常的代码</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Caught exception: ${e.message}"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">finally</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Cleanup actions"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h2 id="使用-credentials-plugin-进行安全管理">使用 Credentials Plugin 进行安全管理<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#使用-credentials-plugin-进行安全管理" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>**Credentials Plugin 是 Jenkins 用于安全存储和管理敏感信息(如密码、密钥、Token 等)的关键插件。**它确保在 Pipeline 中使用的凭证不会以明文形式暴露,保护敏感数据的安全性。</p>
|
||
<h3 id="存储方式">存储方式<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#存储方式" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<ul>
|
||
<li><strong>Global credentials</strong>:可在 Jenkins 的全局范围内使用的凭证。</li>
|
||
<li><strong>Domain-specific credentials</strong>:与特定域(如 Git 仓库、Docker 注册表)关联的凭证,只能在特定域中使用。</li>
|
||
</ul>
|
||
<h3 id="使用方式">使用方式<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#使用方式" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>在 Jenkins 管理界面中,管理员可以添加多种类型的凭证(如用户名密码、SSH 密钥、Secret Text 等)。在 Pipeline 中,可以通过 <code>withCredentials</code> 指令调用并使用这些凭证。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Checkout'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> withCredentials([usernamePassword(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">credentialsId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'my-git-credentials'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">usernameVariable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'USER'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">passwordVariable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'PASS'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)]) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'git clone https://${USER}:${PASS}@github.com/my-repo.git'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>为了确保凭证的安全性,在 Pipeline 中使用凭证时应避免以下情况:</p>
|
||
<ul>
|
||
<li><strong>避免直接输出凭证</strong>:确保凭证不会出现在日志或控制台输出中。</li>
|
||
<li><strong>使用安全的上下文</strong>:通过 <code>withCredentials</code> 封闭使用凭证的代码段,避免凭证泄露。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> withCredentials([string(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">credentialsId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'SECRET_KEY'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">variable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'SECRET'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)]) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'deploy --key $SECRET'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>Jenkins 支持与多种第三方工具集成,通过 Credentials Plugin 进行凭证管理,如:</p>
|
||
<ul>
|
||
<li><strong>GitHub</strong>:使用 Personal Access Token 进行安全拉取和提交代码。</li>
|
||
<li><strong>Docker</strong>:使用 Docker 凭证登录 Docker Registry,执行镜像推送和拉取。</li>
|
||
<li><strong>AWS</strong>:集成 AWS IAM 凭证,进行云端资源管理和部署。</li>
|
||
</ul>
|
||
<p>通过与第三方工具的凭证集成,Jenkins 可以安全地执行各种自动化任务,避免敏感信息泄露。</p>
|
||
<h3 id="注意事项">注意事项<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#注意事项" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>在与第三方工具集成时,Jenkins 使用 Credentials Plugin 进行凭证管理,如 GitHub、Docker、AWS 等工具。这一功能极大地提升了自动化任务的安全性和效率,但在使用凭证管理时需注意以下安全事项:</p>
|
||
<ul>
|
||
<li><strong>最小权限原则</strong>:为 Jenkins 配置凭证时,应仅授予执行任务所需的最低权限,以减少敏感资源的暴露风险。</li>
|
||
<li><strong>定期更新凭证</strong>:定期轮换 API Key、SSH 密钥等凭证,以降低凭证泄露的风险,并确保安全性。</li>
|
||
<li><strong>加密存储</strong>:确保 Jenkins 运行在受信任的环境中,并将凭证存储在加密的文件系统上,以防止未经授权的访问。</li>
|
||
<li><strong>启用审计日志</strong>:开启 Jenkins 的安全审计日志功能,记录凭证的使用情况,有助于及时检测和应对异常行为。</li>
|
||
</ul>
|
||
<p>这些措施有助于保护敏感信息,确保与第三方工具的集成安全可靠。</p>
|
||
<h2 id="基本的-ci-流程">基本的 CI 流程<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#基本的-ci-流程" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<h3 id="使用-pipeline-实现持续集成流程">使用 Pipeline 实现持续集成流程<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#使用-pipeline-实现持续集成流程" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>持续集成(CI)是现代软件开发中不可或缺的实践,旨在通过频繁的代码集成和自动化测试,快速发现和修复问题。Jenkins Pipeline 是实现持续集成的理想工具。</p>
|
||
<p>典型的 CI 流程包括以下步骤:</p>
|
||
<pre><code class="mermaid">graph TD
|
||
A[代码提交] -->|开发者提交到版本控制系统| B[自动触发]
|
||
B -->|通过 Webhook 或 SCM 轮询| C[拉取代码]
|
||
C -->|从版本控制系统拉取最新代码| D[编译和测试]
|
||
D -->|执行编译和单元测试| E[生成构建报告]
|
||
E -->|生成测试报告和代码覆盖率报告,并发布构建结果| F[构建完成]
|
||
</code></pre>
|
||
<ol>
|
||
<li><strong>代码提交</strong>:开发者将代码提交到版本控制系统(如 Git)。</li>
|
||
<li><strong>自动触发</strong>:通过 Webhook 或 SCM 轮询,Jenkins 自动触发构建。</li>
|
||
<li><strong>拉取代码</strong>:Jenkins 从版本控制系统中拉取最新代码。</li>
|
||
<li><strong>编译和测试</strong>:Jenkins 执行编译和单元测试,确保代码质量。</li>
|
||
<li><strong>生成构建报告</strong>:Jenkins 生成测试报告和代码覆盖率报告,并发布构建结果。</li>
|
||
</ol>
|
||
<p>通过持续集成流程,开发团队可以快速响应代码变更,确保代码库的稳定性。</p>
|
||
<h3 id="集成单元测试">集成单元测试<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#集成单元测试" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>单元测试是 CI 流程中的重要组成部分,Jenkins 提供了与多种测试框架的无缝集成。集成单元测试后,Jenkins 会在构建页面展示测试结果,包括测试通过率、失败的测试用例等信息,帮助开发者快速定位问题。</p>
|
||
<h4 id="junit">JUnit<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#junit" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>Jenkins 支持 JUnit 测试框架,用户可以通过 <code>junit</code> 指令自动解析和展示测试结果。在 Pipeline 中,可以这样集成 JUnit 测试:</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mvn test'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> junit </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'**/target/surefire-reports/*.xml'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h4 id="testing">Testing<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#testing" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>Testing 是另一种流行的 Java 测试框架,与 JUnit 类似,用户可以通过 <code>publishTestNGResult</code> 插件解析 Testing 生成的 XML 测试报告。</p>
|
||
<h3 id="构建失败后的错误处理与通知配置">构建失败后的错误处理与通知配置<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#构建失败后的错误处理与通知配置" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>在 CI 流程中,构建失败是不可避免的。Jenkins 提供了多种机制帮助开发者及时处理构建失败。</p>
|
||
<h4 id="错误处理">错误处理<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#错误处理" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>在 Pipeline 中,用户可以使用 <code>try-catch</code> 块捕获构建中的异常,并执行相应的处理逻辑。例如,可以在构建失败后自动回滚到上一个稳定版本,或触发其他修复任务。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'make deploy'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> currentBuild</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'FAILURE'</span></span>
|
||
<span data-line><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 处理失败逻辑</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Deployment failed: ${e.message}"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h4 id="通知配置">通知配置<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#通知配置" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>Jenkins 支持通过多种方式通知构建结果,如电子邮件、Slack、Webhooks 等。在 Pipeline 中,可以通过 <code>mail</code> 指令发送通知:</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">post {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> failure {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> mail </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">to</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'team@example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span data-line><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> subject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Build failed: ${env.JOB_NAME}"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
|
||
<span data-line><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> body</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Build ${env.BUILD_NUMBER} failed. Please check the Jenkins logs."</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h3 id="生成和发布构建报告">生成和发布构建报告<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#生成和发布构建报告" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>构建报告是 Jenkins CI 流程的重要输出,帮助团队了解构建状态、测试结果和代码质量。</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>测试报告</strong>:Jenkins 可以自动生成和展示测试报告,如 JUnit、Testing 生成的测试结果。在 Pipeline 中,用户可以通过 <code>junit</code>、<code>publishTestNGResult</code> 等插件自动解析测试报告,并在构建页面展示详细的测试结果。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>代码覆盖率报告</strong>:通过集成代码覆盖率工具(如 JaCoCo、Cobertura),Jenkins 可以生成代码覆盖率报告,帮助团队了解测试覆盖情况。代码覆盖率报告可以与测试报告一起展示,提供全面的代码质量分析。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>构建工件存档</strong>:在构建完成后,Jenkins 可以自动存档构建生成的工件(如 JAR、WAR 文件),供后续发布或部署使用。通过 <code>archiveArtifacts</code> 指令,用户可以指定需要存档的文件或目录:</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Package'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mvn package'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> archiveArtifacts </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">artifacts</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'**/target/*.jar'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">fingerprint</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
</li>
|
||
</ul>
|
||
<p>生成和发布构建报告,确保了构建过程的透明性和可追溯性,帮助团队持续改进代码质量和构建流程。</p>
|
||
<h2 id="多分支管道和并行作业">多分支管道和并行作业<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#多分支管道和并行作业" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>多分支 Pipeline 是 Jenkins 支持多分支开发模式的重要功能,能够自动检测并为每个代码分支创建单独的 Pipeline Job。</p>
|
||
<pre><code class="mermaid">graph TD
|
||
A[创建 Multibranch Pipeline] --> B[配置源码管理]
|
||
B --> C[分支策略]
|
||
C --> D[Jenkinsfile 位置]
|
||
</code></pre>
|
||
<ol>
|
||
<li><strong>创建 Multibranch Pipeline</strong>:在 Jenkins 中创建一个新的 Multibranch Pipeline 项目。</li>
|
||
<li><strong>配置源码管理</strong>:指定 Git 或其他版本控制系统的仓库地址,Jenkins 会自动扫描该仓库的所有分支。</li>
|
||
<li><strong>分支策略</strong>:配置分支发现策略,如只构建特定分支或忽略某些分支。</li>
|
||
<li><strong>Jenkinsfile 位置</strong>:确保每个分支的根目录下有一个 Jenkinsfile,Jenkins 将根据该文件定义 Pipeline。</li>
|
||
</ol>
|
||
<p>多分支 Pipeline 的优势在于它自动适应 Git Flow 等多分支开发策略,每个分支可以独立运行自己的 CI/CD 流水线,极大提高了开发效率。</p>
|
||
<h3 id="jenkins-对-git-分支的支持与自动化构建">Jenkins 对 Git 分支的支持与自动化构建<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-对-git-分支的支持与自动化构建" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 对 Git 的支持通过 Git 插件实现,能够自动化处理代码的拉取、构建和测试。对于多分支项目,Jenkins 可以在以下场景下自动触发构建:</p>
|
||
<ul>
|
||
<li><strong>新分支创建</strong>:当新分支推送到远程仓库时,Jenkins 自动检测并触发构建。</li>
|
||
<li><strong>分支变更</strong>:当现有分支发生变更(如代码提交、Merge),Jenkins 自动拉取最新代码并重新构建。</li>
|
||
</ul>
|
||
<p>通过 Webhook 与 Jenkins 集成,Git 仓库可以在代码变更时实时通知 Jenkins,进一步优化构建响应时间。</p>
|
||
<h3 id="并行作业的配置与优化">并行作业的配置与优化<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#并行作业的配置与优化" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>并行作业是在 Jenkins 中提升构建效率的关键技术,适合在 CI 流水线中并行执行不同的任务,如测试、代码分析、部署等。</p>
|
||
<ul>
|
||
<li><strong>并行阶段</strong>:在 Pipeline 中使用 <code>parallel</code> 指令定义并行阶段。</li>
|
||
<li><strong>资源管理</strong>:合理配置并行作业的资源分配,避免超载导致的系统性能下降。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> parallel {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Unit Tests'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'run-unit-tests.sh'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Integration Tests'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'run-integration-tests.sh'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>并行作业配置完成后,Jenkins 会自动分配可用的 Agent 节点执行任务,极大缩短构建时间。</p>
|
||
<h3 id="实现高效的并行测试和部署">实现高效的并行测试和部署<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#实现高效的并行测试和部署" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>通过并行执行,Jenkins 可以同时运行多组测试或部署任务,最大化资源利用率。具体优化策略包括:</p>
|
||
<ul>
|
||
<li><strong>细粒度分割测试</strong>:将测试任务细分为多个小单元,分别在不同的 Agent 上并行执行。</li>
|
||
<li><strong>自动化环境准备</strong>:通过并行配置自动化准备不同测试环境,减少环境切换时间。</li>
|
||
<li><strong>并行部署到多环境</strong>:对于微服务架构的应用,Jenkins 可以并行部署到多个环境,如开发、测试和生产环境。</li>
|
||
</ul>
|
||
<p>这些优化策略有助于显著提升 Jenkins Pipeline 的执行效率和系统性能。</p>
|
||
<h2 id="集成第三方服务">集成第三方服务<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#集成第三方服务" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<h3 id="github">GitHub<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#github" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 可以通过 Webhook 与 GitHub 集成,实现自动化的 CI/CD 流程。常见的集成方式包括:</p>
|
||
<ul>
|
||
<li><strong>Webhook</strong>:GitHub 中配置 Webhook,当代码仓库发生事件(如代码提交、Pull Request 创建)时,通知 Jenkins 自动触发相应的构建。</li>
|
||
<li><strong>Pull Request 触发</strong>:使用 GitHub Pull Request Builder 插件,当有新的 Pull Request 创建或更新时,Jenkins 自动拉取分支代码并触发 CI 流水线。</li>
|
||
</ul>
|
||
<p>通过这种集成,Jenkins 能够在代码变更时快速响应,并在 Pull Request 合并前执行必要的测试和代码质量检查。</p>
|
||
<h3 id="docker">Docker<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#docker" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 可以与 Docker 深度集成,充分利用容器化技术提高 CI/CD 流程的灵活性和可移植性。</p>
|
||
<h4 id="构建-docker-镜像">构建 Docker 镜像<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#构建-docker-镜像" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>通过 Docker Pipeline 插件,Jenkins 可以在流水线中自动构建、标记和推送 Docker 镜像。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> docker { image </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'maven:3.6.3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mvn clean package'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build Docker Image'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> script {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> docker</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">build(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'myapp:latest'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">push(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'myrepo/myapp:latest'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h4 id="使用-docker-容器执行构建">使用 Docker 容器执行构建<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#使用-docker-容器执行构建" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>Jenkins 可以通过 Docker Agent 在容器中执行构建任务,确保构建环境的一致性,并隔离不同构建任务的依赖。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> docker { image </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'node:14-alpine'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Test'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'npm install'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'npm test'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>这种方法可以确保每次构建都在全新的、可控的环境中运行,减少因环境差异导致的构建失败。</p>
|
||
<h3 id="kubernetes">Kubernetes<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#kubernetes" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 与 Kubernetes 的集成使得 CI/CD 流水线可以轻松部署到云原生环境中,特别是在微服务架构下,Kubernetes 的动态调度和扩展能力与 Jenkins 的自动化能力结合,显著提升了软件交付效率。</p>
|
||
<h4 id="jenkins-x">Jenkins X<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-x" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p><strong>Jenkins X</strong> 是一个专为 Kubernetes 设计的 CI/CD 解决方案,简化了 Kubernetes 环境下的应用部署和管理。它基于 Jenkins,但提供了更高层次的抽象和开箱即用的 DevOps 工具链。</p>
|
||
<h4 id="自动化部署到-kubernetes">自动化部署到 Kubernetes<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#自动化部署到-kubernetes" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>通过 Kubernetes 插件,Jenkins 可以直接与 Kubernetes API 交互,实现应用的自动化部署和管理。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent any</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy to Kubernetes'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> script {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> kubernetesDeploy </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">configs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'k8s-deployment.yml'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">kubeconfigId</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'kube-config'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<ul>
|
||
<li><strong>Helm</strong>:Jenkins 还可以集成 Helm,通过 Helm Chart 管理 Kubernetes 应用的发布流程,进一步简化复杂应用的部署。</li>
|
||
</ul>
|
||
<h3 id="其他服务集成">其他服务集成<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#其他服务集成" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 支持集成各种第三方服务,通过插件扩展其功能,如 Slack、JIRA 等。</p>
|
||
<h4 id="slack-通知">Slack 通知<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#slack-通知" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>通过 Slack 插件,Jenkins 可以在构建状态发生变化时自动发送通知到指定的 Slack 频道,及时通知开发团队。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> post {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> success {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> slackSend(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">channel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'#builds'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">message</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Build #${env.BUILD_NUMBER} succeeded"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> failure {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> slackSend(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">channel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'#builds'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">message</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Build #${env.BUILD_NUMBER} failed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h4 id="jira-工单自动化">JIRA 工单自动化<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jira-工单自动化" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>Jenkins 可以通过 JIRA 插件与 JIRA 项目管理工具集成,实现工单的自动创建、更新或关闭,配合 DevOps 流程。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> jiraNewIssue </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">site</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'JIRA_SITE'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">issue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">projectKey</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'PROJ'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">summary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build failed'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build #${env.BUILD_NUMBER} failed'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h2 id="持续交付cd流程">持续交付(CD)流程<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#持续交付cd流程" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<h3 id="持续交付与持续部署的区别">持续交付与持续部署的区别<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#持续交付与持续部署的区别" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>**持续交付(Continuous Delivery, CD)<strong>和</strong>持续部署(Continuous Deployment)**是现代 DevOps 实践中常见的自动化软件发布策略,虽然二者名称相似,但在实际实施中存在关键区别:</p>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th></th><th><strong>持续交付(Continuous Delivery, CD)</strong></th><th><strong>持续部署(Continuous Deployment)</strong></th></tr></thead><tbody><tr><td><strong>定义</strong></td><td>软件开发实践,确保代码在通过所有自动化测试后随时可以部署到生产环境。</td><td>持续交付的进一步扩展,自动化流程不仅确保代码可以随时部署,还会在测试通过后立即部署到生产环境。</td></tr><tr><td><strong>部署触发方式</strong></td><td><strong>通常由人工操作触发,需通过手动审批或按需执行部署。</strong></td><td><strong>完全自动化,无需人工干预,测试通过后立即部署到生产环境。</strong></td></tr><tr><td><strong>自动化程度</strong></td><td>自动化测试覆盖,但部署步骤通常需要人工触发。</td><td>全面自动化,包括自动化测试和部署到生产环境。</td></tr><tr><td><strong>人工干预</strong></td><td>需要人工干预进行最终的部署决策。</td><td>无需人工干预,代码一旦通过测试,就会直接部署。</td></tr><tr><td><strong>适用场景</strong></td><td>适用于业务敏感度较高的项目,部署时间点需根据业务需求决定。</td><td>适用于频繁发布、变化快的产品,如 SaaS 应用。</td></tr><tr><td><strong>风险管理</strong></td><td>部署前有人工审核步骤,较容易控制风险。</td><td>需要非常严格的自动化测试和监控机制,因每次提交都会直接影响生产环境。</td></tr><tr><td><strong>典型使用者</strong></td><td>传统企业软件、金融系统等对生产环境变更非常敏感的项目。</td><td>快速迭代的互联网产品、SaaS 平台等。</td></tr><tr><td><strong>发布频率</strong></td><td>根据业务需求决定,可在经过人工审批后择机发布。</td><td>发布频率高,通常在每次代码提交后,立即发布到生产环境。</td></tr><tr><td><strong>稳定性要求</strong></td><td>高度关注生产环境的稳定性,部署前可能进行额外的手动验证。</td><td>依赖自动化测试和监控,生产环境的稳定性直接依赖于自动化机制的可靠性。</td></tr></tbody></table></div>
|
||
<p>在实践中,持续交付适用于业务敏感度较高的项目,而持续部署则适用于频繁发布、变化快的产品,如 SaaS 应用。</p>
|
||
<h3 id="实现自动化部署的最佳实践">实现自动化部署的最佳实践<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#实现自动化部署的最佳实践" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>自动化部署是持续交付的核心环节,确保代码能快速、安全地发布到生产环境。以下是实现自动化部署的最佳实践:</p>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th><strong>最佳实践</strong></th><th><strong>描述</strong></th><th><strong>工具或技术</strong></th></tr></thead><tbody><tr><td><strong>基础设施即代码(IaC)</strong></td><td>将基础设施配置代码化,确保部署环境的一致性和可重复性。</td><td>Terraform、Ansible、CloudFormation</td></tr><tr><td><strong>环境标准化</strong></td><td>使用容器化和虚拟化技术,确保开发、测试、生产环境一致,减少因环境差异导致的部署失败。</td><td>Docker、Kubernetes、Vagrant</td></tr><tr><td><strong>无停机部署</strong></td><td>设计无停机的部署流程,避免服务中断,保持旧版本在新版本部署期间可用。</td><td>蓝绿部署、金丝雀发布、滚动更新</td></tr><tr><td><strong>自动化回滚</strong></td><td>部署过程中设计回滚机制,快速恢复到上一个稳定版本,确保业务连续性。</td><td>Jenkins、Spinnaker、ArgoCD</td></tr><tr><td><strong>安全集成</strong></td><td>在部署管道中集成安全扫描,确保在每次部署前检测并修复安全漏洞和配置问题。</td><td>Snyk、OWASP ZAP、Aqua Security</td></tr><tr><td><strong>监控与日志</strong></td><td>部署完成后自动更新监控和日志配置,实时监控和分析新版本的健康状况。</td><td>Prometheus、Grafana、ELK Stack(Elasticsearch, Logstash, Kibana)</td></tr></tbody></table></div>
|
||
<h3 id="蓝绿部署金丝雀发布等策略的实现">蓝绿部署、金丝雀发布等策略的实现<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#蓝绿部署金丝雀发布等策略的实现" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>蓝绿部署和金丝雀发布是两种常用的无停机部署策略,适用于在不断变化的生产环境中安全地发布新版本。</p>
|
||
<ul>
|
||
<li><strong>蓝绿部署</strong>:蓝绿部署通过维护两套几乎相同的生产环境来实现无停机发布。当前版本在 <code>蓝色</code> 环境中运行,新版本在 <code>绿色</code> 环境中部署并验证,一旦验证通过,将流量切换到 <code>绿色</code> 环境。这样,即使新版本出现问题,也能快速切回“蓝色”环境。
|
||
<ul>
|
||
<li><strong>实现方式</strong>:可以使用 DNS 切换、负载均衡器调整等手段实现流量的切换。</li>
|
||
</ul>
|
||
</li>
|
||
<li><strong>金丝雀发布</strong>:金丝雀发布是逐步将新版本部署给部分用户(通常是生产环境的一小部分流量),然后逐步增加新版本的用户比例。通过这种方式,可以在生产环境中观察新版本的表现,发现问题可以及时调整或回滚。
|
||
<ul>
|
||
<li><strong>实现方式</strong>:可以使用负载均衡器或特定的路由策略(如 Istio)逐步引入新版本流量。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>通过 Jenkins 的 Pipeline 和 Kubernetes 的滚动更新策略,可以自动化实现上述部署策略。</p>
|
||
<h3 id="部署管道的监控与回滚机制">部署管道的监控与回滚机制<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#部署管道的监控与回滚机制" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>部署管道不仅要确保软件顺利发布,还要能够监控发布后的状态,并在必要时快速回滚。有效的监控与回滚机制包括:</p>
|
||
<ul>
|
||
<li><strong>实时监控</strong>:部署管道应集成应用性能监控工具(如 Prometheus、Grafana)和日志管理工具(如 ELK Stack),实时监控新版本的关键指标,如响应时间、错误率、资源消耗等。</li>
|
||
<li><strong>健康检查</strong>:在部署结束后,自动触发健康检查脚本,验证应用的核心功能和服务状态。如果检测到异常,自动触发警报或启动回滚流程。</li>
|
||
<li><strong>自动化回滚</strong>:在 Pipeline 中设计自动化回滚逻辑,一旦监控检测到严重问题,系统可以自动回滚到上一个稳定版本。例如,利用 Kubernetes 的回滚机制或通过 Jenkins 的 <code>rollback</code> 步骤触发回滚操作。</li>
|
||
<li><strong>部署日志与审计</strong>:保持详细的部署日志和审计记录,确保所有部署操作都可追踪。这样在出现问题时,可以快速定位根本原因,并采取修复措施。</li>
|
||
</ul>
|
||
<h2 id="使用共享库提高管道重用性">使用共享库提高管道重用性<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#使用共享库提高管道重用性" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p><strong>共享库(Shared Library)</strong> 是 Jenkins 中的一种机制,允许用户将常用的 Pipeline 代码封装在一个集中管理的库中,供多个 Jenkins Pipeline 复用。共享库通过将通用的构建、测试、部署逻辑抽象出来,使得各项目的 Pipeline 定义更加简洁,并易于维护和更新。</p>
|
||
<ul>
|
||
<li><strong>代码复用</strong>:将常用的 Pipeline 步骤、工具集成、通知机制等抽象为共享库函数,减少重复代码。</li>
|
||
<li><strong>标准化</strong>:通过共享库,定义企业级的标准化流水线组件,确保所有项目遵循统一的流程和最佳实践。</li>
|
||
<li><strong>快速迭代</strong>:当某个流程需要更新时,只需更新共享库即可同时影响所有使用该库的 Pipeline,减少了个别项目逐一修改的工作量。</li>
|
||
</ul>
|
||
<h3 id="创建共享库"><strong>创建共享库</strong><a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#创建共享库" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>创建共享库需要按照 Jenkins 的特定目录结构和代码规范进行,通常使用 Git 存储和版本控制。目录结构:共享库的代码需要存放在指定目录中,并按约定组织结构:</p>
|
||
<ul>
|
||
<li><code>vars/</code> 目录:存放全局可用的脚本(如 <code>myStep.groovy</code>),可以直接在 Pipeline 中调用。</li>
|
||
<li><code>src/</code> 目录:存放支持 Groovy 类的源码,便于复杂逻辑的封装。</li>
|
||
<li><code>resources/</code> 目录:存放配置文件、模版等静态资源。</li>
|
||
<li><code>Jenkinsfile</code>:用于本地测试的 Jenkinsfile。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// vars/myStep.groovy</span></span>
|
||
<span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">def</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> call</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">String</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> echo </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Hello, ${name}!"</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h3 id="管理共享库"><strong>管理共享库</strong><a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#管理共享库" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<ul>
|
||
<li><strong>版本控制</strong>:共享库应存放在 Git 仓库中,便于版本管理和变更追踪。库的不同版本可以通过标签或分支管理。</li>
|
||
<li><strong>加载共享库</strong>:在 Jenkinsfile 中,通过 <code>@Library</code> 注解加载共享库,并指定版本或分支。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@Library</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'my-shared-library@main'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) _</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Greet'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> myStep(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Jenkins'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<h3 id="在-pipeline-中使用共享库">在 Pipeline 中使用共享库<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#在-pipeline-中使用共享库" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>在 Jenkins Pipeline 中使用共享库的方式包括全局加载和按需加载:</p>
|
||
<ul>
|
||
<li><strong>全局加载</strong>:通过 Jenkins 管理界面配置共享库为全局库,所有 Pipeline 自动加载该库,无需在 Jenkinsfile 中显式声明。</li>
|
||
<li><strong>按需加载</strong>:在 Pipeline 中通过 <code>@Library</code> 注解指定要加载的库,适用于不同项目使用不同版本或库的场景。</li>
|
||
</ul>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@Library</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'my-shared-library@version-1.0'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) _</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Build'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> buildApp() </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 调用共享库中的函数</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>通过共享库,团队可以将通用的流程和逻辑集中管理,并在各个 Pipeline 中简化实现,提高代码的可维护性和一致性。</p>
|
||
<h3 id="版本控制与更新策略">版本控制与更新策略<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#版本控制与更新策略" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>共享库的版本控制和更新策略对于确保稳定性和灵活性至关重要。</p>
|
||
<p>为共享库设置版本标签或使用分支管理不同的版本,确保不同项目可以基于稳定的版本进行开发和构建。主流策略包括使用 Git 标签管理稳定版本,使用分支(如 <code>master</code>、<code>develop</code>)进行开发和测试。</p>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="table-container"><table><thead><tr><th><strong>策略</strong></th><th><strong>描述</strong></th></tr></thead><tbody><tr><td><strong>渐进式更新</strong></td><td>在更新共享库时,避免直接修改主版本,先在开发分支或新版本标签上进行迭代和测试。确认稳定后,再将变更合并到主版本或在稳定分支中发布新版本,减少构建失败风险。</td></tr><tr><td><strong>回滚机制</strong></td><td>确保更新共享库后,所有依赖的 Pipeline 都能平稳过渡。如果新版本出现问题,可以快速回滚到旧版本,通过在 Pipeline 中指定旧版本或分支的方式实现回滚。</td></tr><tr><td><strong>文档与变更日志</strong></td><td>每次更新共享库时,附带详细的文档说明和变更日志,告知使用者新增功能、变更及可能的影响。良好的文档有助于团队更好地适应和采用新的库版本。</td></tr><tr><td><strong>向后兼容性</strong></td><td>更新共享库时,尽量保持向后兼容性。避免引入破坏性变更,或在引入破坏性变更时,提供过渡期和旧版支持,确保所有项目有足够的时间进行调整。</td></tr></tbody></table></div>
|
||
<h2 id="部署到-kubernetes-和其他云平台">部署到 Kubernetes 和其他云平台<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#部署到-kubernetes-和其他云平台" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<p>Jenkins 可以与 Kubernetes 实现深度集成,尤其是在自动化部署和容器化管理方面。Jenkins 的 Kubernetes 插件可以动态地在 Kubernetes 集群中启动 Jenkins Agent,以执行构建任务。</p>
|
||
<ul>
|
||
<li><strong>Jenkins Agent 动态配置</strong>:Jenkins 可以利用 Kubernetes 插件在需要时自动启动容器化的 Jenkins Agent,并在任务完成后销毁这些容器。这种按需启动和销毁 Agent 的机制,提升了资源利用效率,特别适合处理高并发的构建任务。</li>
|
||
<li><strong>Jenkins X</strong>:Jenkins X 是 Jenkins 的云原生扩展,专为 Kubernetes 环境设计。它简化了在 Kubernetes 上的 CI/CD 配置,自动管理应用的部署和环境,并提供开箱即用的 GitOps 流水线管理。</li>
|
||
<li><strong>集群管理和资源调度</strong>:通过 Jenkins 与 Kubernetes 的集成,Jenkins 可以直接与 Kubernetes API 交互,进行容器编排、服务部署、扩展和滚动更新,实现高效的自动化运维。</li>
|
||
</ul>
|
||
<h3 id="使用-helm-部署应用到-kubernetes">使用 Helm 部署应用到 Kubernetes<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#使用-helm-部署应用到-kubernetes" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Helm</strong> 是 Kubernetes 的包管理工具,用于简化应用在 Kubernetes 上的部署和管理。通过 Helm,用户可以定义、安装和升级 Kubernetes 应用。</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>创建 Helm Chart</strong>:一个 Helm Chart 是一个包含 Kubernetes 资源定义的模板包,描述了一个完整的应用及其依赖。开发者可以创建自定义的 Helm Chart 来管理应用的生命周期。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Helm 与 Jenkins 集成</strong>:在 Jenkins Pipeline 中,用户可以通过 <code>helm</code> 命令自动化地管理 Helm Chart 的打包、发布和部署。例如,可以在 Pipeline 中执行以下步骤:</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent any</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Helm Package'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'helm package myapp'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Helm Deploy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'helm upgrade --install myapp ./myapp-chart'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
</li>
|
||
<li>
|
||
<p><strong>自动化发布和升级</strong>:Helm 支持自动化的版本升级、回滚操作,配合 Jenkins 的 Pipeline,可以实现持续交付的完整生命周期管理。</p>
|
||
</li>
|
||
</ul>
|
||
<h3 id="jenkins-部署-awsazuregcp-等云平台">Jenkins 部署 AWS、Azure、GCP 等云平台<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-部署-awsazuregcp-等云平台" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 可以通过各种插件和脚本集成来实现对 AWS、Azure、GCP 等主流云平台的自动化部署和管理。</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>使用 AWS CLI 和 SDK</strong>:Jenkins 可以在 Pipeline 中通过 AWS CLI 进行 S3 存储管理、EC2 实例启动、Lambda 函数部署等操作。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>CloudFormation 和 Terraform</strong>:通过 Jenkins 自动化运行 CloudFormation 模板或 Terraform 脚本,管理 AWS 上的基础设施。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Azure CLI 和 DevOps 集成</strong>:Jenkins 支持使用 Azure CLI 管理 Azure 资源,还可以通过 Azure DevOps 插件,直接与 Azure DevOps 服务进行集成,自动化管理应用的发布、资源的创建和配置。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Google Cloud SDK</strong>:Jenkins 可以利用 Google Cloud SDK 在 GCP 上进行容器管理、虚拟机管理以及云函数的部署。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>Terraform 集成</strong>:同样可以通过 Terraform 在 GCP 上定义和管理基础设施,配合 Jenkins 的自动化执行,实现 IaC。</p>
|
||
</li>
|
||
</ul>
|
||
<h3 id="利用-infrastructure-as-code-实现自动化基础设施部署">利用 Infrastructure as Code 实现自动化基础设施部署<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#利用-infrastructure-as-code-实现自动化基础设施部署" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p><strong>Infrastructure as Code(IaC)</strong> 是通过代码定义和管理基础设施的实践。Jenkins 与 IaC 工具(如 Terraform、CloudFormation)的集成,可以实现从基础设施到应用的全自动化管理。</p>
|
||
<h4 id="terraform">Terraform<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#terraform" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>使用 Terraform 脚本定义云资源,在 Jenkins Pipeline 中通过 <code>terraform</code> 命令执行资源创建、更新和销毁。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent any</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Terraform Apply'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'terraform init'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'terraform apply -auto-approve'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>Terraform 管理基础设施的状态,并支持自动化的回滚机制,在 Jenkins 中配置 <code>terraform plan</code> 和 <code>terraform apply</code> 步骤,实现安全的基础设施更新。</p>
|
||
<h4 id="cloudformation">CloudFormation<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#cloudformation" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
||
<p>使用 CloudFormation 模板定义 AWS 资源,并在 Jenkins 中通过 <code>aws cloudformation</code> 命令自动化执行栈的创建和更新。</p>
|
||
<figure data-rehype-pretty-code-figure><pre tabindex="0" data-language="groovy" data-theme="github-light github-dark"><code data-language="groovy" data-theme="github-light github-dark" style="display:grid;"><span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">pipeline {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent any</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stages {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stage(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Deploy Stack'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> steps {</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sh </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'aws cloudformation deploy --template-file stack.yml --stack-name my-stack'</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
||
<span data-line><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></figure>
|
||
<p>配置 CloudFormation 事件监控,通过 Jenkins Pipeline 自动化响应失败的栈操作,并触发回滚或重新部署。通过 IaC 的实践,开发和运维团队可以通过 Jenkins 实现基础设施的全生命周期管理,确保环境的一致性和自动化的高效性。</p>
|
||
<h2 id="性能优化和故障排查">性能优化和故障排查<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#性能优化和故障排查" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
||
<h3 id="jenkins-性能瓶颈识别与优化策略">Jenkins 性能瓶颈识别与优化策略<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-性能瓶颈识别与优化策略" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>随着项目规模的增长,Jenkins 的性能优化变得至关重要。常见的性能瓶颈及优化策略包括:</p>
|
||
<ul>
|
||
<li><strong>Master 性能优化</strong>:Jenkins Master 服务器的性能直接影响到整个系统的响应速度。优化 Master 性能的关键在于提升 CPU 和内存资源配置,使用高性能磁盘以加快 Job 的读取和日志存储。可以通过增加 Master 节点的资源或分离部分非核心任务到专用节点来缓解负载。</li>
|
||
<li><strong>Agent 管理优化</strong>:通过合理配置 Agent 的数量和资源,确保并发任务能够高效执行。可以使用 Kubernetes 动态扩展 Agent 的机制,根据需求自动调整 Agent 数量。</li>
|
||
<li><strong>数据库与存储优化</strong>:Jenkins 的历史记录、构建日志、Artifact 存储等会消耗大量的存储资源。可以使用专用的数据库系统(如 MySQL)管理 Jenkins 的元数据,定期清理旧的构建记录,压缩存储空间。</li>
|
||
<li><strong>插件管理</strong>:尽量减少不必要的插件,避免插件冲突或兼容性问题引发的性能问题。定期更新插件版本,以利用最新的性能优化和功能改进。</li>
|
||
</ul>
|
||
<h3 id="分布式构建master-slave-架构的优化">分布式构建:Master-Slave 架构的优化<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#分布式构建master-slave-架构的优化" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>Jenkins 支持 Master-Slave(Agent)架构,通过分布式构建提升系统的并发能力和资源利用率。</p>
|
||
<ul>
|
||
<li><strong>水平扩展</strong>:通过增加 Slave 节点,可以水平扩展 Jenkins 的构建能力,将大量并发构建任务分散到多个 Slave 节点执行,减少 Master 的负载。</li>
|
||
<li><strong>专用 Slave</strong>:为特定任务(如测试、部署)配置专用的 Slave 节点,以提高特定任务的执行效率。可以根据任务的资源需求选择不同类型的 Slave(如高内存、GPU 支持的 Slave)。</li>
|
||
<li><strong>负载均衡</strong>:合理分配构建任务,避免某些 Slave 节点负载过高。可以使用标签(Label)机制,将不同类型的任务分配到适合的 Slave 上执行。</li>
|
||
<li><strong>网络优化</strong>:确保 Master 和 Slave 之间的网络连接稳定可靠,使用高速网络和专用通道,减少构建数据传输的延迟。</li>
|
||
</ul>
|
||
<h3 id="jenkins-日志分析">Jenkins 日志分析<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-日志分析" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>日志是 Jenkins 故障排查的关键工具,通过分析 Jenkins 日志,团队可以快速定位问题并采取相应的解决措施。</p>
|
||
<ul>
|
||
<li><strong>主日志</strong>:Jenkins 的主日志包含了系统启动、插件加载、任务调度等核心信息。通过分析主日志,可以发现系统启动错误、插件兼容性问题、任务调度冲突等问题。</li>
|
||
<li><strong>构建日志</strong>:每个 Jenkins Job 都有独立的构建日志,记录了从源码拉取、构建、测试到部署的详细过程。通过构建日志可以分析构建失败的原因,排查脚本错误、环境问题或外部依赖的故障。</li>
|
||
<li><strong>插件日志</strong>:某些插件会生成独立的日志文件,分析插件日志可以帮助解决插件相关的错误,如身份验证失败、外部服务连接超时等。</li>
|
||
</ul>
|
||
<h3 id="jenkins-故障排查">Jenkins 故障排查<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#jenkins-故障排查" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<ul>
|
||
<li><strong>重现问题</strong>:通过复现问题,可以确认问题的触发条件和影响范围。可以使用相同的输入和配置,在测试环境中重现问题,收集更多调试信息。</li>
|
||
<li><strong>日志级别调整</strong>:在某些情况下,可以通过提高日志级别(如将默认的 INFO 级别提升为 DEBUG),获取更详细的调试信息,帮助分析复杂的问题。</li>
|
||
<li><strong>结合监控系统</strong>:将 Jenkins 与系统监控工具(如 Prometheus、Grafana)结合,实时监控 Jenkins 的性能指标、资源消耗、错误率等,提前发现并预警潜在的问题。</li>
|
||
</ul>
|
||
<h3 id="构建队列管理">构建队列管理<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#构建队列管理" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<p>随着构建任务的增加,构建队列的管理和资源优化变得至关重要。有效的队列管理可以避免任务积压,提升系统整体效率。</p>
|
||
<ul>
|
||
<li><strong>优先级队列</strong>:通过 Jenkins 的优先级队列插件,可以为不同类型的任务设置优先级,确保高优先级任务优先执行,减少关键任务的等待时间。</li>
|
||
<li><strong>队列限流</strong>:通过配置最大并发构建数,限制资源消耗高的任务同时执行,防止资源争用导致的系统性能下降。</li>
|
||
<li><strong>任务分配策略</strong>:使用 Label 和 Node Affinity 机制,将特定任务分配到最合适的节点执行,提高执行效率并减少不必要的资源占用。</li>
|
||
</ul>
|
||
<h3 id="资源优化">资源优化<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#资源优化" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
||
<ul>
|
||
<li><strong>缓存机制</strong>:通过使用缓存(如 Docker 镜像缓存、依赖包缓存),减少重复下载和构建时间,提升构建速度。</li>
|
||
<li><strong>构建资源池化</strong>:将资源(如数据库、外部服务)池化处理,避免频繁启动和销毁资源带来的开销。</li>
|
||
<li><strong>动态扩展</strong>:使用自动化扩展工具,根据实际负载动态调整 Jenkins 的资源配置,确保在高峰期自动扩展,在低负载时自动缩减,节省成本。</li>
|
||
</ul></article><hr/><div class="page-footer"></div></div><div class="right sidebar"><div class="graph"><h3>关系图谱</h3><div class="graph-outer"><div id="graph-container" data-cfg="{"drag":true,"zoom":true,"depth":1,"scale":1.1,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[],"focusOnHover":false}"></div><button id="global-graph-icon" aria-label="Global Graph"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xml:space="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
|
||
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
|
||
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
|
||
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
|
||
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
|
||
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
|
||
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
|
||
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
|
||
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
|
||
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
|
||
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></button></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{"drag":true,"zoom":true,"depth":-1,"scale":0.9,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[],"focusOnHover":true}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc" class aria-controls="toc-content" aria-expanded="true"><h3>目录</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content" class><ul class="overflow"><li class="depth-0"><a href="#jenkins-概述" data-for="jenkins-概述">Jenkins 概述</a></li><li class="depth-1"><a href="#jenkins-是什么" data-for="jenkins-是什么">Jenkins 是什么</a></li><li class="depth-1"><a href="#jenkins-的历史与发展" data-for="jenkins-的历史与发展">Jenkins 的历史与发展</a></li><li class="depth-1"><a href="#jenkins-的架构及工作原理" data-for="jenkins-的架构及工作原理">Jenkins 的架构及工作原理</a></li><li class="depth-1"><a href="#jenkins-与其他-cicd-工具的对比" data-for="jenkins-与其他-cicd-工具的对比">Jenkins 与其他 CI/CD 工具的对比</a></li><li class="depth-0"><a href="#jenkins-安装和配置" data-for="jenkins-安装和配置">Jenkins 安装和配置</a></li><li class="depth-1"><a href="#初始配置和界面概览" data-for="初始配置和界面概览">初始配置和界面概览</a></li><li class="depth-1"><a href="#系统配置全局安全设置系统信息环境变量配置" data-for="系统配置全局安全设置系统信息环境变量配置">系统配置:全局安全设置、系统信息、环境变量配置</a></li><li class="depth-1"><a href="#用户管理创建用户和角色权限分配" data-for="用户管理创建用户和角色权限分配">用户管理:创建用户和角色,权限分配</a></li><li class="depth-0"><a href="#jenkins-插件系统" data-for="jenkins-插件系统">Jenkins 插件系统</a></li><li class="depth-1"><a href="#常用插件介绍与配置" data-for="常用插件介绍与配置">常用插件介绍与配置</a></li><li class="depth-1"><a href="#插件的更新和备份策略" data-for="插件的更新和备份策略">插件的更新和备份策略</a></li><li class="depth-1"><a href="#插件冲突与兼容性问题的解决" data-for="插件冲突与兼容性问题的解决">插件冲突与兼容性问题的解决</a></li><li class="depth-0"><a href="#jenkins-job" data-for="jenkins-job">Jenkins Job</a></li><li class="depth-1"><a href="#自由风格项目freestyle-project" data-for="自由风格项目freestyle-project">自由风格项目(Freestyle Project)</a></li><li class="depth-1"><a href="#流水线项目pipeline-project" data-for="流水线项目pipeline-project">流水线项目(Pipeline Project)</a></li><li class="depth-1"><a href="#多分支流水线项目multibranch-pipeline-project" data-for="多分支流水线项目multibranch-pipeline-project">多分支流水线项目(Multibranch Pipeline Project)</a></li><li class="depth-1"><a href="#maven-项目maven-project" data-for="maven-项目maven-project">Maven 项目(Maven Project)</a></li><li class="depth-1"><a href="#外部任务external-job" data-for="外部任务external-job">外部任务(External Job)</a></li><li class="depth-1"><a href="#pipeline-as-code-项目pipeline-as-code-project" data-for="pipeline-as-code-项目pipeline-as-code-project">Pipeline as Code 项目(Pipeline-as-Code Project)</a></li><li class="depth-1"><a href="#组合项目matrix-project" data-for="组合项目matrix-project">组合项目(Matrix Project)</a></li><li class="depth-1"><a href="#外部工作流external-workflow" data-for="外部工作流external-workflow">外部工作流(External Workflow)</a></li><li class="depth-1"><a href="#构建流水线插件项目build-pipeline-plugin-project" data-for="构建流水线插件项目build-pipeline-plugin-project">构建流水线插件项目(Build Pipeline Plugin Project)</a></li><li class="depth-1"><a href="#配置源码管理gitsubversion" data-for="配置源码管理gitsubversion">配置源码管理(Git、Subversion)</a></li><li class="depth-1"><a href="#构建触发器scm-轮询webhook定时任务" data-for="构建触发器scm-轮询webhook定时任务">构建触发器:SCM 轮询、Webhook、定时任务</a></li><li class="depth-1"><a href="#构建步骤编译测试打包部署" data-for="构建步骤编译测试打包部署">构建步骤:编译、测试、打包、部署</a></li><li class="depth-0"><a href="#pipeline-脚本" data-for="pipeline-脚本">Pipeline 脚本</a></li><li class="depth-1"><a href="#declarative-pipeline" data-for="declarative-pipeline">Declarative Pipeline</a></li><li class="depth-1"><a href="#scripted-pipeline" data-for="scripted-pipeline">Scripted Pipeline</a></li><li class="depth-1"><a href="#stages-步骤" data-for="stages-步骤">Stages 步骤</a></li><li class="depth-1"><a href="#steps-步骤" data-for="steps-步骤">Steps 步骤</a></li><li class="depth-1"><a href="#post-actions-步骤" data-for="post-actions-步骤">Post Actions 步骤</a></li><li class="depth-0"><a href="#pipeline-实现动态参数化构建" data-for="pipeline-实现动态参数化构建">Pipeline 实现动态参数化构建</a></li><li class="depth-1"><a href="#使用参数" data-for="使用参数">使用参数</a></li><li class="depth-1"><a href="#条件语句" data-for="条件语句">条件语句</a></li><li class="depth-1"><a href="#循环结构" data-for="循环结构">循环结构</a></li><li class="depth-1"><a href="#并行执行" data-for="并行执行">并行执行</a></li><li class="depth-0"><a href="#groovy-语法" data-for="groovy-语法">Groovy 语法</a></li><li class="depth-1"><a href="#变量和常量的定义" data-for="变量和常量的定义">变量和常量的定义</a></li><li class="depth-1"><a href="#条件语句的使用" data-for="条件语句的使用">条件语句的使用</a></li><li class="depth-1"><a href="#循环结构的实现" data-for="循环结构的实现">循环结构的实现</a></li><li class="depth-1"><a href="#函数和闭包的封装" data-for="函数和闭包的封装">函数和闭包的封装</a></li><li class="depth-1"><a href="#异常处理机制" data-for="异常处理机制">异常处理机制</a></li><li class="depth-0"><a href="#使用-credentials-plugin-进行安全管理" data-for="使用-credentials-plugin-进行安全管理">使用 Credentials Plugin 进行安全管理</a></li><li class="depth-1"><a href="#存储方式" data-for="存储方式">存储方式</a></li><li class="depth-1"><a href="#使用方式" data-for="使用方式">使用方式</a></li><li class="depth-1"><a href="#注意事项" data-for="注意事项">注意事项</a></li><li class="depth-0"><a href="#基本的-ci-流程" data-for="基本的-ci-流程">基本的 CI 流程</a></li><li class="depth-1"><a href="#使用-pipeline-实现持续集成流程" data-for="使用-pipeline-实现持续集成流程">使用 Pipeline 实现持续集成流程</a></li><li class="depth-1"><a href="#集成单元测试" data-for="集成单元测试">集成单元测试</a></li><li class="depth-1"><a href="#构建失败后的错误处理与通知配置" data-for="构建失败后的错误处理与通知配置">构建失败后的错误处理与通知配置</a></li><li class="depth-1"><a href="#生成和发布构建报告" data-for="生成和发布构建报告">生成和发布构建报告</a></li><li class="depth-0"><a href="#多分支管道和并行作业" data-for="多分支管道和并行作业">多分支管道和并行作业</a></li><li class="depth-1"><a href="#jenkins-对-git-分支的支持与自动化构建" data-for="jenkins-对-git-分支的支持与自动化构建">Jenkins 对 Git 分支的支持与自动化构建</a></li><li class="depth-1"><a href="#并行作业的配置与优化" data-for="并行作业的配置与优化">并行作业的配置与优化</a></li><li class="depth-1"><a href="#实现高效的并行测试和部署" data-for="实现高效的并行测试和部署">实现高效的并行测试和部署</a></li><li class="depth-0"><a href="#集成第三方服务" data-for="集成第三方服务">集成第三方服务</a></li><li class="depth-1"><a href="#github" data-for="github">GitHub</a></li><li class="depth-1"><a href="#docker" data-for="docker">Docker</a></li><li class="depth-1"><a href="#kubernetes" data-for="kubernetes">Kubernetes</a></li><li class="depth-1"><a href="#其他服务集成" data-for="其他服务集成">其他服务集成</a></li><li class="depth-0"><a href="#持续交付cd流程" data-for="持续交付cd流程">持续交付(CD)流程</a></li><li class="depth-1"><a href="#持续交付与持续部署的区别" data-for="持续交付与持续部署的区别">持续交付与持续部署的区别</a></li><li class="depth-1"><a href="#实现自动化部署的最佳实践" data-for="实现自动化部署的最佳实践">实现自动化部署的最佳实践</a></li><li class="depth-1"><a href="#蓝绿部署金丝雀发布等策略的实现" data-for="蓝绿部署金丝雀发布等策略的实现">蓝绿部署、金丝雀发布等策略的实现</a></li><li class="depth-1"><a href="#部署管道的监控与回滚机制" data-for="部署管道的监控与回滚机制">部署管道的监控与回滚机制</a></li><li class="depth-0"><a href="#使用共享库提高管道重用性" data-for="使用共享库提高管道重用性">使用共享库提高管道重用性</a></li><li class="depth-1"><a href="#创建共享库" data-for="创建共享库">创建共享库</a></li><li class="depth-1"><a href="#管理共享库" data-for="管理共享库">管理共享库</a></li><li class="depth-1"><a href="#在-pipeline-中使用共享库" data-for="在-pipeline-中使用共享库">在 Pipeline 中使用共享库</a></li><li class="depth-1"><a href="#版本控制与更新策略" data-for="版本控制与更新策略">版本控制与更新策略</a></li><li class="depth-0"><a href="#部署到-kubernetes-和其他云平台" data-for="部署到-kubernetes-和其他云平台">部署到 Kubernetes 和其他云平台</a></li><li class="depth-1"><a href="#使用-helm-部署应用到-kubernetes" data-for="使用-helm-部署应用到-kubernetes">使用 Helm 部署应用到 Kubernetes</a></li><li class="depth-1"><a href="#jenkins-部署-awsazuregcp-等云平台" data-for="jenkins-部署-awsazuregcp-等云平台">Jenkins 部署 AWS、Azure、GCP 等云平台</a></li><li class="depth-1"><a href="#利用-infrastructure-as-code-实现自动化基础设施部署" data-for="利用-infrastructure-as-code-实现自动化基础设施部署">利用 Infrastructure as Code 实现自动化基础设施部署</a></li><li class="depth-0"><a href="#性能优化和故障排查" data-for="性能优化和故障排查">性能优化和故障排查</a></li><li class="depth-1"><a href="#jenkins-性能瓶颈识别与优化策略" data-for="jenkins-性能瓶颈识别与优化策略">Jenkins 性能瓶颈识别与优化策略</a></li><li class="depth-1"><a href="#分布式构建master-slave-架构的优化" data-for="分布式构建master-slave-架构的优化">分布式构建:Master-Slave 架构的优化</a></li><li class="depth-1"><a href="#jenkins-日志分析" data-for="jenkins-日志分析">Jenkins 日志分析</a></li><li class="depth-1"><a href="#jenkins-故障排查" data-for="jenkins-故障排查">Jenkins 故障排查</a></li><li class="depth-1"><a href="#构建队列管理" data-for="构建队列管理">构建队列管理</a></li><li class="depth-1"><a href="#资源优化" data-for="资源优化">资源优化</a></li></ul></div></div><div class="explorer mobile-only"><button type="button" id="explorer" data-behavior="collapse" data-collapsed="collapsed" data-savestate="true" data-tree="[{"path":"Personal","collapsed":true},{"path":"Personal/Blog","collapsed":true},{"path":"Personal/Blog/2018","collapsed":true},{"path":"Personal/Blog/2020","collapsed":true},{"path":"Personal/Blog/2021","collapsed":true},{"path":"Personal/Blog/2022","collapsed":true},{"path":"Personal/Blog/2023","collapsed":true},{"path":"Personal/Blog/2024","collapsed":true},{"path":"Personal/Book","collapsed":true},{"path":"Personal/Book/个人成长","collapsed":true},{"path":"Personal/Book/医学健康","collapsed":true},{"path":"Personal/Book/历史","collapsed":true},{"path":"Personal/Book/哲学宗教","collapsed":true},{"path":"Personal/Book/心理","collapsed":true},{"path":"Personal/Book/政治军事","collapsed":true},{"path":"Personal/Book/教育学习","collapsed":true},{"path":"Personal/Book/文学","collapsed":true},{"path":"Personal/Book/生活百科","collapsed":true},{"path":"Personal/Book/社会文化","collapsed":true},{"path":"Personal/Book/科学技术","collapsed":true},{"path":"Personal/Book/经济理财","collapsed":true},{"path":"Personal/Book/艺术","collapsed":true},{"path":"Personal/Book/计算机","collapsed":true},{"path":"Personal/Journal","collapsed":true},{"path":"Personal/Journal/2022","collapsed":true},{"path":"Personal/Journal/2022/W34","collapsed":true},{"path":"Personal/Journal/2022/W35","collapsed":true},{"path":"Personal/Journal/2022/W36","collapsed":true},{"path":"Personal/Journal/2022/W37","collapsed":true},{"path":"Personal/Journal/2022/W38","collapsed":true},{"path":"Personal/Journal/2022/W39","collapsed":true},{"path":"Personal/Journal/2022/W41","collapsed":true},{"path":"Personal/Journal/2022/W42","collapsed":true},{"path":"Personal/Journal/2022/W43","collapsed":true},{"path":"Personal/Journal/2022/W44","collapsed":true},{"path":"Personal/Journal/2022/W45","collapsed":true},{"path":"Personal/Journal/2022/W46","collapsed":true},{"path":"Personal/Journal/2022/W47","collapsed":true},{"path":"Personal/Journal/2022/W48","collapsed":true},{"path":"Personal/Journal/2022/W49","collapsed":true},{"path":"Personal/Journal/2022/W50","collapsed":true},{"path":"Personal/Journal/2023","collapsed":true},{"path":"Personal/Journal/2023/W2","collapsed":true},{"path":"Personal/Journal/2023/W3","collapsed":true},{"path":"Personal/Journal/2023/W5","collapsed":true},{"path":"Personal/Journal/2023/W6","collapsed":true},{"path":"Personal/Journal/2023/W7","collapsed":true},{"path":"Personal/Journal/2023/W8","collapsed":true},{"path":"Personal/Journal/2023/W10","collapsed":true},{"path":"Personal/Journal/2023/W12","collapsed":true},{"path":"Personal/Journal/2023/W14","collapsed":true},{"path":"Personal/Journal/2023/W16","collapsed":true},{"path":"Personal/Journal/2023/W22","collapsed":true},{"path":"Personal/Journal/2023/W23","collapsed":true},{"path":"Personal/Journal/2023/W24","collapsed":true},{"path":"Personal/Journal/2023/W25","collapsed":true},{"path":"Personal/Journal/2023/W26","collapsed":true},{"path":"Personal/Journal/2023/W31","collapsed":true},{"path":"Personal/Journal/2023/W32","collapsed":true},{"path":"Personal/Journal/2023/W33","collapsed":true},{"path":"Personal/Journal/2023/W35","collapsed":true},{"path":"Personal/Journal/2023/W36","collapsed":true},{"path":"Personal/Journal/2023/W37","collapsed":true},{"path":"Personal/Journal/2023/W40","collapsed":true},{"path":"Personal/Journal/2023/W45","collapsed":true},{"path":"Personal/Journal/2023/W46","collapsed":true},{"path":"Personal/Journal/2023/W48","collapsed":true},{"path":"Personal/Journal/2023/W49","collapsed":true},{"path":"Personal/Journal/2023/W50","collapsed":true},{"path":"Personal/Journal/2024","collapsed":true},{"path":"Personal/Journal/2024/W8","collapsed":true},{"path":"Personal/Journal/2024/W10","collapsed":true},{"path":"Personal/Journal/2024/W11","collapsed":true},{"path":"Personal/Journal/2024/W12","collapsed":true},{"path":"Personal/Journal/2024/W14","collapsed":true},{"path":"Personal/Journal/2024/W16","collapsed":true},{"path":"Personal/Journal/2024/W17","collapsed":true},{"path":"Personal/Journal/2024/W22","collapsed":true},{"path":"Personal/Journal/2024/W23","collapsed":true},{"path":"Personal/Journal/2024/W24","collapsed":true},{"path":"Personal/Journal/2024/W29","collapsed":true},{"path":"Personal/Journal/2024/W30","collapsed":true},{"path":"Personal/Journal/2024/W33","collapsed":true},{"path":"Personal/Journal/2024/W35","collapsed":true},{"path":"Professional","collapsed":true},{"path":"Professional/Company","collapsed":true},{"path":"Professional/Company/数字化","collapsed":true},{"path":"Professional/Company/数字化/规范","collapsed":true},{"path":"Professional/Work","collapsed":true},{"path":"Professional/Work/data-engineer","collapsed":true},{"path":"Professional/Work/full-stack","collapsed":true},{"path":"Professional/Work/full-stack/基础","collapsed":true},{"path":"Professional/Work/full-stack/工具","collapsed":true},{"path":"Professional/Work/full-stack/文化","collapsed":true},{"path":"Professional/Work/roadmap","collapsed":true},{"path":"Professional/Work/roadmap/权益保障","collapsed":true},{"path":"Professional/Work/roadmap/求职经验","collapsed":true},{"path":"Professional/Work/roadmap/简历攻略","collapsed":true},{"path":"Professional/Work/roadmap/职业规划","collapsed":true},{"path":"Professional/Work/roadmap/职场心得","collapsed":true},{"path":"Professional/Work/roadmap/薪酬攻略","collapsed":true},{"path":"Professional/Work/roadmap/面试法则","collapsed":true},{"path":"Professional/Work/sre-engineer","collapsed":true},{"path":"SocialSciences","collapsed":true},{"path":"SocialSciences/English","collapsed":true},{"path":"SocialSciences/Government","collapsed":true},{"path":"SocialSciences/Government/中国","collapsed":true},{"path":"SocialSciences/Government/中国/标准","collapsed":true},{"path":"SocialSciences/Government/中国/法律","collapsed":true},{"path":"Technology","collapsed":true},{"path":"Technology/CloudService","collapsed":true},{"path":"Technology/CloudService/基础","collapsed":true},{"path":"Technology/ComputerNetwork","collapsed":true},{"path":"Technology/ComputerNetwork/Nginx","collapsed":true},{"path":"Technology/ComputerNetwork/公共服务","collapsed":true},{"path":"Technology/ComputerNetwork/应用服务","collapsed":true},{"path":"Technology/ComputerNetwork/网络协议","collapsed":true},{"path":"Technology/ComputerNetwork/网络基础","collapsed":true},{"path":"Technology/ComputerSecurity","collapsed":true},{"path":"Technology/ComputerSecurity/信息安全","collapsed":true},{"path":"Technology/ComputerSecurity/信息安全/OpenPGP","collapsed":true},{"path":"Technology/ComputerSecurity/密码学","collapsed":true},{"path":"Technology/ComputerSecurity/用户安全","collapsed":true},{"path":"Technology/ComputerSecurity/用户安全/权限设计","collapsed":true},{"path":"Technology/ComputerSecurity/用户安全/用户鉴权","collapsed":true},{"path":"Technology/ComputerSecurity/系统安全","collapsed":true},{"path":"Technology/ComputerSecurity/系统安全/防火墙","collapsed":true},{"path":"Technology/ComputerSecurity/网络安全","collapsed":true},{"path":"Technology/ComputerSecurity/网络安全/OpenSSH","collapsed":true},{"path":"Technology/ComputerSecurity/网络安全/OpenSSL","collapsed":true},{"path":"Technology/ComputerStorage","collapsed":true},{"path":"Technology/DatabaseSystem","collapsed":true},{"path":"Technology/DatabaseSystem/PostgreSQL","collapsed":true},{"path":"Technology/DatabaseSystem/SQL-语言","collapsed":true},{"path":"Technology/DatabaseSystem/基础","collapsed":true},{"path":"Technology/GettingStarted","collapsed":true},{"path":"Technology/GettingStarted/命令行工具","collapsed":true},{"path":"Technology/GettingStarted/命令行工具/PowerShell","collapsed":true},{"path":"Technology/GettingStarted/命令行工具/Shell","collapsed":true},{"path":"Technology/GettingStarted/命令行工具/Vim","collapsed":true},{"path":"Technology/GettingStarted/开源指南","collapsed":true},{"path":"Technology/GettingStarted/文本处理","collapsed":true},{"path":"Technology/GettingStarted/版本控制","collapsed":true},{"path":"Technology/GettingStarted/版本控制/Git","collapsed":true},{"path":"Technology/GettingStarted/版本控制/Git/入门","collapsed":true},{"path":"Technology/GettingStarted/版本控制/Git/进阶","collapsed":true},{"path":"Technology/OperatingSystem","collapsed":true},{"path":"Technology/OperatingSystem/Automation","collapsed":true},{"path":"Technology/OperatingSystem/Docker","collapsed":true},{"path":"Technology/OperatingSystem/Docker/基础","collapsed":true},{"path":"Technology/OperatingSystem/Docker/进阶","collapsed":true},{"path":"Technology/OperatingSystem/Docker/高级","collapsed":true},{"path":"Technology/OperatingSystem/Linux","collapsed":true},{"path":"Technology/OperatingSystem/Linux/1.文化","collapsed":true},{"path":"Technology/OperatingSystem/Linux/2.安装","collapsed":true},{"path":"Technology/OperatingSystem/Linux/3.基础操作","collapsed":true},{"path":"Technology/OperatingSystem/Linux/4.系统管理","collapsed":true},{"path":"Technology/OperatingSystem/Linux/5.安全配置","collapsed":true},{"path":"Technology/OperatingSystem/Linux/6.网络管理","collapsed":true},{"path":"Technology/OperatingSystem/Linux/7.存储管理","collapsed":true},{"path":"Technology/OperatingSystem/Virtualization","collapsed":true},{"path":"Technology/OperatingSystem/Virtualization/1.虚拟化概述","collapsed":true},{"path":"Technology/OperatingSystem/Virtualization/2.KVM虚拟化","collapsed":true},{"path":"Technology/OperatingSystem/Windows","collapsed":true},{"path":"Technology/OperatingSystem/Windows/文化","collapsed":true},{"path":"Technology/ProgrammingLanguage","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/入门","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/文化","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/WEB开发","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/数据处理","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/文本处理","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/系统交互","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/模块/网络处理","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/进阶","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/项目","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/项目/虚拟环境","collapsed":true},{"path":"Technology/ProgrammingLanguage/Python/项目/风格指南","collapsed":true},{"path":"Technology/SoftwareEngineering","collapsed":true},{"path":"Technology/SoftwareEngineering/CI-and-CD","collapsed":true},{"path":"Technology/SoftwareEngineering/协作规范","collapsed":true},{"path":"Technology/SoftwareEngineering/技术文档","collapsed":true},{"path":"Technology/StructuresAlgorithms","collapsed":true}]" aria-controls="explorer-content" aria-expanded="false"><h2>探索</h2><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="explorer-content"><ul class="overflow" id="explorer-ul"><li><div class="folder-outer open"><ul style="padding-left:0;" class="content" data-folderul><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal"><button class="folder-button"><span class="folder-title">Personal</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog"><button class="folder-button"><span class="folder-title">Blog</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2018"><button class="folder-button"><span class="folder-title">2018</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2018"><li><a href="../../../Personal/Blog/2018/11月28日晚-星期三-霾" data-for="Personal/Blog/2018/11月28日晚-星期三-霾">11月28日 晚 星期三 霾</a></li><li><a href="../../../Personal/Blog/2018/BombSquad-炸弹人小分队" data-for="Personal/Blog/2018/BombSquad-炸弹人小分队">BombSquad-炸弹人小分队</a></li><li><a href="../../../Personal/Blog/2018/如何免费创建一个属于自己的网站" data-for="Personal/Blog/2018/如何免费创建一个属于自己的网站">如何免费创建一个属于自己的网站</a></li><li><a href="../../../Personal/Blog/2018/英雄联盟-S8-全球总决赛" data-for="Personal/Blog/2018/英雄联盟-S8-全球总决赛">英雄联盟 S8 全球总决赛</a></li><li><a href="../../../Personal/Blog/2018/螺蛳粉" data-for="Personal/Blog/2018/螺蛳粉">螺蛳粉</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2020"><button class="folder-button"><span class="folder-title">2020</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2020"><li><a href="../../../Personal/Blog/2020/Don`t-Starve-饥荒" data-for="Personal/Blog/2020/Don`t-Starve-饥荒">Don't Starve-饥荒</a></li><li><a href="../../../Personal/Blog/2020/中国传统历法" data-for="Personal/Blog/2020/中国传统历法">中国传统历法</a></li><li><a href="../../../Personal/Blog/2020/初号机,起飞!" data-for="Personal/Blog/2020/初号机,起飞!">初号机,起飞!</a></li><li><a href="../../../Personal/Blog/2020/吉普赛满天星" data-for="Personal/Blog/2020/吉普赛满天星">吉普赛满天星</a></li><li><a href="../../../Personal/Blog/2020/夏日花记" data-for="Personal/Blog/2020/夏日花记">夏日花记</a></li><li><a href="../../../Personal/Blog/2020/幸福的事情都是需要等待的" data-for="Personal/Blog/2020/幸福的事情都是需要等待的">幸福的事情都是需要等待的</a></li><li><a href="../../../Personal/Blog/2020/开源软件之道" data-for="Personal/Blog/2020/开源软件之道">开源软件之道</a></li><li><a href="../../../Personal/Blog/2020/我的小羊肖恩" data-for="Personal/Blog/2020/我的小羊肖恩">我的小羊肖恩</a></li><li><a href="../../../Personal/Blog/2020/数据恢复杂谈" data-for="Personal/Blog/2020/数据恢复杂谈">数据恢复杂谈</a></li><li><a href="../../../Personal/Blog/2020/注定不平凡的一年" data-for="Personal/Blog/2020/注定不平凡的一年">注定不平凡的一年</a></li><li><a href="../../../Personal/Blog/2020/浅谈个人服务器架构" data-for="Personal/Blog/2020/浅谈个人服务器架构">浅谈个人服务器架构</a></li><li><a href="../../../Personal/Blog/2020/球鞋日记" data-for="Personal/Blog/2020/球鞋日记">球鞋日记</a></li><li><a href="../../../Personal/Blog/2020/記拾月" data-for="Personal/Blog/2020/記拾月">記拾月</a></li><li><a href="../../../Personal/Blog/2020/长安游记" data-for="Personal/Blog/2020/长安游记">长安游记</a></li><li><a href="../../../Personal/Blog/2020/骑行在路上" data-for="Personal/Blog/2020/骑行在路上">骑行在路上</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2021"><button class="folder-button"><span class="folder-title">2021</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2021"><li><a href="../../../Personal/Blog/2021/2021" data-for="Personal/Blog/2021/2021">2021</a></li><li><a href="../../../Personal/Blog/2021/VIVO-IQOO-Neo3-开箱测评" data-for="Personal/Blog/2021/VIVO-IQOO-Neo3-开箱测评">VIVO IQOO Neo3 开箱测评</a></li><li><a href="../../../Personal/Blog/2021/上有天堂、下有苏杭" data-for="Personal/Blog/2021/上有天堂、下有苏杭">上有天堂、下有苏杭</a></li><li><a href="../../../Personal/Blog/2021/我开发的第一款软件" data-for="Personal/Blog/2021/我开发的第一款软件">我开发的第一款软件</a></li><li><a href="../../../Personal/Blog/2021/我站立的地方是中国" data-for="Personal/Blog/2021/我站立的地方是中国">我站立的地方是中国</a></li><li><a href="../../../Personal/Blog/2021/我还在……" data-for="Personal/Blog/2021/我还在……">我还在……</a></li><li><a href="../../../Personal/Blog/2021/星光不问赶路人" data-for="Personal/Blog/2021/星光不问赶路人">星光不问赶路人</a></li><li><a href="../../../Personal/Blog/2021/济南呀济南的泰山之旅" data-for="Personal/Blog/2021/济南呀济南的泰山之旅">济南呀济南的泰山之旅</a></li><li><a href="../../../Personal/Blog/2021/涝疫结合" data-for="Personal/Blog/2021/涝疫结合">涝疫结合</a></li><li><a href="../../../Personal/Blog/2021/申请-Jetbrains-开源项目授权" data-for="Personal/Blog/2021/申请-Jetbrains-开源项目授权">申请 Jetbrains 开源项目授权</a></li><li><a href="../../../Personal/Blog/2021/真·长安游记" data-for="Personal/Blog/2021/真·长安游记">真·长安游记</a></li><li><a href="../../../Personal/Blog/2021/记拾月" data-for="Personal/Blog/2021/记拾月">记拾月</a></li><li><a href="../../../Personal/Blog/2021/贰号机、落幕" data-for="Personal/Blog/2021/贰号机、落幕">贰号机、落幕</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2022"><button class="folder-button"><span class="folder-title">2022</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2022"><li><a href="../../../Personal/Blog/2022/「引用」博客的本质是电线杆子" data-for="Personal/Blog/2022/「引用」博客的本质是电线杆子">「引用」博客的本质是电线杆子</a></li><li><a href="../../../Personal/Blog/2022/2022" data-for="Personal/Blog/2022/2022">2022</a></li><li><a href="../../../Personal/Blog/2022/Halo-主题-Redemption-首发版" data-for="Personal/Blog/2022/Halo-主题-Redemption-首发版">Halo 主题 Redemption 首发版</a></li><li><a href="../../../Personal/Blog/2022/Hello-Halo" data-for="Personal/Blog/2022/Hello-Halo">Hello Halo</a></li><li><a href="../../../Personal/Blog/2022/Redemption" data-for="Personal/Blog/2022/Redemption">Redemption</a></li><li><a href="../../../Personal/Blog/2022/Redemption-主题-0.2.1-版本" data-for="Personal/Blog/2022/Redemption-主题-0.2.1-版本">Redemption 主题 0.2.1 版本</a></li><li><a href="../../../Personal/Blog/2022/一线城市拥有一亩三分地是什么体验" data-for="Personal/Blog/2022/一线城市拥有一亩三分地是什么体验">一线城市拥有一亩三分地是什么体验</a></li><li><a href="../../../Personal/Blog/2022/三步为你博客文章分析情感关键字" data-for="Personal/Blog/2022/三步为你博客文章分析情感关键字">三步为你博客文章分析情感关键字</a></li><li><a href="../../../Personal/Blog/2022/不要在饿的时候吃螺蛳粉!" data-for="Personal/Blog/2022/不要在饿的时候吃螺蛳粉!">不要在饿的时候吃螺蛳粉!</a></li><li><a href="../../../Personal/Blog/2022/习惯养成第一步" data-for="Personal/Blog/2022/习惯养成第一步">习惯养成第一步</a></li><li><a href="../../../Personal/Blog/2022/人在囧途——青海湖" data-for="Personal/Blog/2022/人在囧途——青海湖">人在囧途——青海湖</a></li><li><a href="../../../Personal/Blog/2022/人格类型测试" data-for="Personal/Blog/2022/人格类型测试">人格类型测试</a></li><li><a href="../../../Personal/Blog/2022/你还记得曾经的梦想么?" data-for="Personal/Blog/2022/你还记得曾经的梦想么?">你还记得曾经的梦想么?</a></li><li><a href="../../../Personal/Blog/2022/使用-Docusaurus-搭建优秀个人wiki" data-for="Personal/Blog/2022/使用-Docusaurus-搭建优秀个人wiki">使用 Docusaurus 搭建优秀个人wiki</a></li><li><a href="../../../Personal/Blog/2022/关于感情的事情" data-for="Personal/Blog/2022/关于感情的事情">关于感情的事情</a></li><li><a href="../../../Personal/Blog/2022/关于花" data-for="Personal/Blog/2022/关于花">关于花</a></li><li><a href="../../../Personal/Blog/2022/关于郑州的互联网记忆" data-for="Personal/Blog/2022/关于郑州的互联网记忆">关于郑州的互联网记忆</a></li><li><a href="../../../Personal/Blog/2022/再游嵩山" data-for="Personal/Blog/2022/再游嵩山">再游嵩山</a></li><li><a href="../../../Personal/Blog/2022/最近在折腾什么……" data-for="Personal/Blog/2022/最近在折腾什么……">最近在折腾什么……</a></li><li><a href="../../../Personal/Blog/2022/最近的生活" data-for="Personal/Blog/2022/最近的生活">最近的生活</a></li><li><a href="../../../Personal/Blog/2022/写十万字的博客是一种什么感觉" data-for="Personal/Blog/2022/写十万字的博客是一种什么感觉">写十万字的博客是一种什么感觉</a></li><li><a href="../../../Personal/Blog/2022/写博客的正确姿势---先行版" data-for="Personal/Blog/2022/写博客的正确姿势---先行版">写博客的正确姿势 - 先行版</a></li><li><a href="../../../Personal/Blog/2022/写博客的正确姿势---测试版" data-for="Personal/Blog/2022/写博客的正确姿势---测试版">写博客的正确姿势 - 测试版</a></li><li><a href="../../../Personal/Blog/2022/原点" data-for="Personal/Blog/2022/原点">原点</a></li><li><a href="../../../Personal/Blog/2022/如何免费获得-Jetbrains-正版授权" data-for="Personal/Blog/2022/如何免费获得-Jetbrains-正版授权">如何免费获得 Jetbrains 正版授权</a></li><li><a href="../../../Personal/Blog/2022/我是关系户" data-for="Personal/Blog/2022/我是关系户">我是关系户</a></li><li><a href="../../../Personal/Blog/2022/我要拔智齿!!!" data-for="Personal/Blog/2022/我要拔智齿!!!">我要拔智齿!!!</a></li><li><a href="../../../Personal/Blog/2022/数字文化遗产" data-for="Personal/Blog/2022/数字文化遗产">数字文化遗产</a></li><li><a href="../../../Personal/Blog/2022/新冠笔记" data-for="Personal/Blog/2022/新冠笔记">新冠笔记</a></li><li><a href="../../../Personal/Blog/2022/新手村村长" data-for="Personal/Blog/2022/新手村村长">新手村村长</a></li><li><a href="../../../Personal/Blog/2022/是微风、是晚霞、是来日方长" data-for="Personal/Blog/2022/是微风、是晚霞、是来日方长">是微风、是晚霞、是来日方长</a></li><li><a href="../../../Personal/Blog/2022/月季到了" data-for="Personal/Blog/2022/月季到了">月季到了</a></li><li><a href="../../../Personal/Blog/2022/浅谈一下自己折腾的网站" data-for="Personal/Blog/2022/浅谈一下自己折腾的网站">浅谈一下自己折腾的网站</a></li><li><a href="../../../Personal/Blog/2022/番茄开花啦-~" data-for="Personal/Blog/2022/番茄开花啦-~">番茄开花啦 ~</a></li><li><a href="../../../Personal/Blog/2022/种下了一些瓜果蔬菜" data-for="Personal/Blog/2022/种下了一些瓜果蔬菜">种下了一些瓜果蔬菜</a></li><li><a href="../../../Personal/Blog/2022/罪恶应该被遗传么" data-for="Personal/Blog/2022/罪恶应该被遗传么">罪恶应该被遗传么?</a></li><li><a href="../../../Personal/Blog/2022/自律的痛苦······" data-for="Personal/Blog/2022/自律的痛苦······">自律的痛苦······</a></li><li><a href="../../../Personal/Blog/2022/论成年人的睡眠" data-for="Personal/Blog/2022/论成年人的睡眠">论成年人的睡眠</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」">谈谈我的「数字文具盒」</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---NextCloud" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---NextCloud">谈谈我的「数字文具盒」 - NextCloud</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---Obsidian" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---Obsidian">谈谈我的「数字文具盒」 - Obsidian</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---心得体会" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---心得体会">谈谈我的「数字文具盒」 - 心得体会</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---数字基建" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---数字基建">谈谈我的「数字文具盒」 - 数字基建</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(上)" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(上)">谈谈我的「数字文具盒」 - 生产力工具(上)</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(下)" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---生产力工具(下)">谈谈我的「数字文具盒」 - 生产力工具(下)</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---番外篇" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---番外篇">谈谈我的「数字文具盒」 - 番外篇</a></li><li><a href="../../../Personal/Blog/2022/谈谈我的「数字文具盒」---运行平台" data-for="Personal/Blog/2022/谈谈我的「数字文具盒」---运行平台">谈谈我的「数字文具盒」 - 运行平台</a></li><li><a href="../../../Personal/Blog/2022/这个周末" data-for="Personal/Blog/2022/这个周末">这个周末</a></li><li><a href="../../../Personal/Blog/2022/通货膨胀的猪" data-for="Personal/Blog/2022/通货膨胀的猪">通货膨胀的猪</a></li><li><a href="../../../Personal/Blog/2022/闭门锁网" data-for="Personal/Blog/2022/闭门锁网">闭门锁网</a></li><li><a href="../../../Personal/Blog/2022/非黑即白" data-for="Personal/Blog/2022/非黑即白">非黑即白</a></li><li><a href="../../../Personal/Blog/2022/首页加载速度优化方案" data-for="Personal/Blog/2022/首页加载速度优化方案">首页加载速度优化方案</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2023"><button class="folder-button"><span class="folder-title">2023</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2023"><li><a href="../../../Personal/Blog/2023/2023-年度微信读书报告" data-for="Personal/Blog/2023/2023-年度微信读书报告">2023 年度微信读书报告</a></li><li><a href="../../../Personal/Blog/2023/Docusaurus-搭建" data-for="Personal/Blog/2023/Docusaurus-搭建">Docusaurus 搭建</a></li><li><a href="../../../Personal/Blog/2023/Obsidian-使用-Templater-插件的个性化脚本" data-for="Personal/Blog/2023/Obsidian-使用-Templater-插件的个性化脚本">Obsidian 使用 Templater 插件的个性化脚本</a></li><li><a href="../../../Personal/Blog/2023/YubiKey-漂流记" data-for="Personal/Blog/2023/YubiKey-漂流记">YubiKey 历险记</a></li><li><a href="../../../Personal/Blog/2023/不要把幸福建立在别人的痛苦之上" data-for="Personal/Blog/2023/不要把幸福建立在别人的痛苦之上">不要把幸福建立在别人的痛苦之上</a></li><li><a href="../../../Personal/Blog/2023/为什么不推开那扇门?" data-for="Personal/Blog/2023/为什么不推开那扇门?">为什么不推开那扇门?</a></li><li><a href="../../../Personal/Blog/2023/你愿意嫁给自己么?" data-for="Personal/Blog/2023/你愿意嫁给自己么?">你愿意嫁给自己么</a></li><li><a href="../../../Personal/Blog/2023/最近半年的生活" data-for="Personal/Blog/2023/最近半年的生活">最近半年的生活</a></li><li><a href="../../../Personal/Blog/2023/写博客的正确姿势" data-for="Personal/Blog/2023/写博客的正确姿势">写博客的正确姿势</a></li><li><a href="../../../Personal/Blog/2023/唯有热爱可抵岁月漫长" data-for="Personal/Blog/2023/唯有热爱可抵岁月漫长">唯有热爱、可抵岁月漫长</a></li><li><a href="../../../Personal/Blog/2023/回首-2022-展望-2023" data-for="Personal/Blog/2023/回首-2022-展望-2023">回首 2022 展望 2023</a></li><li><a href="../../../Personal/Blog/2023/大学回忆录" data-for="Personal/Blog/2023/大学回忆录">大学回忆录</a></li><li><a href="../../../Personal/Blog/2023/如何不写错别字!" data-for="Personal/Blog/2023/如何不写错别字!">如何不写错别字!</a></li><li><a href="../../../Personal/Blog/2023/如何拍好一张照片" data-for="Personal/Blog/2023/如何拍好一张照片">如何拍好一张照片</a></li><li><a href="../../../Personal/Blog/2023/家里的三块地" data-for="Personal/Blog/2023/家里的三块地">家里的三块地</a></li><li><a href="../../../Personal/Blog/2023/岁月是把猪饲料,把我喂的嘎嘎胖" data-for="Personal/Blog/2023/岁月是把猪饲料,把我喂的嘎嘎胖">岁月是把猪饲料,把我喂的嘎嘎胖</a></li><li><a href="../../../Personal/Blog/2023/拾月游记" data-for="Personal/Blog/2023/拾月游记">拾月游记</a></li><li><a href="../../../Personal/Blog/2023/揭晓你的博客一年之最,尽在-EndOfYear!" data-for="Personal/Blog/2023/揭晓你的博客一年之最,尽在-EndOfYear!">揭晓你的博客一年之最,尽在 EndOfYear!</a></li><li><a href="../../../Personal/Blog/2023/早起、阅读、写作、运动、冥想" data-for="Personal/Blog/2023/早起、阅读、写作、运动、冥想">早起、冥想、阅读、写作、运动</a></li><li><a href="../../../Personal/Blog/2023/浅尝-Gitea-的-Actions" data-for="Personal/Blog/2023/浅尝-Gitea-的-Actions">浅尝 Gitea 的 Actions</a></li><li><a href="../../../Personal/Blog/2023/独立生活能力清单" data-for="Personal/Blog/2023/独立生活能力清单">独立生活能力清单</a></li><li><a href="../../../Personal/Blog/2023/电脑坏了,我换了-Ubuntu" data-for="Personal/Blog/2023/电脑坏了,我换了-Ubuntu">电脑坏了,我换了 Ubuntu</a></li><li><a href="../../../Personal/Blog/2023/看-V2Ex-的-ChatGPT-老哥浅谈办公室政治" data-for="Personal/Blog/2023/看-V2Ex-的-ChatGPT-老哥浅谈办公室政治">看 V2Ex 的 ChatGPT 老哥浅谈办公室政治</a></li><li><a href="../../../Personal/Blog/2023/破万卷书,行万里路!" data-for="Personal/Blog/2023/破万卷书,行万里路!">破万卷书,行万里路!</a></li><li><a href="../../../Personal/Blog/2023/谈谈我的「数字文具盒」---个人工作流" data-for="Personal/Blog/2023/谈谈我的「数字文具盒」---个人工作流">谈谈我的「数字文具盒」 - 个人工作流</a></li><li><a href="../../../Personal/Blog/2023/长安三万里" data-for="Personal/Blog/2023/长安三万里">长安三万里</a></li><li><a href="../../../Personal/Blog/2023/黄山归来不看岳" data-for="Personal/Blog/2023/黄山归来不看岳">黄山归来不看岳</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Blog/2024"><button class="folder-button"><span class="folder-title">2024</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Blog/2024"><li><a href="../../../Personal/Blog/2024/「救赎之路」更名「向阳而生」" data-for="Personal/Blog/2024/「救赎之路」更名「向阳而生」">「救赎之路」更名「向阳而生」</a></li><li><a href="../../../Personal/Blog/2024/回顾-2023" data-for="Personal/Blog/2024/回顾-2023">2023 年终总结</a></li><li><a href="../../../Personal/Blog/2024/2023-年终问答" data-for="Personal/Blog/2024/2023-年终问答">2023 年终问答</a></li><li><a href="../../../Personal/Blog/2024/CityWalk——公车挑战" data-for="Personal/Blog/2024/CityWalk——公车挑战">CityWalk——公车挑战:探索未知的城市</a></li><li><a href="../../../Personal/Blog/2024/Python-项目终极部署解决方案" data-for="Personal/Blog/2024/Python-项目终极部署解决方案">Python 项目终极部署解决方案</a></li><li><a href="../../../Personal/Blog/2024/一命二运三风水" data-for="Personal/Blog/2024/一命二运三风水">一命二运三风水</a></li><li><a href="../../../Personal/Blog/2024/乌兰哈达火山银河之旅" data-for="Personal/Blog/2024/乌兰哈达火山银河之旅">乌兰哈达火山银河之旅</a></li><li><a href="../../../Personal/Blog/2024/冰箱,让你我错过了多少新鲜的生活?" data-for="Personal/Blog/2024/冰箱,让你我错过了多少新鲜的生活?">冰箱,让你我错过了多少新鲜的生活?</a></li><li><a href="../../../Personal/Blog/2024/回读者信──240816" data-for="Personal/Blog/2024/回读者信──240816">回读者信──240816</a></li><li><a href="../../../Personal/Blog/2024/夜泊西湖听雨声" data-for="Personal/Blog/2024/夜泊西湖听雨声">夜泊西湖听雨声</a></li><li><a href="../../../Personal/Blog/2024/如何开好一场会?" data-for="Personal/Blog/2024/如何开好一场会?">如何开好一场会?</a></li><li><a href="../../../Personal/Blog/2024/如何打破信息茧房?" data-for="Personal/Blog/2024/如何打破信息茧房?">如何打破信息茧房?</a></li><li><a href="../../../Personal/Blog/2024/富人的红灯与穷人的绿灯" data-for="Personal/Blog/2024/富人的红灯与穷人的绿灯">富人的红灯与穷人的绿灯</a></li><li><a href="../../../Personal/Blog/2024/师从-ChatGPT" data-for="Personal/Blog/2024/师从-ChatGPT">师从 ChatGPT</a></li><li><a href="../../../Personal/Blog/2024/我又从-Ubunut-换成了-Fedora" data-for="Personal/Blog/2024/我又从-Ubunut-换成了-Fedora">我又从 Ubunut 换成了 Fedora</a></li><li><a href="../../../Personal/Blog/2024/我的一天" data-for="Personal/Blog/2024/我的一天">我的一天</a></li><li><a href="../../../Personal/Blog/2024/打工三年记" data-for="Personal/Blog/2024/打工三年记">打工三年记</a></li><li><a href="../../../Personal/Blog/2024/新奇的-HR-经历" data-for="Personal/Blog/2024/新奇的-HR-经历">新奇的 HR 经历</a></li><li><a href="../../../Personal/Blog/2024/穷则独善其身,达则兼济天下" data-for="Personal/Blog/2024/穷则独善其身,达则兼济天下">穷则独善其身,达则兼济天下</a></li><li><a href="../../../Personal/Blog/2024/继续开荒我那一亩三分地" data-for="Personal/Blog/2024/继续开荒我那一亩三分地">继续开荒我那一亩三分地</a></li><li><a href="../../../Personal/Blog/2024/記伍月" data-for="Personal/Blog/2024/記伍月">記伍月</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book"><button class="folder-button"><span class="folder-title">Book</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/个人成长"><button class="folder-button"><span class="folder-title">个人成长</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/个人成长"><li><a href="../../../Personal/Book/个人成长/习惯的力量(新版)" data-for="Personal/Book/个人成长/习惯的力量(新版)">习惯的力量(新版)</a></li><li><a href="../../../Personal/Book/个人成长/以极简的方式去生活" data-for="Personal/Book/个人成长/以极简的方式去生活">以极简的方式去生活</a></li><li><a href="../../../Personal/Book/个人成长/写出我心:普通人如何通过写作表达自己" data-for="Personal/Book/个人成长/写出我心:普通人如何通过写作表达自己">写出我心:普通人如何通过写作表达自己</a></li><li><a href="../../../Personal/Book/个人成长/刻意练习:如何从新手到大师" data-for="Personal/Book/个人成长/刻意练习:如何从新手到大师">刻意练习:如何从新手到大师</a></li><li><a href="../../../Personal/Book/个人成长/十分钟冥想" data-for="Personal/Book/个人成长/十分钟冥想">十分钟冥想</a></li><li><a href="../../../Personal/Book/个人成长/即兴表达" data-for="Personal/Book/个人成长/即兴表达">即兴表达</a></li><li><a href="../../../Personal/Book/个人成长/学习之道" data-for="Personal/Book/个人成长/学习之道">学习之道</a></li><li><a href="../../../Personal/Book/个人成长/学会写作:自我进阶的高效方法" data-for="Personal/Book/个人成长/学会写作:自我进阶的高效方法">学会写作:自我进阶的高效方法</a></li><li><a href="../../../Personal/Book/个人成长/底层逻辑" data-for="Personal/Book/个人成长/底层逻辑">底层逻辑</a></li><li><a href="../../../Personal/Book/个人成长/底层逻辑:看清这个世界的底牌" data-for="Personal/Book/个人成长/底层逻辑:看清这个世界的底牌">底层逻辑:看清这个世界的底牌</a></li><li><a href="../../../Personal/Book/个人成长/当下的力量(白金版)" data-for="Personal/Book/个人成长/当下的力量(白金版)">当下的力量(白金版)</a></li><li><a href="../../../Personal/Book/个人成长/我的第一本人生规划手册" data-for="Personal/Book/个人成长/我的第一本人生规划手册">我的第一本人生规划手册</a></li><li><a href="../../../Personal/Book/个人成长/超级面试官:快速提升识人技能的面试实战手册" data-for="Personal/Book/个人成长/超级面试官:快速提升识人技能的面试实战手册">超级面试官:快速提升识人技能的面试实战手册</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/医学健康"><button class="folder-button"><span class="folder-title">医学健康</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/医学健康"><li><a href="../../../Personal/Book/医学健康/你是你吃出来的(套装共2册)" data-for="Personal/Book/医学健康/你是你吃出来的(套装共2册)">你是你吃出来的(套装共2册)</a></li><li><a href="../../../Personal/Book/医学健康/小小药箱护健康教您用好家庭小药箱" data-for="Personal/Book/医学健康/小小药箱护健康教您用好家庭小药箱">小小药箱护健康教您用好家庭小药箱</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/历史"><button class="folder-button"><span class="folder-title">历史</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/历史"><li><a href="../../../Personal/Book/历史/信息简史" data-for="Personal/Book/历史/信息简史">信息简史</a></li><li><a href="../../../Personal/Book/历史/这里是中国2" data-for="Personal/Book/历史/这里是中国2">这里是中国2</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/哲学宗教"><button class="folder-button"><span class="folder-title">哲学宗教</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/哲学宗教"><li><a href="../../../Personal/Book/哲学宗教/半小时漫画中国哲学史(套装全2册)" data-for="Personal/Book/哲学宗教/半小时漫画中国哲学史(套装全2册)">半小时漫画中国哲学史(套装全2册)</a></li><li><a href="../../../Personal/Book/哲学宗教/第一性原理" data-for="Personal/Book/哲学宗教/第一性原理">第一性原理</a></li><li><a href="../../../Personal/Book/哲学宗教/结构化思维" data-for="Personal/Book/哲学宗教/结构化思维">结构化思维</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/心理"><button class="folder-button"><span class="folder-title">心理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/心理"><li><a href="../../../Personal/Book/心理/乌合之众(果麦经典)" data-for="Personal/Book/心理/乌合之众(果麦经典)">乌合之众(果麦经典)</a></li><li><a href="../../../Personal/Book/心理/十分钟冥想" data-for="Personal/Book/心理/十分钟冥想">十分钟冥想</a></li><li><a href="../../../Personal/Book/心理/认知觉醒:开启自我改变的原动力" data-for="Personal/Book/心理/认知觉醒:开启自我改变的原动力">认知觉醒:开启自我改变的原动力</a></li><li><a href="../../../Personal/Book/心理/认知驱动:做成一件对他人很有用的事" data-for="Personal/Book/心理/认知驱动:做成一件对他人很有用的事">认知驱动:做成一件对他人很有用的事</a></li><li><a href="../../../Personal/Book/心理/谈性说爱:写给女性的性心理24讲" data-for="Personal/Book/心理/谈性说爱:写给女性的性心理24讲">谈性说爱:写给女性的性心理24讲</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/政治军事"><button class="folder-button"><span class="folder-title">政治军事</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/政治军事"><li><a href="../../../Personal/Book/政治军事/实践论" data-for="Personal/Book/政治军事/实践论">实践论</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/教育学习"><button class="folder-button"><span class="folder-title">教育学习</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/教育学习"><li><a href="../../../Personal/Book/教育学习/如何阅读一本书" data-for="Personal/Book/教育学习/如何阅读一本书">如何阅读一本书</a></li><li><a href="../../../Personal/Book/教育学习/赖世雄的英语学习法" data-for="Personal/Book/教育学习/赖世雄的英语学习法">赖世雄的英语学习法</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/文学"><button class="folder-button"><span class="folder-title">文学</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/文学"><li><a href="../../../Personal/Book/文学/凤凰项目:一个IT运维的传奇故事(修订版)" data-for="Personal/Book/文学/凤凰项目:一个IT运维的传奇故事(修订版)">凤凰项目:一个IT运维的传奇故事(修订版)</a></li><li><a href="../../../Personal/Book/文学/老舍谈写作" data-for="Personal/Book/文学/老舍谈写作">老舍谈写作</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/生活百科"><button class="folder-button"><span class="folder-title">生活百科</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/生活百科"><li><a href="../../../Personal/Book/生活百科/聂卫平围棋教程(从15级到10级)" data-for="Personal/Book/生活百科/聂卫平围棋教程(从15级到10级)">聂卫平围棋教程(从15级到10级)</a></li><li><a href="../../../Personal/Book/生活百科/聂卫平围棋教程(从入门到15级)" data-for="Personal/Book/生活百科/聂卫平围棋教程(从入门到15级)">聂卫平围棋教程(从入门到15级)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/社会文化"><button class="folder-button"><span class="folder-title">社会文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/社会文化"><li><a href="../../../Personal/Book/社会文化/人体简史" data-for="Personal/Book/社会文化/人体简史">人体简史</a></li><li><a href="../../../Personal/Book/社会文化/你不可不知的法律常识" data-for="Personal/Book/社会文化/你不可不知的法律常识">你不可不知的法律常识</a></li><li><a href="../../../Personal/Book/社会文化/半小时漫画《论语》" data-for="Personal/Book/社会文化/半小时漫画《论语》">半小时漫画《论语》</a></li><li><a href="../../../Personal/Book/社会文化/民法典与百姓生活100问" data-for="Personal/Book/社会文化/民法典与百姓生活100问">民法典与百姓生活100问</a></li><li><a href="../../../Personal/Book/社会文化/这里是中国" data-for="Personal/Book/社会文化/这里是中国">这里是中国</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/科学技术"><button class="folder-button"><span class="folder-title">科学技术</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/科学技术"><li><a href="../../../Personal/Book/科学技术/贝尔实验室与美国革新大时代" data-for="Personal/Book/科学技术/贝尔实验室与美国革新大时代">贝尔实验室与美国革新大时代</a></li><li><a href="../../../Personal/Book/科学技术/高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例" data-for="Personal/Book/科学技术/高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例">高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/经济理财"><button class="folder-button"><span class="folder-title">经济理财</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/经济理财"><li><a href="../../../Personal/Book/经济理财/人力资源管理从入门到精通" data-for="Personal/Book/经济理财/人力资源管理从入门到精通">人力资源管理从入门到精通</a></li><li><a href="../../../Personal/Book/经济理财/十分钟冥想" data-for="Personal/Book/经济理财/十分钟冥想">十分钟冥想</a></li><li><a href="../../../Personal/Book/经济理财/半小时漫画股票实战法" data-for="Personal/Book/经济理财/半小时漫画股票实战法">半小时漫画股票实战法</a></li><li><a href="../../../Personal/Book/经济理财/小米创业思考" data-for="Personal/Book/经济理财/小米创业思考">小米创业思考</a></li><li><a href="../../../Personal/Book/经济理财/底层逻辑:半秒钟看透问题本质" data-for="Personal/Book/经济理财/底层逻辑:半秒钟看透问题本质">底层逻辑:半秒钟看透问题本质</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/艺术"><button class="folder-button"><span class="folder-title">艺术</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/艺术"><li><a href="../../../Personal/Book/艺术/江湖丛谈(注音注释插图本)" data-for="Personal/Book/艺术/江湖丛谈(注音注释插图本)">江湖丛谈(注音注释插图本)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Book/计算机"><button class="folder-button"><span class="folder-title">计算机</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Book/计算机"><li><a href="../../../Personal/Book/计算机/Flask-Web开发:基于Python的Web应用开发实战(第2版)" data-for="Personal/Book/计算机/Flask-Web开发:基于Python的Web应用开发实战(第2版)">Flask Web开发:基于Python的Web应用开发实战(第2版)</a></li><li><a href="../../../Personal/Book/计算机/IT基础架构:系统运维实践" data-for="Personal/Book/计算机/IT基础架构:系统运维实践">IT基础架构:系统运维实践</a></li><li><a href="../../../Personal/Book/计算机/Linux命令行与shell脚本编程大全(第4版)" data-for="Personal/Book/计算机/Linux命令行与shell脚本编程大全(第4版)">Linux命令行与shell脚本编程大全(第4版)</a></li><li><a href="../../../Personal/Book/计算机/Linux是怎样工作的" data-for="Personal/Book/计算机/Linux是怎样工作的">Linux是怎样工作的</a></li><li><a href="../../../Personal/Book/计算机/Python工匠:案例、技巧与工程实践" data-for="Personal/Book/计算机/Python工匠:案例、技巧与工程实践">Python工匠:案例、技巧与工程实践</a></li><li><a href="../../../Personal/Book/计算机/Python编程:从入门到实践(第2版)" data-for="Personal/Book/计算机/Python编程:从入门到实践(第2版)">Python编程:从入门到实践(第2版)</a></li><li><a href="../../../Personal/Book/计算机/Python编程轻松进阶" data-for="Personal/Book/计算机/Python编程轻松进阶">Python编程轻松进阶</a></li><li><a href="../../../Personal/Book/计算机/SQL必知必会(第5版)" data-for="Personal/Book/计算机/SQL必知必会(第5版)">SQL必知必会(第5版)</a></li><li><a href="../../../Personal/Book/计算机/SRE:Google运维解密" data-for="Personal/Book/计算机/SRE:Google运维解密">SRE:Google运维解密</a></li><li><a href="../../../Personal/Book/计算机/UNIX传奇:历史与回忆" data-for="Personal/Book/计算机/UNIX传奇:历史与回忆">UNIX传奇:历史与回忆</a></li><li><a href="../../../Personal/Book/计算机/VMware-vSphere-7.0云平台运维与管理(第2版)" data-for="Personal/Book/计算机/VMware-vSphere-7.0云平台运维与管理(第2版)">VMware vSphere 7.0云平台运维与管理(第2版)</a></li><li><a href="../../../Personal/Book/计算机/人人都懂设计模式:从生活中领悟设计模式(Python实现)" data-for="Personal/Book/计算机/人人都懂设计模式:从生活中领悟设计模式(Python实现)">人人都懂设计模式:从生活中领悟设计模式(Python实现)</a></li><li><a href="../../../Personal/Book/计算机/从0到1:HTML+CSS快速上手" data-for="Personal/Book/计算机/从0到1:HTML+CSS快速上手">从0到1:HTML+CSS快速上手</a></li><li><a href="../../../Personal/Book/计算机/从0到1:HTML5+CSS3修炼之道" data-for="Personal/Book/计算机/从0到1:HTML5+CSS3修炼之道">从0到1:HTML5+CSS3修炼之道</a></li><li><a href="../../../Personal/Book/计算机/从0到1:JavaScript-快速上手" data-for="Personal/Book/计算机/从0到1:JavaScript-快速上手">从0到1:JavaScript 快速上手</a></li><li><a href="../../../Personal/Book/计算机/从0到1:jQuery快速上手" data-for="Personal/Book/计算机/从0到1:jQuery快速上手">从0到1:jQuery快速上手</a></li><li><a href="../../../Personal/Book/计算机/明解Python" data-for="Personal/Book/计算机/明解Python">明解Python</a></li><li><a href="../../../Personal/Book/计算机/每天5分钟玩转Docker容器技术" data-for="Personal/Book/计算机/每天5分钟玩转Docker容器技术">每天5分钟玩转Docker容器技术</a></li><li><a href="../../../Personal/Book/计算机/流畅的Python" data-for="Personal/Book/计算机/流畅的Python">流畅的Python</a></li><li><a href="../../../Personal/Book/计算机/硅谷之火:个人计算机的诞生与衰落(第3版)" data-for="Personal/Book/计算机/硅谷之火:个人计算机的诞生与衰落(第3版)">硅谷之火:个人计算机的诞生与衰落(第3版)</a></li><li><a href="../../../Personal/Book/计算机/秒懂设计模式" data-for="Personal/Book/计算机/秒懂设计模式">秒懂设计模式</a></li><li><a href="../../../Personal/Book/计算机/程序员的README" data-for="Personal/Book/计算机/程序员的README">程序员的README</a></li><li><a href="../../../Personal/Book/计算机/精通Python设计模式(第2版)" data-for="Personal/Book/计算机/精通Python设计模式(第2版)">精通Python设计模式(第2版)</a></li><li><a href="../../../Personal/Book/计算机/网络安全等级保护2.0:定级、测评、实施与运维" data-for="Personal/Book/计算机/网络安全等级保护2.0:定级、测评、实施与运维">网络安全等级保护2.0:定级、测评、实施与运维</a></li><li><a href="../../../Personal/Book/计算机/网络工程师红宝书:思科华为华三实战案例荟萃" data-for="Personal/Book/计算机/网络工程师红宝书:思科华为华三实战案例荟萃">网络工程师红宝书:思科华为华三实战案例荟萃</a></li><li><a href="../../../Personal/Book/计算机/网络是怎样连接的" data-for="Personal/Book/计算机/网络是怎样连接的">网络是怎样连接的</a></li><li><a href="../../../Personal/Book/计算机/网络运维亲历记-(网络运维纪实文学)" data-for="Personal/Book/计算机/网络运维亲历记-(网络运维纪实文学)">网络运维亲历记 (网络运维纪实文学)</a></li><li><a href="../../../Personal/Book/计算机/虚拟化工程师运维实战:VMware服务器虚拟化+Citrix桌面应用虚拟化+Veeam备份+Zabbix监控" data-for="Personal/Book/计算机/虚拟化工程师运维实战:VMware服务器虚拟化+Citrix桌面应用虚拟化+Veeam备份+Zabbix监控">虚拟化工程师运维实战:VMware服务器虚拟化+Citrix桌面/应用虚拟化+Veeam备份+Zabbix监控</a></li><li><a href="../../../Personal/Book/计算机/计算机:一部历史" data-for="Personal/Book/计算机/计算机:一部历史">计算机:一部历史</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal"><button class="folder-button"><span class="folder-title">Journal</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022"><button class="folder-button"><span class="folder-title">2022</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W34"><button class="folder-button"><span class="folder-title">W34</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W34"><li><a href="../../../Personal/Journal/2022/W34/2022-08-24" data-for="Personal/Journal/2022/W34/2022-08-24">2022-08-24</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-25" data-for="Personal/Journal/2022/W34/2022-08-25">2022-08-25</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-26" data-for="Personal/Journal/2022/W34/2022-08-26">2022-08-26</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-27" data-for="Personal/Journal/2022/W34/2022-08-27">2022-08-27</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-08-28" data-for="Personal/Journal/2022/W34/2022-08-28">2022-08-28</a></li><li><a href="../../../Personal/Journal/2022/W34/2022-W34" data-for="Personal/Journal/2022/W34/2022-W34">2022-W34</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W35"><button class="folder-button"><span class="folder-title">W35</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W35"><li><a href="../../../Personal/Journal/2022/W35/2022-08-29" data-for="Personal/Journal/2022/W35/2022-08-29">2022-08-29</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-08-30" data-for="Personal/Journal/2022/W35/2022-08-30">2022-08-30</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-08-31" data-for="Personal/Journal/2022/W35/2022-08-31">2022-08-31</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-09-01" data-for="Personal/Journal/2022/W35/2022-09-01">2022-09-01</a></li><li><a href="../../../Personal/Journal/2022/W35/2022-W35" data-for="Personal/Journal/2022/W35/2022-W35">2022-W35</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W36"><button class="folder-button"><span class="folder-title">W36</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W36"><li><a href="../../../Personal/Journal/2022/W36/2022-09-05" data-for="Personal/Journal/2022/W36/2022-09-05">2022-09-05</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-09-06" data-for="Personal/Journal/2022/W36/2022-09-06">2022-09-06</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-09-07" data-for="Personal/Journal/2022/W36/2022-09-07">2022-09-07</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-09-08" data-for="Personal/Journal/2022/W36/2022-09-08">2022-09-08</a></li><li><a href="../../../Personal/Journal/2022/W36/2022-W36" data-for="Personal/Journal/2022/W36/2022-W36">2022-W36</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W37"><button class="folder-button"><span class="folder-title">W37</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W37"><li><a href="../../../Personal/Journal/2022/W37/2022-09-12" data-for="Personal/Journal/2022/W37/2022-09-12">2022-09-12</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-13" data-for="Personal/Journal/2022/W37/2022-09-13">2022-09-13</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-14" data-for="Personal/Journal/2022/W37/2022-09-14">2022-09-14</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-15" data-for="Personal/Journal/2022/W37/2022-09-15">2022-09-15</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-16" data-for="Personal/Journal/2022/W37/2022-09-16">2022-09-16</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-17" data-for="Personal/Journal/2022/W37/2022-09-17">2022-09-17</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-09-18" data-for="Personal/Journal/2022/W37/2022-09-18">2022-09-18</a></li><li><a href="../../../Personal/Journal/2022/W37/2022-W37" data-for="Personal/Journal/2022/W37/2022-W37">2022-W37</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W38"><button class="folder-button"><span class="folder-title">W38</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W38"><li><a href="../../../Personal/Journal/2022/W38/2022-09-19" data-for="Personal/Journal/2022/W38/2022-09-19">2022-09-19</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-09-20" data-for="Personal/Journal/2022/W38/2022-09-20">2022-09-20</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-09-21" data-for="Personal/Journal/2022/W38/2022-09-21">2022-09-21</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-09-22" data-for="Personal/Journal/2022/W38/2022-09-22">2022-09-22</a></li><li><a href="../../../Personal/Journal/2022/W38/2022-W38" data-for="Personal/Journal/2022/W38/2022-W38">2022-W38</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W39"><button class="folder-button"><span class="folder-title">W39</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W39"><li><a href="../../../Personal/Journal/2022/W39/2022-09-28" data-for="Personal/Journal/2022/W39/2022-09-28">2022-09-28</a></li><li><a href="../../../Personal/Journal/2022/W39/2022-09-29" data-for="Personal/Journal/2022/W39/2022-09-29">2022-09-29</a></li><li><a href="../../../Personal/Journal/2022/W39/2022-W39" data-for="Personal/Journal/2022/W39/2022-W39">2022-W39</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W41"><button class="folder-button"><span class="folder-title">W41</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W41"><li><a href="../../../Personal/Journal/2022/W41/2022-10-10" data-for="Personal/Journal/2022/W41/2022-10-10">2022-10-10</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-11" data-for="Personal/Journal/2022/W41/2022-10-11">2022-10-11</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-12" data-for="Personal/Journal/2022/W41/2022-10-12">2022-10-12</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-13" data-for="Personal/Journal/2022/W41/2022-10-13">2022-10-13</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-14" data-for="Personal/Journal/2022/W41/2022-10-14">2022-10-14</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-10-16" data-for="Personal/Journal/2022/W41/2022-10-16">2022-10-16</a></li><li><a href="../../../Personal/Journal/2022/W41/2022-W41" data-for="Personal/Journal/2022/W41/2022-W41">2022-W41</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W42"><button class="folder-button"><span class="folder-title">W42</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W42"><li><a href="../../../Personal/Journal/2022/W42/2022-10-17" data-for="Personal/Journal/2022/W42/2022-10-17">2022-10-17</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-10-18" data-for="Personal/Journal/2022/W42/2022-10-18">2022-10-18</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-10-19" data-for="Personal/Journal/2022/W42/2022-10-19">2022-10-19</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-10-21" data-for="Personal/Journal/2022/W42/2022-10-21">2022-10-21</a></li><li><a href="../../../Personal/Journal/2022/W42/2022-W42" data-for="Personal/Journal/2022/W42/2022-W42">2022-W42</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W43"><button class="folder-button"><span class="folder-title">W43</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W43"><li><a href="../../../Personal/Journal/2022/W43/2022-10-24" data-for="Personal/Journal/2022/W43/2022-10-24">2022-10-24</a></li><li><a href="../../../Personal/Journal/2022/W43/2022-10-26" data-for="Personal/Journal/2022/W43/2022-10-26">2022-10-26</a></li><li><a href="../../../Personal/Journal/2022/W43/2022-W43" data-for="Personal/Journal/2022/W43/2022-W43">2022-W43</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W44"><button class="folder-button"><span class="folder-title">W44</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W44"><li><a href="../../../Personal/Journal/2022/W44/2022-11-02" data-for="Personal/Journal/2022/W44/2022-11-02">2022-11-02</a></li><li><a href="../../../Personal/Journal/2022/W44/2022-W44" data-for="Personal/Journal/2022/W44/2022-W44">2022-W44</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W45"><button class="folder-button"><span class="folder-title">W45</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W45"><li><a href="../../../Personal/Journal/2022/W45/2022-11-10" data-for="Personal/Journal/2022/W45/2022-11-10">2022-11-10</a></li><li><a href="../../../Personal/Journal/2022/W45/2022-11-11" data-for="Personal/Journal/2022/W45/2022-11-11">2022-11-11</a></li><li><a href="../../../Personal/Journal/2022/W45/2022-11-12" data-for="Personal/Journal/2022/W45/2022-11-12">2022-11-12</a></li><li><a href="../../../Personal/Journal/2022/W45/2022-11-13" data-for="Personal/Journal/2022/W45/2022-11-13">2022-11-13</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W46"><button class="folder-button"><span class="folder-title">W46</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W46"><li><a href="../../../Personal/Journal/2022/W46/2022-11-18" data-for="Personal/Journal/2022/W46/2022-11-18">2022-11-18</a></li><li><a href="../../../Personal/Journal/2022/W46/2022-11-20" data-for="Personal/Journal/2022/W46/2022-11-20">2022-11-20</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W47"><button class="folder-button"><span class="folder-title">W47</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W47"><li><a href="../../../Personal/Journal/2022/W47/2022-11-21" data-for="Personal/Journal/2022/W47/2022-11-21">2022-11-21</a></li><li><a href="../../../Personal/Journal/2022/W47/2022-11-22" data-for="Personal/Journal/2022/W47/2022-11-22">2022-11-22</a></li><li><a href="../../../Personal/Journal/2022/W47/2022-W47" data-for="Personal/Journal/2022/W47/2022-W47">2022-W47</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W48"><button class="folder-button"><span class="folder-title">W48</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W48"><li><a href="../../../Personal/Journal/2022/W48/2022-11-28" data-for="Personal/Journal/2022/W48/2022-11-28">2022-11-28</a></li><li><a href="../../../Personal/Journal/2022/W48/2022-11-29" data-for="Personal/Journal/2022/W48/2022-11-29">2022-11-29</a></li><li><a href="../../../Personal/Journal/2022/W48/2022-12-01" data-for="Personal/Journal/2022/W48/2022-12-01">2022-12-01</a></li><li><a href="../../../Personal/Journal/2022/W48/2022-12-04" data-for="Personal/Journal/2022/W48/2022-12-04">2022-12-04</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W49"><button class="folder-button"><span class="folder-title">W49</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W49"><li><a href="../../../Personal/Journal/2022/W49/2022-12-06" data-for="Personal/Journal/2022/W49/2022-12-06">2022-12-06</a></li><li><a href="../../../Personal/Journal/2022/W49/2022-W49" data-for="Personal/Journal/2022/W49/2022-W49">2022-W49</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2022/W50"><button class="folder-button"><span class="folder-title">W50</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2022/W50"><li><a href="../../../Personal/Journal/2022/W50/2022-12-12" data-for="Personal/Journal/2022/W50/2022-12-12">2022-12-12</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023"><button class="folder-button"><span class="folder-title">2023</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W2"><button class="folder-button"><span class="folder-title">W2</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W2"><li><a href="../../../Personal/Journal/2023/W2/2023-W2" data-for="Personal/Journal/2023/W2/2023-W2">2023-W2</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W3"><button class="folder-button"><span class="folder-title">W3</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W3"><li><a href="../../../Personal/Journal/2023/W3/2023-01-16" data-for="Personal/Journal/2023/W3/2023-01-16">2023-01-16</a></li><li><a href="../../../Personal/Journal/2023/W3/2023-01-18" data-for="Personal/Journal/2023/W3/2023-01-18">2023-01-18</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W5"><button class="folder-button"><span class="folder-title">W5</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W5"><li><a href="../../../Personal/Journal/2023/W5/2023-W5" data-for="Personal/Journal/2023/W5/2023-W5">2023-W5</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W6"><button class="folder-button"><span class="folder-title">W6</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W6"><li><a href="../../../Personal/Journal/2023/W6/2023-W6" data-for="Personal/Journal/2023/W6/2023-W6">2023-W6</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W7"><button class="folder-button"><span class="folder-title">W7</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W7"><li><a href="../../../Personal/Journal/2023/W7/2023-02-14" data-for="Personal/Journal/2023/W7/2023-02-14">2023-02-14</a></li><li><a href="../../../Personal/Journal/2023/W7/2023-02-15" data-for="Personal/Journal/2023/W7/2023-02-15">2023-02-15</a></li><li><a href="../../../Personal/Journal/2023/W7/2023-02-16" data-for="Personal/Journal/2023/W7/2023-02-16">2023-02-16</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W8"><button class="folder-button"><span class="folder-title">W8</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W8"><li><a href="../../../Personal/Journal/2023/W8/2023-02-20" data-for="Personal/Journal/2023/W8/2023-02-20">2023-02-20</a></li><li><a href="../../../Personal/Journal/2023/W8/2023-02-22" data-for="Personal/Journal/2023/W8/2023-02-22">2023-02-22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W10"><button class="folder-button"><span class="folder-title">W10</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W10"><li><a href="../../../Personal/Journal/2023/W10/2023-W10" data-for="Personal/Journal/2023/W10/2023-W10">2023-W10</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W12"><button class="folder-button"><span class="folder-title">W12</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W12"><li><a href="../../../Personal/Journal/2023/W12/2023-03-20" data-for="Personal/Journal/2023/W12/2023-03-20">2023-03-20</a></li><li><a href="../../../Personal/Journal/2023/W12/2023-03-21" data-for="Personal/Journal/2023/W12/2023-03-21">2023-03-21</a></li><li><a href="../../../Personal/Journal/2023/W12/2023-W12" data-for="Personal/Journal/2023/W12/2023-W12">2023-W12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W14"><button class="folder-button"><span class="folder-title">W14</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W14"><li><a href="../../../Personal/Journal/2023/W14/2023-04-08" data-for="Personal/Journal/2023/W14/2023-04-08">2023-04-08</a></li><li><a href="../../../Personal/Journal/2023/W14/2023-W14" data-for="Personal/Journal/2023/W14/2023-W14">2023-W14</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W16"><button class="folder-button"><span class="folder-title">W16</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W16"><li><a href="../../../Personal/Journal/2023/W16/2023-04-21" data-for="Personal/Journal/2023/W16/2023-04-21">2023-04-21</a></li><li><a href="../../../Personal/Journal/2023/W16/2023-04-23" data-for="Personal/Journal/2023/W16/2023-04-23">2023-04-23</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W22"><button class="folder-button"><span class="folder-title">W22</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W22"><li><a href="../../../Personal/Journal/2023/W22/2023-05-31" data-for="Personal/Journal/2023/W22/2023-05-31">2023-05-31</a></li><li><a href="../../../Personal/Journal/2023/W22/2023-06-01" data-for="Personal/Journal/2023/W22/2023-06-01">2023-06-01</a></li><li><a href="../../../Personal/Journal/2023/W22/2023-W22" data-for="Personal/Journal/2023/W22/2023-W22">2023-W22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W23"><button class="folder-button"><span class="folder-title">W23</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W23"><li><a href="../../../Personal/Journal/2023/W23/2023-06-05" data-for="Personal/Journal/2023/W23/2023-06-05">2023-06-05</a></li><li><a href="../../../Personal/Journal/2023/W23/2023-06-08" data-for="Personal/Journal/2023/W23/2023-06-08">2023-06-08</a></li><li><a href="../../../Personal/Journal/2023/W23/2023-W23" data-for="Personal/Journal/2023/W23/2023-W23">2023-W23</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W24"><button class="folder-button"><span class="folder-title">W24</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W24"><li><a href="../../../Personal/Journal/2023/W24/2023-06-12" data-for="Personal/Journal/2023/W24/2023-06-12">2023-06-12</a></li><li><a href="../../../Personal/Journal/2023/W24/2023-06-13" data-for="Personal/Journal/2023/W24/2023-06-13">2023-06-13</a></li><li><a href="../../../Personal/Journal/2023/W24/2023-06-15" data-for="Personal/Journal/2023/W24/2023-06-15">2023-06-15</a></li><li><a href="../../../Personal/Journal/2023/W24/2023-W24" data-for="Personal/Journal/2023/W24/2023-W24">2023-W24</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W25"><button class="folder-button"><span class="folder-title">W25</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W25"><li><a href="../../../Personal/Journal/2023/W25/2023-W25" data-for="Personal/Journal/2023/W25/2023-W25">2023-W25</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W26"><button class="folder-button"><span class="folder-title">W26</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W26"><li><a href="../../../Personal/Journal/2023/W26/2023-06-26" data-for="Personal/Journal/2023/W26/2023-06-26">2023-06-26</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W31"><button class="folder-button"><span class="folder-title">W31</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W31"><li><a href="../../../Personal/Journal/2023/W31/2023-W31" data-for="Personal/Journal/2023/W31/2023-W31">2023-W31</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W32"><button class="folder-button"><span class="folder-title">W32</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W32"><li><a href="../../../Personal/Journal/2023/W32/2023-08-07" data-for="Personal/Journal/2023/W32/2023-08-07">2023-08-07</a></li><li><a href="../../../Personal/Journal/2023/W32/2023-08-08" data-for="Personal/Journal/2023/W32/2023-08-08">2023-08-08</a></li><li><a href="../../../Personal/Journal/2023/W32/2023-W32" data-for="Personal/Journal/2023/W32/2023-W32">2023-W32</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W33"><button class="folder-button"><span class="folder-title">W33</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W33"><li><a href="../../../Personal/Journal/2023/W33/2023-W33" data-for="Personal/Journal/2023/W33/2023-W33">2023-W33</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W35"><button class="folder-button"><span class="folder-title">W35</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W35"><li><a href="../../../Personal/Journal/2023/W35/2023-W35" data-for="Personal/Journal/2023/W35/2023-W35">2023-W35</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W36"><button class="folder-button"><span class="folder-title">W36</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W36"><li><a href="../../../Personal/Journal/2023/W36/2023-W36" data-for="Personal/Journal/2023/W36/2023-W36">2023-W36</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W37"><button class="folder-button"><span class="folder-title">W37</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W37"><li><a href="../../../Personal/Journal/2023/W37/2023-W37" data-for="Personal/Journal/2023/W37/2023-W37">2023-W37</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W40"><button class="folder-button"><span class="folder-title">W40</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W40"><li><a href="../../../Personal/Journal/2023/W40/2023-W40" data-for="Personal/Journal/2023/W40/2023-W40">2023-W40</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W45"><button class="folder-button"><span class="folder-title">W45</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W45"><li><a href="../../../Personal/Journal/2023/W45/2023-11-12" data-for="Personal/Journal/2023/W45/2023-11-12">2023-11-12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W46"><button class="folder-button"><span class="folder-title">W46</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W46"><li><a href="../../../Personal/Journal/2023/W46/2023-11-15" data-for="Personal/Journal/2023/W46/2023-11-15">2023-11-15</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W48"><button class="folder-button"><span class="folder-title">W48</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W48"><li><a href="../../../Personal/Journal/2023/W48/2023-W48" data-for="Personal/Journal/2023/W48/2023-W48">2023-W48</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W49"><button class="folder-button"><span class="folder-title">W49</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W49"><li><a href="../../../Personal/Journal/2023/W49/2023-12-07" data-for="Personal/Journal/2023/W49/2023-12-07">2023-12-07</a></li><li><a href="../../../Personal/Journal/2023/W49/2023-W49" data-for="Personal/Journal/2023/W49/2023-W49">2023-W49</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2023/W50"><button class="folder-button"><span class="folder-title">W50</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2023/W50"><li><a href="../../../Personal/Journal/2023/W50/2023-12-12" data-for="Personal/Journal/2023/W50/2023-12-12">2023-12-12</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024"><button class="folder-button"><span class="folder-title">2024</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W8"><button class="folder-button"><span class="folder-title">W8</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W8"><li><a href="../../../Personal/Journal/2024/W8/2024-02-22" data-for="Personal/Journal/2024/W8/2024-02-22">2024-02-22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W10"><button class="folder-button"><span class="folder-title">W10</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W10"><li><a href="../../../Personal/Journal/2024/W10/2024-03-05" data-for="Personal/Journal/2024/W10/2024-03-05">2024-03-05</a></li><li><a href="../../../Personal/Journal/2024/W10/2024-03-06" data-for="Personal/Journal/2024/W10/2024-03-06">2024-03-06</a></li><li><a href="../../../Personal/Journal/2024/W10/2024-03-07" data-for="Personal/Journal/2024/W10/2024-03-07">2024-03-07</a></li><li><a href="../../../Personal/Journal/2024/W10/2024-W10" data-for="Personal/Journal/2024/W10/2024-W10">2024-W10</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W11"><button class="folder-button"><span class="folder-title">W11</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W11"><li><a href="../../../Personal/Journal/2024/W11/2024-03-11" data-for="Personal/Journal/2024/W11/2024-03-11">2024-03-11</a></li><li><a href="../../../Personal/Journal/2024/W11/2024-03-12" data-for="Personal/Journal/2024/W11/2024-03-12">2024-03-12</a></li><li><a href="../../../Personal/Journal/2024/W11/2024-03-13" data-for="Personal/Journal/2024/W11/2024-03-13">2024-03-13</a></li><li><a href="../../../Personal/Journal/2024/W11/2024-W11" data-for="Personal/Journal/2024/W11/2024-W11">2024-W11</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W12"><button class="folder-button"><span class="folder-title">W12</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W12"><li><a href="../../../Personal/Journal/2024/W12/2024-03-20" data-for="Personal/Journal/2024/W12/2024-03-20">2024-03-20</a></li><li><a href="../../../Personal/Journal/2024/W12/2024-W12" data-for="Personal/Journal/2024/W12/2024-W12">2024-W12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W14"><button class="folder-button"><span class="folder-title">W14</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W14"><li><a href="../../../Personal/Journal/2024/W14/2024-W14" data-for="Personal/Journal/2024/W14/2024-W14">2024-W14</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W16"><button class="folder-button"><span class="folder-title">W16</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W16"><li><a href="../../../Personal/Journal/2024/W16/2024-W16" data-for="Personal/Journal/2024/W16/2024-W16">2024-W16</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W17"><button class="folder-button"><span class="folder-title">W17</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W17"><li><a href="../../../Personal/Journal/2024/W17/2024-04-24" data-for="Personal/Journal/2024/W17/2024-04-24">2024-04-24</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W22"><button class="folder-button"><span class="folder-title">W22</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W22"><li><a href="../../../Personal/Journal/2024/W22/2024-06-02" data-for="Personal/Journal/2024/W22/2024-06-02">2024-06-02</a></li><li><a href="../../../Personal/Journal/2024/W22/2024-W22" data-for="Personal/Journal/2024/W22/2024-W22">2024-W22</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W23"><button class="folder-button"><span class="folder-title">W23</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W23"><li><a href="../../../Personal/Journal/2024/W23/2024-06-03" data-for="Personal/Journal/2024/W23/2024-06-03">2024-06-03</a></li><li><a href="../../../Personal/Journal/2024/W23/2024-06-04" data-for="Personal/Journal/2024/W23/2024-06-04">2024-06-04</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W24"><button class="folder-button"><span class="folder-title">W24</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W24"><li><a href="../../../Personal/Journal/2024/W24/2024-06-12" data-for="Personal/Journal/2024/W24/2024-06-12">2024-06-12</a></li><li><a href="../../../Personal/Journal/2024/W24/2024-W24" data-for="Personal/Journal/2024/W24/2024-W24">2024-W24</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W29"><button class="folder-button"><span class="folder-title">W29</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W29"><li><a href="../../../Personal/Journal/2024/W29/2024-W29" data-for="Personal/Journal/2024/W29/2024-W29">2024-W29</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W30"><button class="folder-button"><span class="folder-title">W30</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W30"><li><a href="../../../Personal/Journal/2024/W30/2024-07-22" data-for="Personal/Journal/2024/W30/2024-07-22">2024-07-22</a></li><li><a href="../../../Personal/Journal/2024/W30/2024-07-25" data-for="Personal/Journal/2024/W30/2024-07-25">2024-07-25</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W33"><button class="folder-button"><span class="folder-title">W33</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W33"><li><a href="../../../Personal/Journal/2024/W33/2024-08-12" data-for="Personal/Journal/2024/W33/2024-08-12">2024-08-12</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Personal/Journal/2024/W35"><button class="folder-button"><span class="folder-title">W35</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Personal/Journal/2024/W35"><li><a href="../../../Personal/Journal/2024/W35/2024-08-31" data-for="Personal/Journal/2024/W35/2024-08-31">2024-08-31</a></li></ul></div></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional"><button class="folder-button"><span class="folder-title">Professional</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Company"><button class="folder-button"><span class="folder-title">Company</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Company"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Company/数字化"><button class="folder-button"><span class="folder-title">数字化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Company/数字化"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Company/数字化/规范"><button class="folder-button"><span class="folder-title">规范</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Company/数字化/规范"><li><a href="../../../Professional/Company/数字化/规范/企业计算机命名规范" data-for="Professional/Company/数字化/规范/企业计算机命名规范">企业计算机命名规范</a></li><li><a href="../../../Professional/Company/数字化/规范/企业域名分配规范" data-for="Professional/Company/数字化/规范/企业域名分配规范">域名分配规范</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work"><button class="folder-button"><span class="folder-title">Work</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/data-engineer"><button class="folder-button"><span class="folder-title">data-engineer</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/data-engineer"><li><a href="../../../Professional/Work/data-engineer/home" data-for="Professional/Work/data-engineer/home">数据工程师(data-engineer)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack"><button class="folder-button"><span class="folder-title">full-stack</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack/基础"><li><a href="../../../Professional/Work/full-stack/基础/CSS" data-for="Professional/Work/full-stack/基础/CSS">CSS</a></li><li><a href="../../../Professional/Work/full-stack/基础/HTML" data-for="Professional/Work/full-stack/基础/HTML">HTML</a></li><li><a href="../../../Professional/Work/full-stack/基础/JavaScript" data-for="Professional/Work/full-stack/基础/JavaScript">JavaScript</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack/工具"><button class="folder-button"><span class="folder-title">工具</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack/工具"><li><a href="../../../Professional/Work/full-stack/工具/PM2-工具" data-for="Professional/Work/full-stack/工具/PM2-工具">PM2 工具</a></li><li><a href="../../../Professional/Work/full-stack/工具/Webpack" data-for="Professional/Work/full-stack/工具/Webpack">Webpack</a></li><li><a href="../../../Professional/Work/full-stack/工具/包管理工具" data-for="Professional/Work/full-stack/工具/包管理工具">包管理器</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/full-stack/文化"><button class="folder-button"><span class="folder-title">文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/full-stack/文化"><li><a href="../../../Professional/Work/full-stack/文化/历史发展" data-for="Professional/Work/full-stack/文化/历史发展">历史发展</a></li><li><a href="../../../Professional/Work/full-stack/文化/概述" data-for="Professional/Work/full-stack/文化/概述">概述</a></li><li><a href="../../../Professional/Work/full-stack/文化/现代化开发工具链" data-for="Professional/Work/full-stack/文化/现代化开发工具链">现代化开发工具链</a></li></ul></div></li><li><a href="../../../Professional/Work/full-stack/home" data-for="Professional/Work/full-stack/home">前端工程师(Front-End Engineer)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap"><button class="folder-button"><span class="folder-title">roadmap</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/权益保障"><button class="folder-button"><span class="folder-title">权益保障</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/权益保障"><li><a href="../../../Professional/Work/roadmap/权益保障/仲裁指南" data-for="Professional/Work/roadmap/权益保障/仲裁指南">仲裁指南</a></li><li><a href="../../../Professional/Work/roadmap/权益保障/职场维权实战经验" data-for="Professional/Work/roadmap/权益保障/职场维权实战经验">职场维权实战经验</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/求职经验"><button class="folder-button"><span class="folder-title">求职经验</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/求职经验"><li><a href="../../../Professional/Work/roadmap/求职经验/互联网行业-郑州" data-for="Professional/Work/roadmap/求职经验/互联网行业-郑州">互联网行业-郑州</a></li><li><a href="../../../Professional/Work/roadmap/求职经验/写给软件工程师的建议" data-for="Professional/Work/roadmap/求职经验/写给软件工程师的建议">写给软件工程师的建议</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/简历攻略"><button class="folder-button"><span class="folder-title">简历攻略</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/简历攻略"><li><a href="../../../Professional/Work/roadmap/简历攻略/IT-类简历" data-for="Professional/Work/roadmap/简历攻略/IT-类简历">IT 类简历</a></li><li><a href="../../../Professional/Work/roadmap/简历攻略/简历原则" data-for="Professional/Work/roadmap/简历攻略/简历原则">简历原则</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/职业规划"><button class="folder-button"><span class="folder-title">职业规划</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/职业规划"><li><a href="../../../Professional/Work/roadmap/职业规划/开发者职业路线图" data-for="Professional/Work/roadmap/职业规划/开发者职业路线图">开发者职业路线图</a></li><li><a href="../../../Professional/Work/roadmap/职业规划/职业宏观规划图" data-for="Professional/Work/roadmap/职业规划/职业宏观规划图">职业宏观规划图</a></li><li><a href="../../../Professional/Work/roadmap/职业规划/职业宏观路线图" data-for="Professional/Work/roadmap/职业规划/职业宏观路线图">职业宏观路线图</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/职场心得"><button class="folder-button"><span class="folder-title">职场心得</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/职场心得"><li><a href="../../../Professional/Work/roadmap/职场心得/华为新员工的-8-个阶段" data-for="Professional/Work/roadmap/职场心得/华为新员工的-8-个阶段">华为新员工的 8 个阶段</a></li><li><a href="../../../Professional/Work/roadmap/职场心得/如何平衡工作和生活" data-for="Professional/Work/roadmap/职场心得/如何平衡工作和生活">如何平衡工作和生活</a></li><li><a href="../../../Professional/Work/roadmap/职场心得/如何度过新手村" data-for="Professional/Work/roadmap/职场心得/如何度过新手村">如何度过新手村</a></li><li><a href="../../../Professional/Work/roadmap/职场心得/如何有效应对职场政治" data-for="Professional/Work/roadmap/职场心得/如何有效应对职场政治">如何有效应对职场政治</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/薪酬攻略"><button class="folder-button"><span class="folder-title">薪酬攻略</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/薪酬攻略"><li><a href="../../../Professional/Work/roadmap/薪酬攻略/社会保障" data-for="Professional/Work/roadmap/薪酬攻略/社会保障">社会保障</a></li><li><a href="../../../Professional/Work/roadmap/薪酬攻略/绩效考核" data-for="Professional/Work/roadmap/薪酬攻略/绩效考核">绩效考核</a></li><li><a href="../../../Professional/Work/roadmap/薪酬攻略/薪酬制度" data-for="Professional/Work/roadmap/薪酬攻略/薪酬制度">薪酬制度</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/roadmap/面试法则"><button class="folder-button"><span class="folder-title">面试法则</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/roadmap/面试法则"><li><a href="../../../Professional/Work/roadmap/面试法则/反向面试" data-for="Professional/Work/roadmap/面试法则/反向面试">反向面试</a></li><li><a href="../../../Professional/Work/roadmap/面试法则/面试-10-大常见问题" data-for="Professional/Work/roadmap/面试法则/面试-10-大常见问题">面试 10 大常见问题</a></li></ul></div></li><li><a href="../../../Professional/Work/roadmap/home" data-for="Professional/Work/roadmap/home">求职之路</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Professional/Work/sre-engineer"><button class="folder-button"><span class="folder-title">sre-engineer</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Professional/Work/sre-engineer"><li><a href="../../../Professional/Work/sre-engineer/home" data-for="Professional/Work/sre-engineer/home">SRE (站点可靠性工程师)</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences"><button class="folder-button"><span class="folder-title">SocialSciences</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/English"><button class="folder-button"><span class="folder-title">English</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/English"><li><a href="../../../SocialSciences/English/字母音标" data-for="SocialSciences/English/字母音标">字母音标</a></li><li><a href="../../../SocialSciences/English/语法基础" data-for="SocialSciences/English/语法基础">语法基础</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government"><button class="folder-button"><span class="folder-title">Government</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government/中国"><button class="folder-button"><span class="folder-title">中国</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government/中国"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government/中国/标准"><button class="folder-button"><span class="folder-title">标准</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government/中国/标准"><li><a href="../../../SocialSciences/Government/中国/标准/标准组织" data-for="SocialSciences/Government/中国/标准/标准组织">标准组织</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="SocialSciences/Government/中国/法律"><button class="folder-button"><span class="folder-title">法律</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="SocialSciences/Government/中国/法律"><li><a href="../../../SocialSciences/Government/中国/法律/法律文书" data-for="SocialSciences/Government/中国/法律/法律文书">法律文书</a></li></ul></div></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology"><button class="folder-button"><span class="folder-title">Technology</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/CloudService"><button class="folder-button"><span class="folder-title">CloudService</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/CloudService"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/CloudService/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/CloudService/基础"><li><a href="../../../Technology/CloudService/基础/IT-基础架构" data-for="Technology/CloudService/基础/IT-基础架构">IT 基础架构</a></li><li><a href="../../../Technology/CloudService/基础/云计算" data-for="Technology/CloudService/基础/云计算">云计算概述</a></li><li><a href="../../../Technology/CloudService/基础/功能即服务(FaaS)" data-for="Technology/CloudService/基础/功能即服务(FaaS)">功能即服务(FaaS)</a></li><li><a href="../../../Technology/CloudService/基础/基础架构即服务(IaaS)" data-for="Technology/CloudService/基础/基础架构即服务(IaaS)">基础架构即服务(IaaS)</a></li><li><a href="../../../Technology/CloudService/基础/平台即服务(PaaS)" data-for="Technology/CloudService/基础/平台即服务(PaaS)">平台即服务(PaaS)</a></li><li><a href="../../../Technology/CloudService/基础/软件即服务(SaaS)" data-for="Technology/CloudService/基础/软件即服务(SaaS)">软件即服务(SaaS)</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork"><button class="folder-button"><span class="folder-title">ComputerNetwork</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/Nginx"><button class="folder-button"><span class="folder-title">Nginx</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/Nginx"><li><a href="../../../Technology/ComputerNetwork/Nginx/概述" data-for="Technology/ComputerNetwork/Nginx/概述">Nginx 概述</a></li><li><a href="../../../Technology/ComputerNetwork/Nginx/内容缓存" data-for="Technology/ComputerNetwork/Nginx/内容缓存">内容缓存</a></li><li><a href="../../../Technology/ComputerNetwork/Nginx/基础配置" data-for="Technology/ComputerNetwork/Nginx/基础配置">基础配置</a></li><li><a href="../../../Technology/ComputerNetwork/Nginx/负载均衡" data-for="Technology/ComputerNetwork/Nginx/负载均衡">负载均衡</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/公共服务"><button class="folder-button"><span class="folder-title">公共服务</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/公共服务"><li><a href="../../../Technology/ComputerNetwork/公共服务/IPv4-DNS-服务" data-for="Technology/ComputerNetwork/公共服务/IPv4-DNS-服务">IPv4 DNS 服务</a></li><li><a href="../../../Technology/ComputerNetwork/公共服务/IPv6-DNS-服务" data-for="Technology/ComputerNetwork/公共服务/IPv6-DNS-服务">IPv6 DNS 服务</a></li><li><a href="../../../Technology/ComputerNetwork/公共服务/Mirror-镜像站" data-for="Technology/ComputerNetwork/公共服务/Mirror-镜像站">Mirror 镜像站</a></li><li><a href="../../../Technology/ComputerNetwork/公共服务/NTP-服务器" data-for="Technology/ComputerNetwork/公共服务/NTP-服务器">NTP 服务器</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/应用服务"><button class="folder-button"><span class="folder-title">应用服务</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/应用服务"><li><a href="../../../Technology/ComputerNetwork/应用服务/CDN-内容分发网络" data-for="Technology/ComputerNetwork/应用服务/CDN-内容分发网络">CDN 内容分发网络</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/网络协议"><button class="folder-button"><span class="folder-title">网络协议</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/网络协议"><li><a href="../../../Technology/ComputerNetwork/网络协议/DHCP-动态主机配置协议" data-for="Technology/ComputerNetwork/网络协议/DHCP-动态主机配置协议">DHCP 动态主机配置协议</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/DNS-域名系统" data-for="Technology/ComputerNetwork/网络协议/DNS-域名系统">DNS 域名系统</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/IP-网际协议" data-for="Technology/ComputerNetwork/网络协议/IP-网际协议">IP 网际协议</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/TCP-传输控制协议" data-for="Technology/ComputerNetwork/网络协议/TCP-传输控制协议">TCP 传输控制协议</a></li><li><a href="../../../Technology/ComputerNetwork/网络协议/UDP-用户数据报协议" data-for="Technology/ComputerNetwork/网络协议/UDP-用户数据报协议">UDP 用户数据报协议</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerNetwork/网络基础"><button class="folder-button"><span class="folder-title">网络基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerNetwork/网络基础"><li><a href="../../../Technology/ComputerNetwork/网络基础/网络基础" data-for="Technology/ComputerNetwork/网络基础/网络基础">网络基础</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity"><button class="folder-button"><span class="folder-title">ComputerSecurity</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/信息安全"><button class="folder-button"><span class="folder-title">信息安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/信息安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/信息安全/OpenPGP"><button class="folder-button"><span class="folder-title">OpenPGP</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/信息安全/OpenPGP"><li><a href="../../../Technology/ComputerSecurity/信息安全/OpenPGP/GnuPG-简明指南" data-for="Technology/ComputerSecurity/信息安全/OpenPGP/GnuPG-简明指南">GnuPG 简明指南</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/密码学"><button class="folder-button"><span class="folder-title">密码学</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/密码学"><li><a href="../../../Technology/ComputerSecurity/密码学/简明指南" data-for="Technology/ComputerSecurity/密码学/简明指南">简明指南</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/用户安全"><button class="folder-button"><span class="folder-title">用户安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/用户安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/用户安全/权限设计"><button class="folder-button"><span class="folder-title">权限设计</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/用户安全/权限设计"><li><a href="../../../Technology/ComputerSecurity/用户安全/权限设计/主流权限系统的设计" data-for="Technology/ComputerSecurity/用户安全/权限设计/主流权限系统的设计">主流权限系统的设计</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/用户安全/用户鉴权"><button class="folder-button"><span class="folder-title">用户鉴权</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/用户安全/用户鉴权"><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/HTTP-基本鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/HTTP-基本鉴权">HTTP 基本鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/JWT(JSON-Web-Token)鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/JWT(JSON-Web-Token)鉴权">JWT 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/OAuth-鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/OAuth-鉴权">OAuth 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/Session-Cookie-鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/Session-Cookie-鉴权">Session-Cookie 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/单点登录(Single-Sign-On)" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/单点登录(Single-Sign-On)">SSO 单点登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/Token-鉴权" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/Token-鉴权">Token 鉴权</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/一键登录(适用于原生APP)" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/一键登录(适用于原生APP)">一键登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/唯一登录" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/唯一登录">唯一登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/扫码登录" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/扫码登录">扫码登录</a></li><li><a href="../../../Technology/ComputerSecurity/用户安全/用户鉴权/联合登录和信任登录" data-for="Technology/ComputerSecurity/用户安全/用户鉴权/联合登录和信任登录">联合登录和信任登录</a></li></ul></div></li><li><a href="../../../Technology/ComputerSecurity/用户安全/简明指南" data-for="Technology/ComputerSecurity/用户安全/简明指南">简明指南</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/系统安全"><button class="folder-button"><span class="folder-title">系统安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/系统安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/系统安全/防火墙"><button class="folder-button"><span class="folder-title">防火墙</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/系统安全/防火墙"><li><a href="../../../Technology/ComputerSecurity/系统安全/防火墙/网络端口大全" data-for="Technology/ComputerSecurity/系统安全/防火墙/网络端口大全">网络端口大全</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/网络安全"><button class="folder-button"><span class="folder-title">网络安全</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/网络安全"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/网络安全/OpenSSH"><button class="folder-button"><span class="folder-title">OpenSSH</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/网络安全/OpenSSH"><li><a href="../../../Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-使用方法" data-for="Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-使用方法">OpenSSH 使用方法</a></li><li><a href="../../../Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-概述" data-for="Technology/ComputerSecurity/网络安全/OpenSSH/OpenSSH-概述">OpenSSH 概述</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerSecurity/网络安全/OpenSSL"><button class="folder-button"><span class="folder-title">OpenSSL</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerSecurity/网络安全/OpenSSL"><li><a href="../../../Technology/ComputerSecurity/网络安全/OpenSSL/简明指南" data-for="Technology/ComputerSecurity/网络安全/OpenSSL/简明指南">简明指南</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ComputerStorage"><button class="folder-button"><span class="folder-title">ComputerStorage</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ComputerStorage"><li><a href="../../../Technology/ComputerStorage/0.-大纲" data-for="Technology/ComputerStorage/0.-大纲">0. 大纲</a></li><li><a href="../../../Technology/ComputerStorage/1.-存储基础" data-for="Technology/ComputerStorage/1.-存储基础">1. 存储基础</a></li><li><a href="../../../Technology/ComputerStorage/2.-存储硬件" data-for="Technology/ComputerStorage/2.-存储硬件">2. 存储硬件</a></li><li><a href="../../../Technology/ComputerStorage/3.-存储架构" data-for="Technology/ComputerStorage/3.-存储架构">3. 存储架构</a></li><li><a href="../../../Technology/ComputerStorage/4.-文件系统" data-for="Technology/ComputerStorage/4.-文件系统">4. 文件系统</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem"><button class="folder-button"><span class="folder-title">DatabaseSystem</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem/PostgreSQL"><button class="folder-button"><span class="folder-title">PostgreSQL</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem/PostgreSQL"><li><a href="../../../Technology/DatabaseSystem/PostgreSQL/基本概念" data-for="Technology/DatabaseSystem/PostgreSQL/基本概念">基本概念</a></li><li><a href="../../../Technology/DatabaseSystem/PostgreSQL/安装配置" data-for="Technology/DatabaseSystem/PostgreSQL/安装配置">安装配置</a></li><li><a href="../../../Technology/DatabaseSystem/PostgreSQL/简介" data-for="Technology/DatabaseSystem/PostgreSQL/简介">简介</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem/SQL-语言"><button class="folder-button"><span class="folder-title">SQL 语言</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem/SQL-语言"><li><a href="../../../Technology/DatabaseSystem/SQL-语言/基础语法" data-for="Technology/DatabaseSystem/SQL-语言/基础语法">基础语法</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/DatabaseSystem/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/DatabaseSystem/基础"><li><a href="../../../Technology/DatabaseSystem/基础/关系型数据库" data-for="Technology/DatabaseSystem/基础/关系型数据库">关系型数据库</a></li><li><a href="../../../Technology/DatabaseSystem/基础/数据库概述" data-for="Technology/DatabaseSystem/基础/数据库概述">数据库概述</a></li><li><a href="../../../Technology/DatabaseSystem/基础/非关系型数据库" data-for="Technology/DatabaseSystem/基础/非关系型数据库">非关系型数据库</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted"><button class="folder-button"><span class="folder-title">GettingStarted</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具"><button class="folder-button"><span class="folder-title">命令行工具</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具/PowerShell"><button class="folder-button"><span class="folder-title">PowerShell</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具/PowerShell"><li><a href="../../../Technology/GettingStarted/命令行工具/PowerShell/PowerShell-入门" data-for="Technology/GettingStarted/命令行工具/PowerShell/PowerShell-入门">PowerShell 入门</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/PowerShell/PowerShell-进阶" data-for="Technology/GettingStarted/命令行工具/PowerShell/PowerShell-进阶">PowerShell 进阶</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/PowerShell/PowerShell-高级" data-for="Technology/GettingStarted/命令行工具/PowerShell/PowerShell-高级">PowerShell 高级</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具/Shell"><button class="folder-button"><span class="folder-title">Shell</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具/Shell"><li><a href="../../../Technology/GettingStarted/命令行工具/Shell/Shell-命令操作" data-for="Technology/GettingStarted/命令行工具/Shell/Shell-命令操作">Linux 命令行操作</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Shell/Shell-必备锦囊" data-for="Technology/GettingStarted/命令行工具/Shell/Shell-必备锦囊">Shell 必备锦囊</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Shell/Shell-是什么" data-for="Technology/GettingStarted/命令行工具/Shell/Shell-是什么">Shell 是什么</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/命令行工具/Vim"><button class="folder-button"><span class="folder-title">Vim</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/命令行工具/Vim"><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/5.Vim-参考手册" data-for="Technology/GettingStarted/命令行工具/Vim/5.Vim-参考手册">Vim 参考手册</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/4.Vim-实用技巧" data-for="Technology/GettingStarted/命令行工具/Vim/4.Vim-实用技巧">Vim 实用技巧</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/6.Vim-帮助文档" data-for="Technology/GettingStarted/命令行工具/Vim/6.Vim-帮助文档">Vim 帮助文档</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/1.Vim-入门" data-for="Technology/GettingStarted/命令行工具/Vim/1.Vim-入门">Vim 快速入门</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/2.VIM-配置管理" data-for="Technology/GettingStarted/命令行工具/Vim/2.VIM-配置管理">VIM 配置管理</a></li><li><a href="../../../Technology/GettingStarted/命令行工具/Vim/3.Vim-高级功能" data-for="Technology/GettingStarted/命令行工具/Vim/3.Vim-高级功能">Vim 高级功能</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/开源指南"><button class="folder-button"><span class="folder-title">开源指南</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/开源指南"><li><a href="../../../Technology/GettingStarted/开源指南/如何向开源社区提问" data-for="Technology/GettingStarted/开源指南/如何向开源社区提问">如何向开源社区提问</a></li><li><a href="../../../Technology/GettingStarted/开源指南/如何有效报告-BUG" data-for="Technology/GettingStarted/开源指南/如何有效报告-BUG">如何有效报告 BUG</a></li><li><a href="../../../Technology/GettingStarted/开源指南/开源指北" data-for="Technology/GettingStarted/开源指南/开源指北">开源指北</a></li><li><a href="../../../Technology/GettingStarted/开源指南/提问的智慧" data-for="Technology/GettingStarted/开源指南/提问的智慧">提问的智慧</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/文本处理"><button class="folder-button"><span class="folder-title">文本处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/文本处理"><li><a href="../../../Technology/GettingStarted/文本处理/正则表达式" data-for="Technology/GettingStarted/文本处理/正则表达式">正则表达式</a></li><li><a href="../../../Technology/GettingStarted/文本处理/结构化文件" data-for="Technology/GettingStarted/文本处理/结构化文件">结构化文件</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制"><button class="folder-button"><span class="folder-title">版本控制</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制/Git"><button class="folder-button"><span class="folder-title">Git</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制/Git"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制/Git/入门"><button class="folder-button"><span class="folder-title">入门</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制/Git/入门"><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/分支" data-for="Technology/GettingStarted/版本控制/Git/入门/分支">分支</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/协议" data-for="Technology/GettingStarted/版本控制/Git/入门/协议">协议</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/基础" data-for="Technology/GettingStarted/版本控制/Git/入门/基础">基础</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/入门/起步" data-for="Technology/GettingStarted/版本控制/Git/入门/起步">起步</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/GettingStarted/版本控制/Git/进阶"><button class="folder-button"><span class="folder-title">进阶</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/GettingStarted/版本控制/Git/进阶"><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/Git-LFS" data-for="Technology/GettingStarted/版本控制/Git/进阶/Git-LFS">Git-LFS</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/参考手册" data-for="Technology/GettingStarted/版本控制/Git/进阶/参考手册">参考手册</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/工作流" data-for="Technology/GettingStarted/版本控制/Git/进阶/工作流">工作流</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/常用命令" data-for="Technology/GettingStarted/版本控制/Git/进阶/常用命令">常用命令</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/常用技巧" data-for="Technology/GettingStarted/版本控制/Git/进阶/常用技巧">常用技巧</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/思维导图" data-for="Technology/GettingStarted/版本控制/Git/进阶/思维导图">思维导图</a></li><li><a href="../../../Technology/GettingStarted/版本控制/Git/进阶/钩子" data-for="Technology/GettingStarted/版本控制/Git/进阶/钩子">钩子</a></li></ul></div></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem"><button class="folder-button"><span class="folder-title">OperatingSystem</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Automation"><button class="folder-button"><span class="folder-title">Automation</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Automation"><li><a href="../../../Technology/OperatingSystem/Automation/Ansible" data-for="Technology/OperatingSystem/Automation/Ansible">Ansible</a></li><li><a href="../../../Technology/OperatingSystem/Automation/Cloud-init-快速部署" data-for="Technology/OperatingSystem/Automation/Cloud-init-快速部署">Cloud-init</a></li><li><a href="../../../Technology/OperatingSystem/Automation/PXE--系统部署" data-for="Technology/OperatingSystem/Automation/PXE--系统部署">PXE 自动化部署</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker"><button class="folder-button"><span class="folder-title">Docker</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker/基础"><button class="folder-button"><span class="folder-title">基础</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker/基础"><li><a href="../../../Technology/OperatingSystem/Docker/基础/基础概念" data-for="Technology/OperatingSystem/Docker/基础/基础概念">基础概念</a></li><li><a href="../../../Technology/OperatingSystem/Docker/基础/安装配置" data-for="Technology/OperatingSystem/Docker/基础/安装配置">安装配置</a></li><li><a href="../../../Technology/OperatingSystem/Docker/基础/简介" data-for="Technology/OperatingSystem/Docker/基础/简介">简介</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker/进阶"><button class="folder-button"><span class="folder-title">进阶</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker/进阶"><li><a href="../../../Technology/OperatingSystem/Docker/进阶/Docker-Compose" data-for="Technology/OperatingSystem/Docker/进阶/Docker-Compose">Docker Compose</a></li><li><a href="../../../Technology/OperatingSystem/Docker/进阶/Docker-Dockerfile" data-for="Technology/OperatingSystem/Docker/进阶/Docker-Dockerfile">Docker Dockerfile</a></li><li><a href="../../../Technology/OperatingSystem/Docker/进阶/Docker-使用" data-for="Technology/OperatingSystem/Docker/进阶/Docker-使用">Docker 使用</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Docker/高级"><button class="folder-button"><span class="folder-title">高级</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Docker/高级"><li><a href="../../../Technology/OperatingSystem/Docker/高级/Docker-命令手册" data-for="Technology/OperatingSystem/Docker/高级/Docker-命令手册">Docker 命令手册</a></li><li><a href="../../../Technology/OperatingSystem/Docker/高级/Docker-存储" data-for="Technology/OperatingSystem/Docker/高级/Docker-存储">Docker 存储</a></li><li><a href="../../../Technology/OperatingSystem/Docker/高级/Docker-网络" data-for="Technology/OperatingSystem/Docker/高级/Docker-网络">Docker 网络</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux"><button class="folder-button"><span class="folder-title">Linux</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/1.文化"><button class="folder-button"><span class="folder-title">1.文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/1.文化"><li><a href="../../../Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-历史与发展" data-for="Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-历史与发展">GNU&Linux 历史与发展</a></li><li><a href="../../../Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-社区与文化" data-for="Technology/OperatingSystem/Linux/1.文化/GNU-and-Linux-社区与文化">GNU&Linux 社区与文化</a></li><li><a href="../../../Technology/OperatingSystem/Linux/1.文化/开源软件的概念与重要性" data-for="Technology/OperatingSystem/Linux/1.文化/开源软件的概念与重要性">开源软件的概念与重要性</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/2.安装"><button class="folder-button"><span class="folder-title">2.安装</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/2.安装"><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/GRUB-引导程序" data-for="Technology/OperatingSystem/Linux/2.安装/GRUB-引导程序">GRUB 引导程序</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-下-0-1-手动安装-Arch-Linux" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-下-0-1-手动安装-Arch-Linux">Linux 下 0-1 手动安装 Arch Linux</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-下源代码编译与安装实战" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-下源代码编译与安装实战">Linux 下源代码编译与安装实战</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-发行版镜像" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-发行版镜像">Linux 发行版镜像</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-安装和配置" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-安装和配置">Linux 安装和配置</a></li><li><a href="../../../Technology/OperatingSystem/Linux/2.安装/Linux-无法启动排查指南" data-for="Technology/OperatingSystem/Linux/2.安装/Linux-无法启动排查指南">Linux 无法启动排查指南</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/3.基础操作"><button class="folder-button"><span class="folder-title">3.基础操作</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/3.基础操作"><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-包管理器" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-包管理器">Linux 包管理器</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Shell-命令行操作" data-for="Technology/OperatingSystem/Linux/3.基础操作/Shell-命令行操作">Linux 命令行操作</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-文件管理" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-文件管理">Linux 文件管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-环境变量" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-环境变量">Linux 环境变量</a></li><li><a href="../../../Technology/OperatingSystem/Linux/3.基础操作/Linux-用户和权限" data-for="Technology/OperatingSystem/Linux/3.基础操作/Linux-用户和权限">Linux 用户和权限</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/4.系统管理"><button class="folder-button"><span class="folder-title">4.系统管理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/4.系统管理"><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-内核管理" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-内核管理">Linux 内核管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-基本配置" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-基本配置">Linux 基本配置</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-日志管理" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-日志管理">Linux 日志管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-服务管理" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-服务管理">Linux 服务管理</a></li><li><a href="../../../Technology/OperatingSystem/Linux/4.系统管理/Linux-系统启动详解" data-for="Technology/OperatingSystem/Linux/4.系统管理/Linux-系统启动详解">Linux 服务管理</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/5.安全配置"><button class="folder-button"><span class="folder-title">5.安全配置</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/5.安全配置"><li><a href="../../../Technology/OperatingSystem/Linux/5.安全配置/Linux-系统安全与防护" data-for="Technology/OperatingSystem/Linux/5.安全配置/Linux-系统安全与防护">Linux 系统安全与防护</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/6.网络管理"><button class="folder-button"><span class="folder-title">6.网络管理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/6.网络管理"><li><a href="../../../Technology/OperatingSystem/Linux/6.网络管理/Linux-网络管理" data-for="Technology/OperatingSystem/Linux/6.网络管理/Linux-网络管理">Linux 网络管理</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Linux/7.存储管理"><button class="folder-button"><span class="folder-title">7.存储管理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Linux/7.存储管理"><li><a href="../../../Technology/OperatingSystem/Linux/7.存储管理/Linux-文件系统" data-for="Technology/OperatingSystem/Linux/7.存储管理/Linux-文件系统">Linux 文件系统</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Virtualization"><button class="folder-button"><span class="folder-title">Virtualization</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Virtualization"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Virtualization/1.虚拟化概述"><button class="folder-button"><span class="folder-title">1.虚拟化概述</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Virtualization/1.虚拟化概述"><li><a href="../../../Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化平台简介" data-for="Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化平台简介">虚拟化平台简介</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化概述" data-for="Technology/OperatingSystem/Virtualization/1.虚拟化概述/虚拟化概述">虚拟化概述</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Virtualization/2.KVM虚拟化"><button class="folder-button"><span class="folder-title">2.KVM虚拟化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Virtualization/2.KVM虚拟化"><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/1.-KVM-概述" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/1.-KVM-概述">1. KVM 概述</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/2.-KVM-安装配置" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/2.-KVM-安装配置">2. KVM 安装配置</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/3.-KVM-管理工具" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/3.-KVM-管理工具">3. KVM 管理工具</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/4.-KVM-网络配置" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/4.-KVM-网络配置">4. KVM 网络配置</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/5.-KVM-存储管理" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/5.-KVM-存储管理">5. KVM 存储管理</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/6.-KVM-性能优化" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/6.-KVM-性能优化">6. KVM 性能优化</a></li><li><a href="../../../Technology/OperatingSystem/Virtualization/2.KVM虚拟化/7.-KVM-系统监控" data-for="Technology/OperatingSystem/Virtualization/2.KVM虚拟化/7.-KVM-系统监控">7. KVM 系统监控</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Windows"><button class="folder-button"><span class="folder-title">Windows</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Windows"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/OperatingSystem/Windows/文化"><button class="folder-button"><span class="folder-title">文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/OperatingSystem/Windows/文化"><li><a href="../../../Technology/OperatingSystem/Windows/文化/微软及其Windows系统的历史发展" data-for="Technology/OperatingSystem/Windows/文化/微软及其Windows系统的历史发展">微软及其Windows系统的历史发展</a></li></ul></div></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage"><button class="folder-button"><span class="folder-title">ProgrammingLanguage</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python"><button class="folder-button"><span class="folder-title">Python</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/入门"><button class="folder-button"><span class="folder-title">入门</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/入门"><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/函数方法" data-for="Technology/ProgrammingLanguage/Python/入门/函数方法">函数方法</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/基础语法" data-for="Technology/ProgrammingLanguage/Python/入门/基础语法">基础语法</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/控制语句" data-for="Technology/ProgrammingLanguage/Python/入门/控制语句">控制语句</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/数据类型" data-for="Technology/ProgrammingLanguage/Python/入门/数据类型">数据类型</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/数据结构" data-for="Technology/ProgrammingLanguage/Python/入门/数据结构">数据结构</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/模块和包" data-for="Technology/ProgrammingLanguage/Python/入门/模块和包">模块和包</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/入门/面对对象" data-for="Technology/ProgrammingLanguage/Python/入门/面对对象">面对对象</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/文化"><button class="folder-button"><span class="folder-title">文化</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/文化"><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/发展历史" data-for="Technology/ProgrammingLanguage/Python/文化/发展历史">发展历史</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/生命周期" data-for="Technology/ProgrammingLanguage/Python/文化/生命周期">生命周期</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/社区文化" data-for="Technology/ProgrammingLanguage/Python/文化/社区文化">社区文化</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/设计哲学" data-for="Technology/ProgrammingLanguage/Python/文化/设计哲学">设计哲学</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/文化/语言特性" data-for="Technology/ProgrammingLanguage/Python/文化/语言特性">语言特性</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块"><button class="folder-button"><span class="folder-title">模块</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/WEB开发"><button class="folder-button"><span class="folder-title">WEB开发</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/WEB开发"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/WEB开发/Jinja-模板引擎" data-for="Technology/ProgrammingLanguage/Python/模块/WEB开发/Jinja-模板引擎">Jinja 模板引擎</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/数据处理"><button class="folder-button"><span class="folder-title">数据处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/数据处理"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/数据处理/configparser-配置文件解析器" data-for="Technology/ProgrammingLanguage/Python/模块/数据处理/configparser-配置文件解析器">configparser 配置文件解析器</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/数据处理/csv-文件读写" data-for="Technology/ProgrammingLanguage/Python/模块/数据处理/csv-文件读写">csv 文件读写</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/数据处理/json-编码和解码器" data-for="Technology/ProgrammingLanguage/Python/模块/数据处理/json-编码和解码器">json 编码和解码器</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/文本处理"><button class="folder-button"><span class="folder-title">文本处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/文本处理"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/文本处理/re-----正则表达式操作" data-for="Technology/ProgrammingLanguage/Python/模块/文本处理/re-----正则表达式操作">re --- 正则表达式操作</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/系统交互"><button class="folder-button"><span class="folder-title">系统交互</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/系统交互"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/dotenv-环境变量管理" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/dotenv-环境变量管理">dotenv 环境变量管理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/logging-日志记录工具" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/logging-日志记录工具">logging 日志记录工具</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/loguru-日志库" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/loguru-日志库">loguru 日志库</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/os-多种操作系统接口" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/os-多种操作系统接口">os 多种操作系统接口</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/subprocess-子进程管理" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/subprocess-子进程管理">subprocess 子进程管理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/系统交互/sys-系统相关的形参和函数" data-for="Technology/ProgrammingLanguage/Python/模块/系统交互/sys-系统相关的形参和函数">sys 系统相关的形参和函数</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/模块/网络处理"><button class="folder-button"><span class="folder-title">网络处理</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/模块/网络处理"><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/网络处理/requests-HTTP-库" data-for="Technology/ProgrammingLanguage/Python/模块/网络处理/requests-HTTP-库">requests HTTP 库</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/网络处理/socket-底层网络接口" data-for="Technology/ProgrammingLanguage/Python/模块/网络处理/socket-底层网络接口">socket 底层网络接口</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/模块/网络处理/urllib-URL-处理模块" data-for="Technology/ProgrammingLanguage/Python/模块/网络处理/urllib-URL-处理模块">urllib URL 处理模块</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/进阶"><button class="folder-button"><span class="folder-title">进阶</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/进阶"><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/函数式编程" data-for="Technology/ProgrammingLanguage/Python/进阶/函数式编程">函数式编程</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/垃圾回收" data-for="Technology/ProgrammingLanguage/Python/进阶/垃圾回收">垃圾回收</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/并行和并发" data-for="Technology/ProgrammingLanguage/Python/进阶/并行和并发">并行和并发</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/异常处理" data-for="Technology/ProgrammingLanguage/Python/进阶/异常处理">异常处理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/数据库操作" data-for="Technology/ProgrammingLanguage/Python/进阶/数据库操作">数据库操作</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/文件和IO操作" data-for="Technology/ProgrammingLanguage/Python/进阶/文件和IO操作">文件和IO操作</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/测试和调试" data-for="Technology/ProgrammingLanguage/Python/进阶/测试和调试">测试和调试</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/资源管理" data-for="Technology/ProgrammingLanguage/Python/进阶/资源管理">资源管理</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/进阶/面向对象进阶" data-for="Technology/ProgrammingLanguage/Python/进阶/面向对象进阶">面向对象</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/项目"><button class="folder-button"><span class="folder-title">项目</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/项目"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/项目/虚拟环境"><button class="folder-button"><span class="folder-title">虚拟环境</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/项目/虚拟环境"><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/pip" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/pip">pip</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/pipenv" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/pipenv">pipenv</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/poetry" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/poetry">poetry</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/pyenv" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/pyenv">pyenv</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/virtualenv" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/virtualenv">Virtualenv</a></li><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/虚拟环境/概述" data-for="Technology/ProgrammingLanguage/Python/项目/虚拟环境/概述">概述</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/ProgrammingLanguage/Python/项目/风格指南"><button class="folder-button"><span class="folder-title">风格指南</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/ProgrammingLanguage/Python/项目/风格指南"><li><a href="../../../Technology/ProgrammingLanguage/Python/项目/风格指南/风格指南" data-for="Technology/ProgrammingLanguage/Python/项目/风格指南/风格指南">Python 风格指南</a></li></ul></div></li></ul></div></li></ul></div></li><li><a href="../../../Technology/ProgrammingLanguage/home" data-for="Technology/ProgrammingLanguage/home">程序设计语言</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering"><button class="folder-button"><span class="folder-title">SoftwareEngineering</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering"><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering/CI-and-CD"><button class="folder-button"><span class="folder-title">CI&CD</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering/CI-and-CD"><li><a href="../../../Technology/SoftwareEngineering/CI-and-CD/GitHub-Actions" data-for="Technology/SoftwareEngineering/CI-and-CD/GitHub-Actions">GitHub Actions</a></li><li><a href="../../../Technology/SoftwareEngineering/CI-and-CD/GitLab-Runner" data-for="Technology/SoftwareEngineering/CI-and-CD/GitLab-Runner">GitLab Runner</a></li><li><a href="../../../Technology/SoftwareEngineering/CI-and-CD/Jenkins" data-for="Technology/SoftwareEngineering/CI-and-CD/Jenkins">Jenkins</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering/协作规范"><button class="folder-button"><span class="folder-title">协作规范</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering/协作规范"><li><a href="../../../Technology/SoftwareEngineering/协作规范/8.交流反馈(Issue)" data-for="Technology/SoftwareEngineering/协作规范/8.交流反馈(Issue)">交流反馈(Issue)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/1.关于(Readme)" data-for="Technology/SoftwareEngineering/协作规范/1.关于(Readme)">关于(Readme)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/4.分支(Branch)" data-for="Technology/SoftwareEngineering/协作规范/4.分支(Branch)">分支(Branch)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/2.开源协议(License)" data-for="Technology/SoftwareEngineering/协作规范/2.开源协议(License)">开源协议(License)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/5.日志(Commit)" data-for="Technology/SoftwareEngineering/协作规范/5.日志(Commit)">日志(Commit)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/7.注释(Comments)" data-for="Technology/SoftwareEngineering/协作规范/7.注释(Comments)">注释(Comments)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/6.版本(Tag)" data-for="Technology/SoftwareEngineering/协作规范/6.版本(Tag)">版本(Tag)</a></li><li><a href="../../../Technology/SoftwareEngineering/协作规范/3.贡献者协议(Contributing)" data-for="Technology/SoftwareEngineering/协作规范/3.贡献者协议(Contributing)">贡献者协议(Contributing)</a></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/SoftwareEngineering/技术文档"><button class="folder-button"><span class="folder-title">技术文档</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/SoftwareEngineering/技术文档"><li><a href="../../../Technology/SoftwareEngineering/技术文档/3.命名约定" data-for="Technology/SoftwareEngineering/技术文档/3.命名约定">命名约定</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/5.文档内容" data-for="Technology/SoftwareEngineering/技术文档/5.文档内容">文档内容</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/6.文档结构" data-for="Technology/SoftwareEngineering/技术文档/6.文档结构">文档结构</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/2.标点符号" data-for="Technology/SoftwareEngineering/技术文档/2.标点符号">标点符号</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/1.简介" data-for="Technology/SoftwareEngineering/技术文档/1.简介">简介</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/4.语言风格" data-for="Technology/SoftwareEngineering/技术文档/4.语言风格">语言风格</a></li><li><a href="../../../Technology/SoftwareEngineering/技术文档/7.附录资料" data-for="Technology/SoftwareEngineering/技术文档/7.附录资料">附录资料</a></li></ul></div></li></ul></div></li><li><div class="folder-container"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="5 8 14 8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="folder-icon"><polyline points="6 9 12 15 18 9"></polyline></svg><div data-folderpath="Technology/StructuresAlgorithms"><button class="folder-button"><span class="folder-title">StructuresAlgorithms</span></button></div></div><div class="folder-outer "><ul style="padding-left:1.4rem;" class="content" data-folderul="Technology/StructuresAlgorithms"><li><a href="../../../Technology/StructuresAlgorithms/数据结构" data-for="Technology/StructuresAlgorithms/数据结构">数据结构</a></li><li><a href="../../../Technology/StructuresAlgorithms/算法" data-for="Technology/StructuresAlgorithms/算法">算法</a></li></ul></div></li></ul></div></li><li><div class="folder-outer "><ul style="padding-left:0;" class="content" data-folderul></ul></div></li></ul></div></li><li id="explorer-end"></li></ul></div></div></div></div><footer class><p>Created with <a href="https://quartz.jzhao.xyz/">Quartz v4.3.1</a> © 2024</p><ul><li><a href="https://www.7wate.com">Home</a></li><li><a href="https://blog.7wate.com">Blog</a></li><li><a href="https://github.com/7wate">GitHub</a></li></ul></footer></div></body><script type="application/javascript">function c(){let t=this.parentElement;t.classList.toggle("is-collapsed");let l=t.classList.contains("is-collapsed")?this.scrollHeight:t.scrollHeight;t.style.maxHeight=l+"px";let o=t,e=t.parentElement;for(;e;){if(!e.classList.contains("callout"))return;let n=e.classList.contains("is-collapsed")?e.scrollHeight:e.scrollHeight+o.scrollHeight;e.style.maxHeight=n+"px",o=e,e=e.parentElement}}function i(){let t=document.getElementsByClassName("callout is-collapsible");for(let s of t){let l=s.firstElementChild;if(l){l.addEventListener("click",c),window.addCleanup(()=>l.removeEventListener("click",c));let e=s.classList.contains("is-collapsed")?l.scrollHeight:s.scrollHeight;s.style.maxHeight=e+"px"}}}document.addEventListener("nav",i);window.addEventListener("resize",i);
|
||
</script><script type="module">
|
||
let mermaidImport = undefined
|
||
document.addEventListener('nav', async () => {
|
||
if (document.querySelector("code.mermaid")) {
|
||
mermaidImport ||= await import('https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs')
|
||
const mermaid = mermaidImport.default
|
||
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
|
||
mermaid.initialize({
|
||
startOnLoad: false,
|
||
securityLevel: 'loose',
|
||
theme: darkMode ? 'dark' : 'default'
|
||
})
|
||
|
||
await mermaid.run({
|
||
querySelector: '.mermaid'
|
||
})
|
||
}
|
||
});
|
||
</script><script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../../../postscript.js" type="module"></script></html> |