Home | 简体中文 | 繁体中文 | 杂文 | 知乎专栏 | 51CTO学院 | CSDN程序员研修院 | Github | OSChina 博客 | 腾讯云社区 | 阿里云栖社区 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏多维度架构

Netkiller DevOps 手札

Software engineering platform, Integrated SCM & Project Management, Version Control System,Continuous Integration & Delivery

《Netkiller DevOps 手札》视频教程

Mr. Neo Chan, 陈景峯(BG7NYT)



中国广东省深圳市望海路半岛城邦三期
518067
+86 13113668890


$Date: 2013-04-10 15:03:49 +0800 (Wed, 10 Apr 2013) $

2009-12-12

电子书最近一次更新于 2022-01-27 23:02:45

版权声明

转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。

http://www.netkiller.cn
http://netkiller.github.io
http://netkiller.sourceforge.net
微信公众号: netkiller
微信:13113668890 请注明“读者”
QQ:13721218 请注明“读者”
QQ群:128659835 请注明“读者”
知乎专栏 | 多维度架构

致读者

Netkiller 系列手札 已经被 Github 收录,并备份保存在北极地下250米深的代码库中,备份会保留1000年。

Preserving open source software for future generations

The world is powered by open source software. It is a hidden cornerstone of modern civilization, and the shared heritage of all humanity.

The GitHub Arctic Code Vault is a data repository preserved in the Arctic World Archive (AWA), a very-long-term archival facility 250 meters deep in the permafrost of an Arctic mountain.

We are collaborating with the Bodleian Library in Oxford, the Bibliotheca Alexandrina in Egypt, and Stanford Libraries in California to store copies of 17,000 of GitHub’s most popular and most-depended-upon projects—open source’s “greatest hits”—in their archives, in museum-quality cases, to preserve them for future generations.

https://archiveprogram.github.com/arctic-vault/

目录

1. 自述
1.1. 写给读者
1.2. 作者简介
1.3. 如何获得文档
1.4. 打赏(Donations)
1.5. 联系方式
I. 软件项目管理
1. 范围管理
1.1. 宏观管理
1.2. 你清楚你的工作职责吗?
1.2.1. 制度管理
1.2.2. 权力下放
1.2.3. 专业的人做专业的事
1.2.4. 总结
1.3. 怎样防止踢皮球
1.3.1. 进入正题
1.3.2. 踢皮球几大害处
1.3.3. 场景一
1.3.4. 场景二
1.3.5. 踢皮球的风气是怎样形成的?
1.3.5.1. 技术人员的单一视角
1.3.5.2. 责任不明确
1.3.5.3. 缺乏沟通
1.3.5.4. 背黑锅
1.3.5.5. 员工问题
1.3.6. 怎样根治踢皮球
1.3.6.1. 调整组织架构
1.3.6.2. 禁止追查问题源头
1.3.6.3. 不懂技术的管理
1.3.6.4. 统一目标,价值观。
1.3.6.5. 防止问题扩大
1.4. 内部外包与悬赏
1.4.1. 怎么样操作
1.4.2. 可能遇到的问题
1.4.3. 小结
1.5. 团队膨胀的原因分析
1.5.1. 人才管理
1.5.1.1. 先从员工个人谈起
1.5.1.2. 技能管理
1.5.2. 再说说部门
1.5.2.1. 部门膨胀
1.5.3. 精细化管理带来的膨胀
2. 时间管理
2.1. 优先级管理
2.2. 时间管理的误区
2.2.1. 优化组织架构,精简机构
2.2.2. 命令决策一元化
2.2.3. 时间线
2.3. 项目管理中工时计算的问题
2.3.1. 背景
2.3.2. 面临的问题
2.3.3. 工时去了哪里?
2.3.3.1. 洗手间,茶水间,吸烟
2.3.3.2. 看邮件,写邮件
2.3.3.3. 沟通
2.3.3.4. 查资料
2.3.3.5. 无关的会议
2.3.3.6. 不必要的拖延行为
2.3.3.7. 私人时间
2.3.4. 怎样改善面临的问题
2.3.5. 怎样计算项目工时?
2.4. 项目延期
2.5. 当日事当日毕
2.5.1. 工作时间如何规划?
2.5.2. 遇到工作被打断的情况
3. 沟通管理(Communication Management)
3.1. 表达方式
3.1.1. 如何提问
3.1.2. 拒绝反问和质问
3.1.3. 宽以律己,严以待人
3.1.4. 任务分配
3.1.5. 任务确认
3.2. 会议管理
3.2.1. 什么要开会?
3.2.2. 会议的时间成本
3.2.3. 集思广益纯属扯淡
3.2.4. 会议冲突
3.2.5. 避免议而不决
3.2.6. 会议记录
3.2.7. 会议地点
3.2.8. 与会人员
3.2.9. 怎样管理会议的时间呢?
3.3. 工作报告
3.3.1. 日报、周报,项目进度汇报
3.3.2. 为什么会出现频繁汇报?
3.3.3. 如何才能抛弃汇报制度?
3.4. 越级和跨部门沟通
3.5. 负面信息处理
4. 变更管理(Change Management)
4.1. 什么是变更管理
4.2. 需求变更
4.2.1. 为什么会变更
4.3. 拥抱变更
5. 集成管理
5.1. 配置管理
5.2. 为什么持续集成难以普及
6. 质量管理
6.1. 无缺点管理
6.2. 自动化测试如何破局?
6.2.1. 认知问题
6.2.2. 生态的问题
6.2.3. 技术的问题
6.2.4. 能力问题
6.2.5. 氛围问题
6.2.6. 最后
6.3. 为什么自动化测试难以推广
6.3.1. 为什么自动化测试难以实施
6.3.2. 是什么阻碍了自动化测试?
6.3.3. 中国测试人员的人力成本
7. 风险管理
7.1. 项目管理绕不开问题
7.1.1. 开发,测试与运维的关系
7.1.2. 压力问题
7.1.3. 重速度轻安全
7.1.4. 技术实力
7.1.5. 测试问题
7.1.6. 运维问题
7.2. 程序猿说的「优化」是什么意思?
7.2.1. 经验和能力不足
7.2.2. 给前人擦屁股
7.2.3. 先盖楼,后打地基
7.2.4. 使用新技术和不熟悉的技术
7.2.5. 最后总结
7.3. 制度、流程和规范的误区
7.3.1. 故事一
7.3.2. 故事二
7.3.3. 故事三
7.3.4. 故事四
7.3.5. 故事五
7.3.6. 总结
7.3.7. 案例分析:怎样避免电梯伤人事件再发生
7.4. 因果图在运维工作中的应用
7.4.1. 故障树分析(Fault Tree Analysis,FTA)
7.4.2. 什么是因果图
7.4.3. 为什么使用因果图
7.4.4. 何时使用因果图
7.4.5. 何处使用因果图
7.4.6. 谁来负责制作因果图
7.4.7. 怎样使用因果图
7.4.7.1. www.example.com, img.example.com
7.4.7.2. acc.example.com, api.example.com
7.4.7.3. cch.exampel.com, mq.exampe.com, db.example.com
7.5. Incident Management(突发事件管理)
7.5.1. 突发事件处理流程
7.5.2. 事件处理方式
7.6. 监控的艺术
7.6.1. 背景
7.6.2. 概述
7.6.3. 怎样监控
7.6.3.1. 卫星监测
7.6.3.2. 逐级诊断
7.6.3.3. 模拟人工
7.6.3.4. 数据分析
7.6.3.5. 监控与开发
7.6.4. 总结
8. 成本管理
8.1. 警惕IT黑洞
8.1.1. 什么是IT黑洞
8.1.2. IT黑洞产生的原因分析
8.1.2.1. 人的因素
8.1.2.2. 来自组织架构的问题
9. 人力资源管理
9.1. 面试流程
9.2. 技术面试
9.3. 网络工程师面试题
9.3.1. Junior
9.3.2. Senior Network Engineer 高级网络工程师
9.4. 运维工程师面试题
9.4.1. Junior
9.4.2. 高级运维工程师
9.5. 软件工程师面试题
9.5.1. Junior Software Engineer
9.5.2. Senior Software Engineer
9.6. 架构师面试题
9.7. 数据库管理员
9.8. 测试工程师
10. 采购管理
II. 项目管理工具
11. Gitlab 项目管理
11.1. GitLab 安装与配置
11.1.1. CentOS 8 Stream 安装 Gitlab
11.1.2. Docker 方式安装 Gitlab
11.1.2.1. docker-compose 安装
11.1.3. Yum 安装 GitLab
11.1.3.1. GitLab Runner
11.1.4. 绑定SSL证书
11.1.5. Gitlab 命令行
11.1.5.1. gitlab-rake 命令
11.1.6. gitlab-runner 命令
11.2. 初始化 Gitlab
11.2.1. 操作系统初始化
11.2.1.1. gitlab-runner
11.2.1.2. Docker
11.2.1.3. Java 环境 安装脚本
11.2.1.4. Node 环境
11.2.2. 创建用户
11.2.2.1. 创建用户
11.2.3. 初始化组
11.2.4. 初始化标签
11.2.5. 初始化分支
11.2.6. 部署环境
11.3. 项目管理
11.3.1. 组织架构
11.3.1.1. 开发、测试和运维三个部门的关系
11.3.1.2. 权限角色
11.3.2. 项目计划
11.3.3. 工作流
11.3.4. 议题
11.3.4.1. Milestones 里程碑
11.3.4.2. 修正路线图(Roadmap)
11.3.4.3. 工作报告
11.3.4.4. 5W2H 任务分配法则
11.3.4.5. 任务/议题
11.3.5. 并行开发
11.3.5.1. 任务分解
11.3.5.2. 配套环境
11.3.5.3. 代码分支
11.3.5.4. 前滚和后滚
11.3.5.5. 提交代码怎样写注释信息
11.3.6. 升级与发布相关
11.3.6.1. 分支与版本的关系
11.3.6.2. 分支与标签的区别
11.3.6.3. Release Notes
11.3.6.4. License
11.3.7. 代码审查
11.3.7.1.
11.4. 通过GPG签名提交代码
11.4.1. 创建证书
11.4.2. 配置 Gitlab GPG
11.4.3. 配置 Git
11.4.3.1. 全局配置
11.4.3.2. 本地配置
11.4.3.3. 提交代码
11.4.4. FAQ
11.4.4.1. error: gpg failed to sign the data
11.5. CI / CD
11.5.1. 远程服务器配置
11.5.2. 配置 CI / CD
11.5.2.1. 安装 GitLab Runner
11.5.2.2. 注册 gitlab-runner
11.5.2.3. 并发链接数设置
11.5.3. Shell 执行器
11.5.3.1. 注册 Gitlab Runner 为 Shell 执行器
11.5.3.2. 生成 SSH 证书
11.5.3.3. 数据库环境
11.5.3.4. Java 环境
11.5.3.5. NodeJS
11.5.3.6. Python 环境
11.5.3.7. 远程执行 sudo 提示密码
11.5.4. tags 的使用方法
11.5.5. Docker 执行器
11.5.6. JaCoCo
11.5.7. 数据库结构监控
11.5.7.1. 什么是数据库结构版本控制
11.5.7.2. 为什么要做数据库结构本版控制
11.5.7.3. 何时做数据库结构本版控制
11.5.7.4. 在哪里做数据库结构本版控制
11.5.7.5. 谁来负责数据库结构本版控制
11.5.7.6. 怎样做数据库结构本版控制
11.5.7.7. CI/CD 配置
11.6. Pipeline 流水线
11.6.1. cache
11.6.1.1. Cache Key
11.6.1.2. 禁用 Cache
11.6.1.3. 定义多个缓存
11.6.2. stages
11.6.2.1. 依赖关系
11.6.2.2. 禁用 stage
11.6.3. variables
11.6.3.1. 列出所有环境变量
11.6.3.2. Git submodule
11.6.4. script /before_script / after_script
11.6.4.1. 条件判断
11.6.4.2. 多行脚本
11.6.5. only and except
11.6.5.1. 匹配 feature / hotfix 分支
11.6.5.2. 监控文件变化
11.6.6. 构建物
11.6.7. 允许失败
11.6.8. 定义何时开始job
11.6.9. services
11.6.10. tags
11.6.11. rules 规则
11.6.11.1. 条件判断
11.6.12. include 包含
11.6.13. 模版
11.6.14. release
11.6.15. 应用案例
11.6.15.1. Java
11.6.15.2. Node
11.6.15.3. vue.js android
11.6.15.4. Python
11.6.15.5. docker
11.7. 软件包与镜像库
11.7.1. Maven 仓库
11.7.1.1. 将已存在的 JAR 文件部署到 Maven 仓库
11.7.2. Python Pypi 仓库
11.7.2.1. 个人访问令牌
11.7.2.2. 手工上传包
11.7.2.3. 在持续集成中配置
11.7.3. Node JS
11.7.4. Docker registry
11.7.4.1. 配置 Docker registry
11.7.4.2. 手动构建镜像并上传至容器镜像库
11.7.4.3. CI/CD 流水线配置
11.8. WebHook
11.9. FAQ
11.9.1. 查看日志
11.9.2. debug runner
11.9.3. gitolite 向 gitlab 迁移
11.9.4. 修改主机名
11.9.5. ERROR: Uploading artifacts as "archive" to coordinator... too large archive
12. Jenkins
12.1. 安装 Jenkins
12.1.1. OSCM 一键安装
12.1.2. Mac
12.1.3. CentOS
12.1.4. Ubuntu
12.1.5. Docker
12.1.6. Minikube
12.2. 配置 Jenkins
12.3. Jenkinsfile
12.3.1. Jenkinsfile - Declarative Pipeline
12.3.1.1. stages
12.3.1.2. script
12.3.1.3. junit
12.3.1.4. withEnv
12.3.1.5. parameters
12.3.1.6. options
12.3.1.7. triggers
12.3.1.8. tools
12.3.1.9. post
12.3.1.10. when 条件判断
12.3.1.11. 抛出错误
12.3.1.12. withCredentials
12.3.1.13. withMaven
12.3.1.14. isUnix() 判断操作系统类型
12.3.1.15. Jenkins pipeline 中使用 sshpass 实现 scp, ssh 远程运行
12.3.2. Jenkinsfile - Scripted Pipeline
12.3.2.1. git
12.3.2.2. 切换 JDK 版本
12.3.2.3. groovy
12.3.2.4. Groovy code
12.3.2.5. Ansi Color
12.3.2.6. 写文件操作
12.3.2.7. modules 实现模块
12.3.2.8. docker
12.3.2.9. input
12.3.2.10. if 条件判断
12.3.2.11. Docker
12.3.2.12. conditionalSteps
12.3.2.13. nexus
12.3.3. 设置环境变量
12.3.3.1. 系统环境变量
12.3.4. agent
12.3.4.1. label
12.3.4.2. docker
12.3.4.3. Dockerfile
12.3.5. Steps
12.3.5.1. parallel 平行执行
12.3.5.2. echo
12.3.5.3. catchError 捕获错误
12.3.5.4. 睡眠
12.3.5.5. 限制执行时间
12.3.5.6. 时间截
12.3.6. 版本控制
12.3.6.1. checkout
12.3.6.2. Git
12.3.7. 节点与过程
12.3.7.1. sh
12.3.7.2. Windows 批处理脚本
12.3.7.3. 分配工作空间
12.3.7.4. node
12.3.8. 工作区
12.3.8.1. 变更目录
12.3.8.2. 判断文件是否存在
12.3.8.3. 分配工作区
12.3.8.4. 清理工作区
12.3.8.5. 递归删除目录
12.3.8.6. 写文件
12.3.8.7. 读文件
12.4. Jenkins Job DSL / Plugin
12.5. Jenkins Plugin
12.5.1. Blue Ocean
12.5.2. Locale Plugin (国际化插件)
12.5.3. github-plugin 插件
12.5.4. Docker
12.5.4.1. 设置 Docker 主机和代理
12.5.4.2. 持久化
12.5.5. JaCoCo
12.5.5.1. Pipeline
12.5.6. SSH Pipeline Steps
12.5.7. Rancher
12.5.8. Kubernetes 插件
12.5.8.1. Kubernetes
12.5.8.2. Kubernetes :: Pipeline :: Kubernetes Steps
12.5.8.3. Kubernetes Continuous Deploy
12.5.8.4. Kubernetes Cli
12.5.9. HTTP Request Plugin
12.5.10. Skip Certificate Check plugin
12.5.11. Android Sign Plugin
12.6. Jenkinsfile Pipeline Example
12.6.1. Maven 子模块范例
12.6.2. 使用指定镜像构建
12.6.3. 命令行制作 Docker 镜像
12.6.4. Yarn
12.6.5. Android
13. SonarQube
13.1. 安装
13.1.1. Docker
13.1.2. netkiller-devops 安装
13.1.3. SonarScanner
13.1.3.1. Docker 安装
13.1.3.2. 本地安装
13.2. 配置
13.2.1. 登陆 SonarQube
13.2.2. 本地 maven 执行 SonarQube
13.2.3. 集成 Gitlab
13.2.4. SonarScanner
13.2.4.1. Node.js
13.3. FAQ
13.3.1. bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
13.3.2. failed: An API incompatibility was encountered while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.0.2155:sonar: java.lang.UnsupportedClassVersionError: org/sonar/batch/bootstrapper/EnvironmentInformation has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
13.3.3. [ERROR] An unknown compilation problem occurred
13.3.4. can't have 2 modules with the following key
14. 持续集成工具
14.1. Code Review
14.1.1. Phabricator - an open source, software engineering platform
14.1.2. Gerrit
14.1.3. TeamCity
14.2. Nexus Repository OSS
14.2.1. 安装 Nexus
14.2.1.1. Docker
14.2.2. Nexus UI
14.2.3. maven 设置
14.2.4. Node.js
14.2.5. Ruby
16. TRAC
16.1. Ubuntu 安装
16.1.1. source code
16.1.2. easy_install
16.1.3. Apache httpd
16.2. CentOS 安装
16.2.1. trac.ini
16.2.2. standalone
16.2.3. Using Authentication
16.2.4. trac-admin
16.2.4.1. Permissions
16.2.4.2. Resync
16.3. Project Environment
16.3.1. Sqlite
16.3.2. MySQL
16.3.3. Plugin
16.3.3.1. AccountManagerPlugin
16.3.3.2. Subtickets
16.4. trac.ini
16.4.1. repository
16.4.2. attachment 附件配置
16.5. trac-admin
16.5.1. adduser script
16.6. Trac 项目管理
16.6.1. Administration
16.6.1.1. General
16.6.1.2. Ticket System
16.6.1.3. Version Control
16.6.2. Wiki
16.6.3. Timeline
16.6.4. Roadmap
16.6.5. Ticket
16.7. FAQ
16.7.1. TracError: Cannot load Python bindings for MySQL
16.8. Apache Bloodhound
17. Redmine
17.1. CentOS 安装
17.2. Redmine 运行
17.3. 插件
17.3.1. workflow
18. TUTOS
III. 软件版本控制
19. Git - Fast Version Control System
19.1. Repositories 仓库管理
19.1.1. initial setup
19.1.2. 克隆代码
19.1.3. git-checkout - Checkout and switch to a branch
19.1.3.1. checkout master
19.1.3.2. checkout 分支
19.1.3.3. 通过 checkout 找回丢失的文件
19.1.4. Creating and Commiting
19.1.5. Manager remote
19.1.6. Status
19.1.7. Diff
19.1.7.1. --name-only 仅显示文件名
19.1.8. Cloning
19.1.9. Push
19.1.10. Pull
19.1.11. fetch
19.1.12. Creating a Patch
19.1.13. reset
19.1.13.1. 还原文件
19.2. 分支管理
19.2.1. 查看本地分支
19.2.2. 创建分支
19.2.3. 删除分支
19.2.4. 切换分支
19.2.5. 重命名分支
19.2.6. git-show-branch - Show branches and their commits
19.3. Sharing Repositories with others
19.3.1. Setting up a git server
19.3.2. 修改 origin
19.3.3. 删除 origin
19.4. 合并分支
19.4.1. 合并分支
19.4.2. rebase
19.4.3. 合并分支解决冲突
19.4.4. 终止合并
19.4.5. 合并单个文件
19.5. git log
19.5.1. 一行显示 --oneline
19.5.2. 查看文件历史记录
19.6. reflog
19.7. git-show - Show various types of objects
19.7.1. 查看指定版本的文件内容
19.8. Submodule 子模块
19.8.1. 添加模块
19.8.2. checkout 子模块
19.8.3. 删除子模块
19.9. Git Large File Storage
19.9.1. 安装 LFS 支持
19.9.2. LFS lock
19.10. command
19.10.1. hash-object
19.10.2. git-add - Add file contents to the index
19.10.3. git-status - Show the working tree status
19.10.4. git-commit - Record changes to the repository
19.10.5. git config
19.11. git-daemon 服务器
19.11.1. git-daemon - A really simple server for git repositories
19.11.2. git-daemon-sysvinit
19.11.3. inet.conf / xinetd 方式启动
19.11.4. git-daemon-run
19.11.5. Testing
19.12. git config
19.12.1. 查看配置
19.12.2. 编辑配置
19.12.3. 替换配置项
19.12.4. GPG签名
19.12.5. core.sshCommand
19.12.6. fatal: The remote end hung up unexpectedly
19.12.7. 忽略 SSL 检查
19.13. git-svn - Bidirectional operation between a single Subversion branch and git
19.14. .gitignore
19.15. .gitattributes
19.15.1. SVN Keywords
19.16. gitolite - SSH-based gatekeeper for git repositories
19.16.1. gitolite-admin
19.16.1.1. gitolite.conf
19.17. Web Tools
19.17.1. viewgit
19.18. FAQ
19.18.1. 导出最后一次修改过的文件
19.18.2. 导出指定版本区间修改过的文件
19.18.3. 回撤提交
19.18.4. 撤回单个文件提交
19.18.5. 每个项目一个证书
19.18.6. fatal: Not possible to fast-forward, aborting.
20. Subversion
20.1. Invoking the Server
20.1.1. Installing
20.1.1.1. Ubuntu
20.1.1.2. CentOS 5
20.1.1.3. CentOS 6
20.1.2. standalone “daemon” process
20.1.2.1. starting subversion for debian/ubuntu
20.1.2.2. starting subversion daemon script for CentOS/Radhat
20.1.3. classic Unix-like inetd daemon
20.1.4. hooks
20.1.4.1. post-commit
20.1.5. WebDav
20.1.5.1. davfs2 - mount a WebDAV resource as a regular file system
20.2. repository 管理
20.2.1. create repository
20.2.2. user admin
20.2.3. authz
20.2.4. dump
20.3. 使用Subversion
20.3.1. Initialized empty subversion repository for project
20.3.2. ignore
20.3.3. 关键字替换
20.3.4. lock 加锁/ unlock 解锁
20.3.5. import
20.3.6. export 指定版本
20.3.7. 修订版本关键字
20.3.8. 恢复旧版本
20.4. branch
20.4.1. create
20.4.2. remove
20.4.3. switch
20.4.4. merge
20.4.5. relocate
20.5. FAQ
20.5.1. 递归添加文件
20.5.2. 清除项目里的所有.svn目录
20.5.3. color diff
20.5.4. cvs2svn
20.5.5. Macromedia Dreamweaver MX 2004 + WebDAV +Subversion
20.5.6. 指定用户名与密码
21. cvs - Concurrent Versions System
21.1. installation
21.1.1. chroot
21.2. cvs login | logout
21.3. cvs import
21.4. cvs checkout
21.5. cvs update
21.6. cvs add
21.7. cvs status
21.8. cvs commit
21.9. cvs remove
21.10. cvs log
21.11. cvs annotate
21.12. cvs diff
21.13. rename file
21.14. revision
21.15. cvs export
21.16. cvs release
21.17. branch
21.17.1. milestone
21.17.2. patch branch
21.18. keywords
22. Miscellaneous
22.1. 代码托管
22.1.1. sourceforge.net
22.1.1.1. http://netkiller.users.sourceforge.net/ 页面
22.1.2. Google Code
22.1.3. GitHub
22.1.3.1. 首次操作
22.1.3.2. clone 已经存在的仓库
22.2. GUI
22.2.1. TortoiseSVN
22.2.2. TortoiseGit
22.3. Browser interface for CVS and SVN version control repositories

范例清单

11.1. Docker 部署 GitLab 查看登陆密码
11.2. Docker 部署 gitlab-runner 注册演示
11.3. Example - Release Notes
12.1. Shell Docker 示例
13.1. SonarQube pom.xml 配置
20.1. authz