1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
|
# sonar-docs
### General
The documentation content lives in `sonar-enterprise/server/sonar-docs`
We use an augmented GitHub markdown syntax:
- general: https://guides.github.com/features/mastering-markdown/
- general: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet
- linebreaks: https://gist.github.com/shaunlebron/746476e6e7a4d698b373
## The first time
- Install nodejs v10, which is the current LTS version.
- Install https://yarnpkg.com/en
- Set the following properties in `~/.gradle/gradle.properties`:
- `artifactoryUsername=<Artifactory username>`
- `artifactoryPassword=<Artifactory API key>`
- Run the following to set up the dev servers:
```
cd sonar-enterprise/server/sonar-web
yarn
cd ../sonar-docs
yarn
```
## Each time
Start a SonarQube server (yarn needs this running).
To start the SonarQube Embedded docs dev server on port 3000:
```
cd sonar-enterprise/server/sonar-web
yarn start
```
To start the SonarCloud Embedded docs dev server on port 3001:
```
cd sonar-enterprise/server/sonar-web
INSTANCE=SonarCloud PORT=3001 yarn start
```
_You can have both SonarQube and SonarCloud embedded doc dev server running in parallel when you start them on different ports._
To start the Static docs dev server on port 8000:
```
cd sonar-enterprise/server/sonar-docs
yarn develop
```
## Testing
As documentation writers there are two ways it is possible for us to break the SonarQube build
- malformed markup
- broken links
Even without spinning up servers, you can double-check that your changes won't break the build.
**Test everything**
You can run all the tests, and make sure that both your markup is well-formed and your links are correct by running the build script:
```
cd sonar-enterprise/
./build.sh -x test -x obfuscate
```
**Test links only**
If you only want to double-check your links changes, you can
```
cd sonar-enterprise/server/sonar-docs
yarn jest
```
This will run the broken link test and stop at the first broken link it finds. Continue running this iteratively until it passes.
## Committing
**Always start your commit message with "DOCS".**
The convention is to start commit messages with the ticket number the changes are for. Since docs changes are often made without tickets, use "DOCS" instead.
## Navigation trees
Controlling the navigation trees of the tree instances is covered in [static/README.md](static)
## Writing docs
### URLs
All urls _must_ end with a trailing slash (`/`).
### Header
Each documentation file should contain a header at the top of the file delimited by "---" top and bottom. The header holds file metadata:
- The `title` tag defines the title of the page.
- The `url` tag is required and defines the path at which to publish the page. Reminder: end this with a trailing slash.
- The `nav` tag is optional and controls the title of the page inside the navigation tree.
Ex.:
```
---
title: Demo page
nav: Demo
url: /sonarcloud-pricing/
---
```
**Metadata conventions**
- Metadata tags can appear in any order, but by convention, `title` should come first.
- The `url` tag is required, and should start and end with `/`
### Includes
Basic syntax: `@include tooltips/quality-gates/quality-gate`
- path omits trailing '.md'
- path starts from 'src', regardless of where the including page is.
### Conditional Content
With special comments you can mark a page or a part of the content to be displayed only on SonarCloud, SonarQube or the static documentation website.
To drop in "SonarQube" or "SonarCloud" as appropriate, use:
```
{instance}
```
To display/hide some other part of the content, use special comments:
```md
<!-- sonarcloud -->
this content is displayed only on SonarCloud
<!-- /sonarcloud -->
<!-- sonarqube -->
this content is displayed in SonarQube and in the static website
<!-- /sonarqube -->
<!-- static -->
this content is displayed only in the static website
<!-- /static -->
<!-- embedded -->
this content is displayed only in the embedded documentation
<!-- /embedded -->
```
You can also use these comments inline:
```md
this content is displayed on <!-- sonarcloud -->SonarCloud<!-- /sonarcloud --><!-- sonarqube -->SonarQube<!-- /sonarqube -->
```
### Formatting
#### Links
- External page (automatically opens in a new tab): `[Link text](https://www.sonarsource.com/)`
- Another documentation page: `[Link text](/short-lived-branches/)`
- path omits trailing '.md'
- links inside tooltips always open in a new tab
- Internal SonarCloud app page: `[Link text](/#sonarcloud#/onboarding)`
- it is possible to reference app pages only inside SonarCloud documentation page (`scope: sonarcloud`), because these links are not valid on the static documentation
#### Smart Links
Use this syntax to conditionally link from the embedded docs to pages within the SonarQube application. Specifically, in the static website links will be suppressed, but the link text will be shown. In the embedded documentation, administrative links will only be linked for administrative users.
- Internal SonarQube app page: `[Link text](/#sonarqube#/...)`
- On SonarCloud, only the link text will be displayed, not wrapped into a link tag
- Internal SonarQube app page: `[Link text](/#sonarqube-admin#/...)`
#### Linebreaks
By default, single linebreaks are removed in rendering. I.e.
```
foo
bar
baz
```
Will render as
```
foo bar baz
```
To get a `<br/>` effect, add 2 spaces at the end of the line
```
foo //<- 2 spaces
bar //<- 2 spaces
baz
```
Yields
```
foo
bar
baz
```
#### Collapsible block
Basic syntax:
```
[[collapse]]
| ## Block title
| Block content
```
The first line of the block must be a title. You can have as many lines as you want after that.
#### Images
Basic syntax: `![alt text.](/images/short-lived-branch-concept.png)`
- images are auto-sized to 100% if they're larger than 100%
- paths start from 'src', regardless of where the calling page is
#### Icons
- :warning: `![](/images/exclamation.svg)`
- :information_source: `![](/images/info.svg)`
- :heavy_check_mark: `![](/images/check.svg)`
- :x: `![](/images/cross.svg)`
#### Message box
Basic syntax:
```
[[warning]]
| This is a **warning** message.
```
**There must be a linebreak before the first '|'**
There are four options:
- danger (red)
- warning (yellow)
- success (green)
- info (blue)
#### Iframes
_Note: at this time, iframes are only supported for the static documentation, and will be stripped from the embedded documentation._
You can add iframes directly in the source:
```html
<iframe src="http://www.sonarsource.com"></iframe>
```
Make sure to leave an empty line _after_ the closing tag, otherwise formatting of the following line could be incorrect:
_Incorrect:_
```md
<iframe src="http://www.sonarsource.com"></iframe>
*Lorem ipsum* dolor sit amet.
```
_Correct:_
```md
<iframe src="http://www.sonarsource.com"></iframe>
*Lorem ipsum* dolor sit amet.
```
By default, an iframe will have a height of 150px (as per browser specs). You can override this by adding a `height` attribute:
```html
<iframe src="http://www.sonarsource.com" height="400px"></iframe>
```
You cannot change the width, which is always 100%.
Note that an iframe is **not** a self-closing tag. This means that the following syntax _won't work_ and will break the page in unexpected ways:
```html
<iframe src="http://www.sonarsource.com" />
```
#### Dynamic Scanner Version Info
_Only supported by the static documentation_
You can dynamically include a scanner version block to any page, using the following special tag:
```html
<update-center updatecenterkey="SCANNER_KEY"></update-center>
```
For example, for gradle's scanner, use:
```html
<update-center updatecenterkey="sonargradle"></update-center>
```
You can include multiple boxes per page, if needed.
## URL Rewrites
The code in this section replaces 0-n pages that used to live on Confluence. To ease the transition (search results, user bookmarks, etc.) we've put server-level redirects in place from the old Confluence pages to the static site. Those redirects are maintained here:
* https://github.com/SonarSource/marlin/blob/master/ansible/installs/docs.yml
* https://github.com/SonarSource/marlin/blob/master/ansible/installs/docs3.yml
* https://github.com/SonarSource/test-infra/blob/master/tests/docs_sonarqube_org_test.py
|