Docker Mail Server 贡献指南:从提交 Issue 到合并 Pull Request 的完整工作流

发布时间:2026/11/12 11:46:25

Docker Mail Server 贡献指南:从提交 Issue 到合并 Pull Request 的完整工作流 Docker Mail Server 贡献指南从提交 Issue 到合并 Pull Request 的完整工作流【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserverDMSDocker Mail Server是一个开源的容器化全栈邮件服务器项目SMTP、IMAP、LDAP、反垃圾、反病毒等。本篇指南围绕 issues-and-pull-requests.md 展开系统讲解 DMS 社区贡献者如何正确提交 Bug 报告、如何按官方工作流提交 Pull Request并结合仓库内的 Issue 模板、Makefile、lint 脚本与测试套件给出可直接落地的实操细节。读完本文你将掌握提交 Issue 前必须完成的自我排查清单、如何用LOG_LEVEL收集有效日志、Issue/PR 模板的具体字段要求以及从 fork、lint、测试到合并、发布:edge镜像的完整开发闭环。项目背景开源的 DMS 如何接受贡献DMS 是完全开源的因此任何人都可以参与其中增强功能enhancements、修复缺陷bug fixing或改进文档improving the documentation都是有效的贡献方式。与多数成熟开源项目一样DMS 的贡献协作发生在两个层面Issue 跟踪器用于报告缺陷、讨论新功能与提出疑问Pull Request用于提交经过验证的代码/文档改动最终合并进master分支。仓库的 README.md、CODE_OF_CONDUCT.md 与 SECURITY.md 是参与协作前应通读的基础文件。其中 SECURITY.md 规定了安全漏洞的私下报告渠道安全相关问题不应直接暴露在公开 Issue 中。提交 Issue先自助排查再找社区强制前置要求开 Issue 之前先做功课原文档明确要求在打开 Issue 之前必须依次完成以下排查仔细阅读项目的README研究与你所用版本匹配的文档文档站点提供了版本选择器建议使用latest或与镜像 tag 对应的版本查阅 Postfix 与 Dovecot 的官方文档DMS 的核心组件使用你信任的搜索引擎检索是否已有相同问题。!!! attention**Issue 跟踪器不用于回答与本项目无关的问题** 如果问题与 DMS 无关请到对应的上游项目如 Postfix、Dovecot、Rspamd寻求帮助。这一要求的背后是维护成本考量DMS 的维护者与版主都是志愿者花费大量时间改进项目、协同解决问题。因此社区期望每位报告者都遵守规则、付出努力用高质量的信息换取高效率的协作。用 LOG_LEVEL 收集可复现日志当打开 Issue 时请提供足够详细的用例use case让社区能够复现你的问题。文档给出的标准做法是以debug或trace级别启动 DMS并把输出粘贴到 Issue 中。具体实现上environment.md 定义了LOG_LEVEL环境变量它主要用于容器启动脚本与变更检测change detection事件的日志反馈有效取值按详细程度递增为error、warn、info、debug、trace默认值为info。也就是说# compose.yaml 中的典型用法 services: mailserver: image: ghcr.io/docker-mailserver/docker-mailserver:edge environment: LOG_LEVEL: trace # 或 debug从源码结构看该环境变量在容器启动阶段即被读取并在target/scripts/helpers/log.sh中驱动日志输出过滤。trace级别会在启动与配置生成阶段输出最详尽的信息是定位配置生成问题时的首选若日志量过大可先用debug缩小范围。Bug 报告模板的日志字段也提示用户可通过设置环境变量LOG_LEVEL为debug或trace来启用调试输出二者完全呼应。必须使用 Issue 模板!!! attention**请使用 Issue 模板提供必要信息。不使用模板的 Issue 不会被处理并将被直接关闭。**仓库中实际提供了三份模板与一个路由配置位于 .github/ISSUE_TEMPLATE/ 目录文件用途bug_report.yml缺陷报告含逐字段校验必填项feature_request.yml功能请求引导填写动机、方案与受众config.yml路由配置blank_issues_enabled: false即禁用空白 Issue并提供文档相关 contact link 引导用户先去查阅资料其中 config.yml 的三条 contact link 依次指向文档首页、环境变量页对应 environment.md与调试页对应 debugging.md。这再次印证了先查文档再开 Issue的项目铁律。提交 Bug 报告的正确姿势Bug 报告是社区最宝贵的输入之一。文档强调以下几点DMS 是社区驱动项目每一份贡献都算数但维护者与版主是志愿者只有通过模板提供详细信息的报告才能得到最快、最好的帮助忽略模板可能显得省事但会降低获得支持的概率——此类 Issue 会被打上meta/no template - no support标签意味着维护者不再承诺响应几乎所有文本字段都支持 Markdown 格式除非字段描述中明确说明不支持宁可多写也不要写太少——尽量精确信息不足时补充更多细节比遗漏更好若某个选项被标记为not officially supported / unsupported其支持程度取决于是否有空闲的特定维护者不应默认承诺。Bug 报告模板字段逐项解析参考 bug_report.yml一份合格的 Bug 报告至少包含 Preliminary Checks前置检查——两个必勾选项已搜索现有 Issue 并遵循调试文档建议但仍需帮助披露使用过的 AI 辅助工具报告者必须声明提交的信息中是否使用了 AI 辅助以免浪费志愿者的时间。 What Happened?——实际行为与预期的差异必填占位示例即LOG_LEVELdebug已设置但日志缺少 debug 输出 Reproduction Steps——逐步复现路径必填大段文本建议使用围栏代码块fenced code blocks格式化 DMS Version——遇到缺陷的镜像 tag必填占位提示为v12.1.0且不要写 latest Operating System and Architecture——Docker 宿主机的 OS 与架构必填占位如Debian 11 (Bullseye) x86_64、Fedora 38 ARM64同时注明 Windows 与 macOS 支持受限⚙️ Container configuration files——以 YAML 格式展示运行 DMS 的compose.yaml或docker run命令使用 Kubernetes 时可提供清单文件 Relevant log output——相关日志输出纯文本、自动渲染为代码块。在 Issue 正文中提交即同意项目条款了解 Issue 跟踪器的规则将同时帮助维护者与所有人更快找到解决方案。功能请求先讨论再动手原文档对新增功能给出了一条温和但重要的建议动手实现之前先创建 Issue 说明你想做什么、打算怎么做。理由很务实其他用户可能有相同需求讨论与协作可能带来更好的方案避免大量未经讨论的重复劳动。仓库中的 feature_request.yml 将这一思路落实为必填字段Context与 DMS 或某个组件/Issue/PR 的关联必须链接相关 Issue 与 PR、Description期望的实现方案尽量精确、Alternatives考虑过的替代方案、Applicable Users该功能对谁有用以及一个二选一的下拉框是我会实现它——因为知道别人实现它的概率低且自己能从中学习否——并理解很可能无人实现、Issue 会逐渐过时stale并被关闭。这个设计巧妙地把提需求与背责任绑定在一起从机制上减少了无人认领的僵尸需求。提交 Pull Request官方开发工作流标准流程六步走原文档给出的 PR 提交流程如下Fork 项目并克隆你的 fork使用git clone --recurse-submodules ...若已克隆则在项目根目录运行git submodule update --init --recursive。编写所需代码。必要时补充集成测试。准备环境并运行 lint 与测试对应文档 tests.md。必要时补充文档例如引入了新的环境变量需在 环境变量文档 中描述并在CHANGELOG.md的 Unreleased 一节登记改动。提交并签名push 后创建 PR 合入master请使用 Pull Request 模板提供最低限度的上下文信息并勾选清单中的每一项要求。为什么必须初始化 git submoduleDMS 的测试依赖 BATSBash Automated Testing System及其支持库这些以 submodule 形式引入。查看仓库根目录的 .gitmodules 可以看到三个子模块test/bats→ bats-core/bats-coretest/test_helper/bats-support→ bats-core/bats-supporttest/test_helper/bats-assert→ bats-core/bats-assert因此克隆 fork 时必须带上--recurse-submodules或在克隆后执行git submodule update --init --recursive否则test/bats/bin/bats不存在测试将无法运行。代码风格与 lint合并前置门槛提交代码前请遵守 general.md 中定义的编码规范调整自己的风格以适应当前已存在的风格——即使你不喜欢它这是为了全局一致性项目曾投入大量工作统一全部脚本风格使用shellcheck检查脚本——GitHub Actions CI 也会做同样检查所以本地必须先通过可以用make lint一键检查全部目标使用仓库提供的.editorconfig文件脚本使用/bin/bash而非/bin/sh。从 Makefile 看make lint会依次触发四个检查目标hadolint基于 .hadolint.yml 检查Dockerfilebashcheck对所有.sh与target/bin下的脚本执行bash -n语法校验shellcheck对脚本与.bats测试文件分别执行静态检查.bats因自定义test语法需额外排除若干规则eclint用 editorconfig-checker 校验文件格式是否符合.editorconfig。对应的实现细节见 test/linting/lint.shlint 通过 Docker 容器执行如hadolint/hadolint:v2.12.0-alpine、koalaman/shellcheck-alpine:v0.9.0、mstruebing/editorconfig-checker:2.7.2将仓库根目录只读挂载到容器内保证任何开发环境下结果一致。测试改动必须经过验证文档 tests.md 指出DMS 采用 BATS 编写单元与集成测试全部测试与相关配置位于test/目录要改动既有功能或集成新特性大概率需要与测试套件打交道。常用命令由 Makefile 提供# 构建本地测试镜像 $ make build # 运行全部测试serial 三个 parallel set $ make clean tests # 运行单个测试文件去掉 .bats 后缀 $ make clean generate-accounts test/rspamd # 运行多个不相关的测试文件用逗号分隔 $ make clean generate-accounts test/rspamd,clamav # 运行某个 parallel set 或全部 serial 测试 $ make clean generate-accounts tests/parallel/set1 $ make clean generate-accounts tests/serial相关要点并行度BATS_PARALLEL_JOBS默认值为 2见 Makefile资源充裕时可增大设为 1 可强制串行并行测试的输出延迟以并行方式运行时BATS 会推迟到文件内全部用例结束才输出结果故障定位时建议先串行复跑相关用例本地调试实例make run-local-instance可基于本地构建镜像启动一个启用LOG_LEVELtrace的实例方便边改边验证该命令默认关闭 ClamAV、Amavis、Rspamd、OpenDKIM、OpenDMARC、SpamAssassin 与 policyd-spf见 Makefile测试目录结构test/tests/parallel/并行多文件并发以缩短耗时与test/tests/serial/串行无法并发的测试两类并行测试又被细分为set1/set2/set3CI 会把这些 set 分发到多个 runner 上并行执行。文档与 CHANGELOG功能变更的售后服务若你的改动引入了新的环境变量必须在 environment.md 中补充说明该文档首页注明加粗值为默认值当前master分支对应镜像 tag:edge同时把改动登记到 CHANGELOG.md 的 Unreleased 一节。文档 general.md 还提供了本地预览文档的方法——从 git clone 的根目录执行docker run --rm -it -p 8000:8000 -v ./docs:/docs docker.io/squidfunk/mkdocs-material:9.7即可在http://localhost:8000实时预览文档每次保存都会热重载。文档站点的构建配置见 mkdocs.yml。容器日志会报告检测到的无效链接但有少量误报源于内容标签页的锚点链接用法。提交、签名与创建 PRCommit 信息建议让提交信息直接关联并关闭对应 Issuecommit message 中的关闭引用签名提交请为提交配置 GPG 签名git commit --gpg-signPR 模板务必使用 Pull Request 模板提供最低限度的上下文信息并满足清单中的全部勾选项。PR 提交后的自动验证与发布链路原文档明确了 PR 的后续流程Pull requests are automatically tested against the CI and will be reviewed when tests pass. When your changes are validated, your branch is merged. CI builds the new:edgeimage immediately and your changes will be included in the next version release.即PR 会被 CI 自动测试测试通过后进入人工评审改动验证通过后分支被合并CI 立即构建新的:edge镜像改动将包含在下一个版本发布中。从仓库的 workflow 文件可以印证这条链路位于 .github/workflows/ 目录test_merge_requests.yml针对合并请求触发测试linting.yml运行上文所述 lint 检查generic_test.yml、generic_build.yml通用构建与测试流水线generic_publish.yml构建并发布镜像master合入后产出:edgegeneric_vulnerability-scan.yml镜像漏洞扫描。另有 docs-production-deploy.yml 与 docs-preview-deploy.yml 负责文档站点的生产发布与 PR 预览部署handle_stalled.yml 则用于处理停滞的 Issue/PR。因此CI 通过 → 评审 → 合并 → 自动发布:edge是一条完全自动化的流水线贡献者只需保证本地 lint 与测试全绿。总结一份 DMS 贡献者的行动清单无论你是报告问题的用户还是提交代码的开发者都可以用下面的清单快速自查提交 Issue 前已通读 README 与对应版本的 文档已检索现有 Issue确认不是重复报告已以LOG_LEVELdebug或trace启动容器收集可复现日志使用 bug_report.yml 或 feature_request.yml 模板填写全部必填字段声明是否使用了 AI 辅助工具提交 PR 前Fork 后用git clone --recurse-submodules克隆或已执行git submodule update --init --recursive代码风格符合 general.md 与.editorconfigmake lint全部通过make clean tests或至少相关测试文件通过新环境变量已写入 environment.md改动已登记到 CHANGELOG.md 的 Unreleased提交已 GPG 签名PR 使用模板并勾选全部清单项遵循这套流程既是对维护者志愿时间的尊重也能让你的 Issue 更快得到响应、让你的代码更顺畅地进入下一个 DMS 版本。【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/11 1:21:44

Python+Vue旅游推荐系统:全栈工程实践与混合推荐落地

简介:这是一套面向计算机专业本科生的毕业设计级旅游景点推荐系统完整实现,采用Python后端(Django/Flask类框架)与Vue.js前端分离架构,解决个性化景点推荐、用户交互与数据可视化等典型Web应用问题,适用于毕…

2026/11/11 4:02:20

桌面智能体实战:让AI读写本地文件,从聊天助手到自动化执行

1. 换个角度看AI:当助手能动手,才算入了门我注意到一个很有意思的现象:大家现在说起AI,第一反应还是“聊天框问你答”。但真正的桌面智能体和聊天AI之间,隔着一条很深的河——一边是只动嘴的“顾问”,另一边…

2026/11/12 11:45:49

电工证如何分等级全国通用合格标准与通过率全解析

电工证如何分等级全国通用合格标准与通过率全解析 怕考不过白交培训费?你不是一个人。电工证是特种作业操作证中需求量最大的一种,全国通用,但很多学员最担心的就是考试不通过,培训费打水漂。别急,本文从洛阳涧西区劳务班组负责人的角度出发,详细讲讲电…

2026/11/12 11:45:49

石家庄应急局电工证多久拿证 电工证过期了不知道怎么复审延期怎么办

石家庄应急局电工证多久拿证 电工证过期了不知道怎么复审延期怎么办 证书过期了不知道怎么复审延期?你不是一个人。很多人在拿到电工证后,忙于工作或生活中其他事情,一不留神就错过了复审时间。石家庄应急局电工证是从事电工相关工作的“通行证”,一旦过…

2026/11/12 11:45:49

0经验裸考高压电工证的真实经历:工地太忙根本没时间复习考试

0经验裸考高压电工证的真实经历:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是我刚毕业那会儿的真实写照。当时在商丘的一个工地上做电工,每天从早上六点忙到晚上十点,脑子里全是线缆、配电箱、开关这些活儿,根本没时间去想考试的事。但…

2026/11/12 11:45:49

架子工特种作业操作证过期了怎么办?全国通用证书复审攻略来了

架子工特种作业操作证过期了怎么办?全国通用证书复审攻略来了 证书过期了不知道怎么复审延期?架子工特种作业操作证是全国通用的,但很多人在证书到期后,才发现补办流程并不简单,甚至因为操作不当导致证书失效,影响工作。今天咱们就来聊聊架子工特种作业…

2026/11/12 11:45:48

电工证分国网省网么多久拿证不花冤枉钱

电工证分国网省网么多久拿证不花冤枉钱 怕考不过白交培训费?电工证分国网省网么?多久拿证?很多人在报名前都担心这些问题,尤其是刚入行的学员,生怕花了钱最后拿不到证。其实,只要流程走对、准备充分,电工证办理并不难。下面我会从焦作培训机构学员的角…

2026/11/12 11:40:48

遂川电工证在哪里报名内部消息全公开,平顶山房建人必看

遂川电工证在哪里报名内部消息全公开,平顶山房建人必看 现在找电工类工作, 没有电工证连面试资格都没 ,尤其是在平顶山从事房建工程的你,电工证是刚需。很多人跑遍了遂川,却不知道哪儿才是正规报名渠道, 内部消息…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/12 9:51:42

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑