]> granicus.if.org Git - icinga2/blob - CONTRIBUTING.md
Rename branch schema from `fix/` to `bugfix/`
[icinga2] / CONTRIBUTING.md
1 # <a id="contributing"></a> Contributing
2
3 Icinga is an open source project and lives from your ideas and contributions.
4
5 There are many ways to contribute, from improving the documentation, submitting
6 bug reports and features requests or writing code to add enhancements or fix bugs.
7
8 #### Table of Contents
9
10 1. [Introduction](#contributing-intro)
11 2. [Fork the Project](#contributing-fork)
12 3. [Branches](#contributing-branches)
13 4. [Commits](#contributing-commits)
14 5. [Pull Requests](#contributing-pull-requests)
15 6. [Testing](#contributing-testing)
16 7. [Source Code Patches](#contributing-patches-source-code)
17 8. [Documentation Patches](#contributing-patches-documentation)
18 9. [Contribute CheckCommand Definitions](#contributing-patches-itl-checkcommands)
19 10. [Review](#contributing-review)
20
21 ## <a id="contributing-intro"></a> Introduction
22
23 Please consider our [roadmap](https://github.com/Icinga/icinga2/milestones) and
24 [open issues](https://github.com/icinga/icinga2/issues) when you start contributing
25 to the project.
26
27 Before starting your work on Icinga 2, you should [fork the project](https://help.github.com/articles/fork-a-repo/)
28 to your GitHub account. This allows you to freely experiment with your changes.
29 When your changes are complete, submit a [pull request](https://help.github.com/articles/using-pull-requests/).
30 All pull requests will be reviewed and merged if they suit some general guidelines:
31
32 * Changes are located in a topic branch
33 * For new functionality, proper tests are written
34 * Changes should follow the existing coding style and standards
35
36 Please continue reading in the following sections for a step by step guide.
37
38 ## <a id="contributing-fork"></a> Fork the Project
39
40 [Fork the project](https://help.github.com/articles/fork-a-repo/) to your GitHub account
41 and clone the repository:
42
43 ```
44 git clone git@github.com:dnsmichi/icinga2.git
45 cd icinga2
46 ```
47
48 Add a new remote `upstream` with this repository as value.
49
50 ```
51 git remote add upstream https://github.com/icinga/icinga2.git
52 ```
53
54 You can pull updates to your fork's master branch:
55
56 ```
57 git fetch --all
58 git pull upstream HEAD
59 ```
60
61 Please continue to learn about [branches](CONTRIBUTING.md#contributing-branches).
62
63 ## <a id="contributing-branches"></a> Branches
64
65 Choosing a proper name for a branch helps us identify its purpose and possibly
66 find an associated bug or feature.
67 Generally a branch name should include a topic such as `bugfix` or `feature` followed
68 by a description and an issue number if applicable. Branches should have only changes
69 relevant to a specific issue.
70
71 ```
72 git checkout -b bugfix/service-template-typo-1234
73 git checkout -b feature/config-handling-1235
74 ```
75
76 Continue to apply your changes and test them. More details on specific changes:
77
78 * [Source Code Patches](#contributing-patches-source-code)
79 * [Documentation Patches](#contributing-patches-documentation)
80 * [Contribute CheckCommand Definitions](#contributing-patches-itl-checkcommands)
81
82 ## <a id="contributing-commits"></a> Commits
83
84 Once you've finished your work in a branch, please ensure to commit
85 your changes. A good commit message includes a short topic, additional body
86 and a reference to the issue you wish to solve (if existing).
87
88 Fixes:
89
90 ```
91 Fix problem with notifications in HA cluster
92
93 There was a race condition when restarting.
94
95 refs #4567
96 ```
97
98 Features:
99
100 ```
101 Add ITL CheckCommand printer
102
103 Requires the check_printer plugin.
104
105 refs #1234
106 ```
107
108 You can add multiple commits during your journey to finish your patch.
109 Don't worry, you can squash those changes into a single commit later on.
110
111 ## <a id="contributing-pull-requests"></a> Pull Requests
112
113 Once you've commited your changes, please update your local master
114 branch and rebase your bugfix/feature branch against it before submitting a PR.
115
116 ```
117 git checkout master
118 git pull upstream HEAD
119
120 git checkout bugfix/notifications
121 git rebase master
122 ```
123
124 Once you've resolved any conflicts, push the branch to your remote repository.
125 It might be necessary to force push after rebasing - use with care!
126
127 New branch:
128 ```
129 git push --set-upstream origin bugfix/notifications
130 ```
131
132 Existing branch:
133 ```
134 git push -f origin bugfix/notifications
135 ```
136
137 You can now either use the [hub](https://hub.github.com) CLI tool to create a PR, or nagivate
138 to your GitHub repository and create a PR there.
139
140 The pull request should again contain a telling subject and a reference
141 with `fixes` to an existing issue id if any. That allows developers
142 to automatically resolve the issues once your PR gets merged.
143
144 ```
145 hub pull-request
146
147 <a telling subject>
148
149 fixes #1234
150 ```
151
152 Thanks a lot for your contribution!
153
154
155 ### <a id="contributing-rebase"></a> Rebase a Branch
156
157 If you accidentally sent in a PR which was not rebased against the upstream master,
158 developers might ask you to rebase your PR.
159
160 First off, fetch and pull `upstream` master.
161
162 ```
163 git checkout master
164 git fetch --all
165 git pull upstream HEAD
166 ```
167
168 Then change to your working branch and start rebasing it against master:
169
170 ```
171 git checkout bugfix/notifications
172 git rebase master
173 ```
174
175 If you are running into a conflict, rebase will stop and ask you to fix the problems.
176
177 ```
178 git status
179
180   both modified: path/to/conflict.cpp
181 ```
182
183 Edit the file and search for `>>>`. Fix, build, test and save as needed.
184
185 Add the modified file(s) and continue rebasing.
186
187 ```
188 git add path/to/conflict.cpp
189 git rebase --continue
190 ```
191
192 Once succeeded ensure to push your changed history remotely.
193
194 ```
195 git push -f origin bugfix/notifications
196 ```
197
198
199 If you fear to break things, do the rebase in a backup branch first and later replace your current branch.
200
201 ```
202 git checkout bugfix/notifications
203 git checkout -b bugfix/notifications-rebase
204
205 git rebase master
206
207 git branch -D bugfix/notifications
208 git checkout -b bugfix/notifications
209
210 git push -f origin bugfix/notifications
211 ```
212
213 ### <a id="contributing-squash"></a> Squash Commits
214
215 > **Note:**
216 >
217 > Be careful with squashing. This might lead to non-recoverable mistakes.
218 >
219 > This is for advanced Git users.
220
221 Say you want to squash the last 3 commits in your branch into a single one.
222
223 Start an interactive (`-i`)  rebase from current HEAD minus three commits (`HEAD~3`).
224
225 ```
226 git rebase -i HEAD~3
227 ```
228
229 Git opens your preferred editor. `pick` the commit in the first line, change `pick` to `squash` on the other lines.
230
231 ```
232 pick e4bf04e47 Fix notifications
233 squash d7b939d99 Tests
234 squash b37fd5377 Doc updates
235 ```
236
237 Save and let rebase to its job. Then force push the changes to the remote origin.
238
239 ```
240 git push -f origin bugfix/notifications
241 ```
242
243
244 ## <a id="contributing-testing"></a> Testing
245
246 Basic unit test coverage is provided by running `make test` during package builds.
247 Read the [INSTALL.md](INSTALL.md) file for more information about development builds.
248
249 Snapshot packages from the latest development branch are available inside the
250 [package repository](https://packages.icinga.com).
251
252 You can help test-drive the latest Icinga 2 snapshot packages inside the
253 [Icinga 2 Vagrant boxes](https://github.com/icinga/icinga-vagrant).
254
255
256 ## <a id="contributing-patches-source-code"></a> Source Code Patches
257
258 Icinga 2 is written in C++ and uses the Boost libraries. We are also using the C++11 standard where applicable (please
259 note the minimum required compiler versions in the [INSTALL.md](INSTALL.md) file.
260
261 Icinga 2 can be built on Linux/Unix nodes and Windows clients. In order to develop patches for Icinga 2,
262 you should prepare your own local build environment and know how to work with C++.
263
264 More tips:
265
266 * Requirements and source code installation for Linux/Unix is explained inside the [INSTALL.md](INSTALL.md) file.
267 * Debug requirements and GDB instructions can be found in the [documentation](https://github.com/Icinga/icinga2/blob/master/doc/20-development.md).
268 * If you are planning to develop and debug the Windows client, setup a Windows environment with [Visual Studio](https://www.visualstudio.com/vs/community/). An example can be found in [this blogpost](https://blog.netways.de/2015/08/24/developing-icinga-2-on-windows-10-using-visual-studio-2015/).
269
270 ## <a id="contributing-patches-documentation"></a> Documentation Patches
271
272 The documentation is written in GitHub flavored [Markdown](https://guides.github.com/features/mastering-markdown/).
273 It is located in the `doc/` directory and can be edited with your preferred editor. You can also
274 edit it online on GitHub.
275
276 ```
277 vim doc/2-getting-started.md
278 ```
279
280 In order to review and test changes, you can install the [mkdocs](http://www.mkdocs.org) Python library.
281
282 ```
283 pip install mkdocs
284 ```
285
286 This allows you to start a local mkdocs viewer instance on http://localhost:8000
287
288 ```
289 mkdocs serve
290 ```
291
292 Changes on the chapter layout can be done inside the `mkdocs.yml` file in the main tree.
293
294 There also is a script to ensure that relative URLs to other sections are updated. This script
295 also checks for broken URLs.
296
297 ```
298 ./doc/update-links.py doc/*.md
299 ```
300
301 ## <a id="contributing-patches-itl-checkcommands"></a> Contribute CheckCommand Definitions
302
303 The Icinga Template Library (ITL) and its plugin check commands provide a variety of CheckCommand
304 object definitions which can be included on-demand.
305
306 Advantages of sending them upstream:
307
308 * Everyone can use and update/fix them.
309 * One single place for configuration and documentation.
310 * Developers may suggest updates and help with best practices.
311 * You don't need to care about copying the command definitions to your satellites and clients.
312
313 #### <a id="contributing-itl-checkcommands-start"></a> Where do I start?
314
315 Get to know the check plugin and its options. Read the general documentation on how to integrate
316 your check plugins and how to create a good CheckCommand definition.
317
318 A good command definition uses:
319
320 * Command arguments including `value`, `description`, optional: `set_if`, `required`, etc.
321 * Comments `/* ... */` to describe difficult parts.
322 * Command name as prefix for the custom attributes referenced (e.g. `disk_`)
323 * Default values
324         * If `host.address` is involved, set a custom attribute (e.g. `ping_address`) to the default `$address$`. This allows users to override the host's address later on by setting the custom attribute inside the service apply definitions.
325         * If the plugin is also capable to use ipv6, import the `ipv4-or-ipv6` template and use `$check_address$` instead of `$address$`. This allows to fall back to ipv6 if only this address is set.
326         * If `set_if` is involved, ensure to specify a sane default value if required.
327 * Templates if there are multiple plugins with the same basic behaviour (e.g. ping4 and ping6).
328 * Your love and enthusiasm in making it the perfect CheckCommand.
329
330 #### <a id="contributing-itl-checkcommands-overview"></a> I have created a CheckCommand, what now?
331
332 Icinga 2 developers love documentation. This isn't just because we want to annoy anyone sending a patch,
333 it's a matter of making your contribution visible to the community.
334
335 Your patch should consist of 2 parts:
336
337 * The CheckCommand definition.
338 * The documentation bits.
339
340 [Fork the repository](https://help.github.com/articles/fork-a-repo/) and ensure that the master branch is up-to-date.
341
342 Create a new fix or feature branch and start your work.
343
344 ```
345 git checkout -b feature/itl-check-printer
346 ```
347
348 #### <a id="contributing-itl-checkcommands-add"></a> Add CheckCommand Definition to Contrib Plugins
349
350 There already exists a defined structure for contributed plugins. Navigate to `itl/plugins-contrib.d`
351 and verify where your command definitions fits into.
352
353 ```
354 cd itl/plugins-contrib.d/
355 ls
356 ```
357
358 If you want to add or modify an existing Monitoring Plugin please use `itl/command-plugins.conf` instead.
359
360 ```
361 vim itl/command-plugins-conf
362 ```
363
364 ##### Existing Configuration File
365
366 Just edit it, and add your CheckCommand definition.
367
368 ```
369 vim operating-system.conf
370 ```
371
372 Proceed to the documentation.
373
374 ##### New type for CheckCommand Definition
375
376 Create a new file with .conf suffix.
377
378 ```
379         $ vim printer.conf
380 ```
381
382 Add the file to `itl/CMakeLists.txt` in the FILES line in **alpha-numeric order**.
383 This ensures that the installation and packages properly include your newly created file.
384
385 ```
386 vim CMakeLists.txt
387
388 -FILES ipmi.conf network-components.conf operating-system.conf virtualization.conf vmware.conf
389 +FILES ipmi.conf network-components.conf operating-system.conf printer.conf virtualization.conf vmware.conf
390 ```
391
392 Add the newly created file to your git commit.
393
394 ```
395 git add printer.conf
396 ```
397
398 Do not commit it yet but finish with the documentation.
399
400 #### <a id="contributing-itl-checkcommands-docs"></a> Create CheckCommand Documentation
401
402 Edit the documentation file in the `doc/` directory. More details on documentation
403 updates can be found [here](CONTRIBUTING.md#contributing-documentation).
404
405 ```
406 vim doc/10-icinga-template-library.md
407 ```
408
409 The CheckCommand documentation should be located in the same chapter
410 similar to the configuration file you have just added/modified.
411
412 Create a section for your plugin, add a description and a table of parameters. Each parameter should have at least:
413
414 * optional or required
415 * description of its purpose
416 * the default value, if any
417
418 Look at the existing documentation and "copy" the same style and layout.
419
420
421 #### <a id="contributing-itl-checkcommands-patch"></a> Send a Patch
422
423 Commit your changes which includes a descriptive commit message.
424
425 ```
426 git commit -av
427 Add printer CheckCommand definition
428
429 Explain its purpose and possible enhancements/shortcomings.
430
431 refs #existingticketnumberifany
432 ```
433 Push the branch to the remote origin and create a [pull request](https://help.github.com/articles/using-pull-requests/).
434
435 ```
436 git push --set-upstream origin feature/itl-check-printer
437 hub pull-request
438 ```
439
440 In case developers ask for changes during review, please add them
441 to the branch and push those changes.
442
443 ## <a id="contributing-review"></a> Review
444
445 ### <a id="contributing-pr-review"></a> Pull Request Review
446
447 This is only important for developers who will review pull requests. If you want to join
448 the development team, kindly contact us.
449
450 - Ensure that the style guide applies.
451 - Verify that the patch fixes a problem or linked issue, if any.
452 - Discuss new features with team members.
453 - Test the patch in your local dev environment.
454
455 If there are changes required, kindly ask for an updated patch.
456
457 Once the review is completed, merge the PR via GitHub.
458
459 #### <a id="contributing-pr-review-fixes"></a> Pull Request Review Fixes
460
461 In order to amend the commit message, fix conflicts or add missing changes, you can
462 add your changes to the PR.
463
464 A PR is just a pointer to a different Git repository and branch.
465 By default, pull requests allow to push into the repository of the PR creator.
466
467 Example for [#4956](https://github.com/Icinga/icinga2/pull/4956):
468
469 At the bottom it says "Add more commits by pushing to the bugfix/persistent-comments-are-not-persistent branch on TheFlyingCorpse/icinga2."
470
471 First off, add the remote repository as additional origin and fetch its content:
472
473 ```
474 git remote add theflyingcorpse https://github.com/TheFlyingCorpse/icinga2
475 git fetch --all
476 ```
477
478 Checkout the mentioned remote branch into a local branch (Note: `theflyingcorpse` is the name of the remote):
479
480 ```
481 git checkout theflyingcorpse/bugfix/persistent-comments-are-not-persistent -b bugfix/persistent-comments-are-not-persistent
482 ```
483
484 Rebase, amend, squash or add your own commits on top.
485
486 Once you are satisfied, push the changes to the remote `theflyingcorpse` and its branch `bugfix/persistent-comments-are-not-persistent`.
487 The syntax here is `git push <remote> <localbranch>:<remotebranch>`.
488
489 ```
490 git push theflyingcorpse bugfix/persistent-comments-are-not-persistent:bugfix/persistent-comments-are-not-persistent
491 ```
492
493 In case you've changed the commit history (rebase, amend, squash), you'll need to force push. Be careful, this can't be reverted!
494
495 ```
496 git push -f theflyingcorpse bugfix/persistent-comments-are-not-persistent:bugfix/persistent-comments-are-not-persistent
497 ```