generator: add support for committees

Since committees can have private mailing lists, this commit
also adds a new field for specifying private mailing lists
in the "Contacts" section.
This commit is contained in:
Nikhita Raghunath 2019-03-15 16:33:11 +05:30
parent 010ab0ff52
commit 347f7d07d3
6 changed files with 105 additions and 8 deletions

View File

@ -1,7 +1,8 @@
# SIG Doc builder # SIG Doc builder
This folder contains scripts to automatically generate documentation about the This folder contains scripts to automatically generate documentation about the
different Special Interest Groups (SIGs) and Working Groups (WGs) of Kubernetes. The authoritative different Special Interest Groups (SIGs), Working Groups (WGs),
User Groups (UGs) and Committees of Kubernetes. The authoritative
source for SIG information is the [`sigs.yaml`](/sigs.yaml) file in the project root. source for SIG information is the [`sigs.yaml`](/sigs.yaml) file in the project root.
All updates must be done there. All updates must be done there.
@ -14,6 +15,7 @@ The documentation follows a template and uses the values from [`sigs.yaml`](/sig
- SIG README: [`sig_readme.tmpl`](sig_readme.tmpl) - SIG README: [`sig_readme.tmpl`](sig_readme.tmpl)
- WG README: [`wg_readme.tmpl`](wg_readme.tmpl) - WG README: [`wg_readme.tmpl`](wg_readme.tmpl)
- UG README: [`ug_readme.tmpl`](ug_readme.tmpl) - UG README: [`ug_readme.tmpl`](ug_readme.tmpl)
- Committee README: [`committee_readme.tmpl`](committee_readme.tmpl)
**Time Zone gotcha**: **Time Zone gotcha**:
Time zones make everything complicated. Time zones make everything complicated.
@ -24,12 +26,13 @@ Practically, that means US pacific time must be `PT (Pacific Time)`.
`PT` isn't good enough, unfortunately. `PT` isn't good enough, unfortunately.
When an update happens to the this file, the next step is to generate the When an update happens to the this file, the next step is to generate the
accompanying documentation. This takes the format of three types of doc files: accompanying documentation. This takes the format of the following types of doc files:
``` ```
sig-<sig-name>/README.md sig-<sig-name>/README.md
wg-<working-group-name>/README.md wg-<working-group-name>/README.md
ug-<user-group-name>/README.md ug-<user-group-name>/README.md
committee-<committee-name>/README.md
sig-list.md sig-list.md
``` ```
@ -64,9 +67,11 @@ make WHAT=container-identity
where the `WHAT` var refers to the directory being built. where the `WHAT` var refers to the directory being built.
## Adding custom content to your README ## Adding custom content
If your SIG or WG wishes to add custom content, you can do so by placing it within ### README
If your SIG, WG, UG or Committee wishes to add custom content, you can do so by placing it within
the following code comments: the following code comments:
```markdown ```markdown
@ -88,3 +93,14 @@ An example might be:
- Do that - Do that
<!-- END CUSTOM CONTENT --> <!-- END CUSTOM CONTENT -->
``` ```
### OWNERS_ALIASES
Similarly, custom aliases can be added in the `OWNERS_ALIASES` file by placing
it within the following code comments:
```yaml
## BEGIN CUSTOM CONTENT
## END CUSTOM CONTENT
```

View File

@ -20,3 +20,9 @@ aliases:
- {{.GitHub}} - {{.GitHub}}
{{- end}} {{- end}}
{{- end}} {{- end}}
{{- range .Committees}}
{{.Dir}}:
{{- range .Leadership.Chairs}}
- {{.GitHub}}
{{- end}}
{{- end}}

View File

@ -73,9 +73,10 @@ type Meeting struct {
// Contact represents the various contact points for a group. // Contact represents the various contact points for a group.
type Contact struct { type Contact struct {
Slack string Slack string
MailingList string `yaml:"mailing_list"` MailingList string `yaml:"mailing_list"`
GithubTeams []GithubTeams `yaml:"teams"` PrivateMailingList string `yaml:"private_mailing_list"`
GithubTeams []GithubTeams `yaml:"teams"`
} }
// GithubTeams represents a specific Github Team. // GithubTeams represents a specific Github Team.
@ -125,6 +126,7 @@ type Context struct {
Sigs []Group Sigs []Group
WorkingGroups []Group WorkingGroups []Group
UserGroups []Group UserGroups []Group
Committees []Group
} }
func pathExists(path string) bool { func pathExists(path string) bool {
@ -310,6 +312,10 @@ func main() {
return strings.ToLower(ctx.UserGroups[i].Name) <= strings.ToLower(ctx.UserGroups[j].Name) return strings.ToLower(ctx.UserGroups[i].Name) <= strings.ToLower(ctx.UserGroups[j].Name)
}) })
sort.Slice(ctx.Committees, func(i, j int) bool {
return strings.ToLower(ctx.Committees[i].Name) <= strings.ToLower(ctx.Committees[j].Name)
})
err = createGroupReadme(ctx.Sigs, "sig") err = createGroupReadme(ctx.Sigs, "sig")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@ -325,6 +331,11 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
err = createGroupReadme(ctx.Committees, "committee")
if err != nil {
log.Fatal(err)
}
fmt.Println("Generating sig-list.md") fmt.Println("Generating sig-list.md")
outputPath := filepath.Join(baseGeneratorDir, sigListOutput) outputPath := filepath.Join(baseGeneratorDir, sigListOutput)
err = writeTemplate(filepath.Join(baseGeneratorDir, templateDir, listTemplate), outputPath, "markdown", ctx) err = writeTemplate(filepath.Join(baseGeneratorDir, templateDir, listTemplate), outputPath, "markdown", ctx)

View File

@ -0,0 +1,57 @@
{{- template "header" }}
# {{.Name}} Committee
{{ .MissionStatement }}
{{- if .CharterLink }}
The [charter]({{.CharterLink}}) defines the scope and governance of the {{.Name}} Committee.
{{- end }}
{{- if .Meetings }}
## Meetings
{{- range .Meetings }}
* {{.Description}}: [{{.Day}}s at {{.Time}} {{.TZ}}]({{.URL}}) ({{.Frequency}}). [Convert to your timezone](http://www.thetimezoneconverter.com/?t={{.Time}}&tz={{.TZ | tzUrlEncode}}).
{{- if .ArchiveURL }}
* [Meeting notes and Agenda]({{.ArchiveURL}}).
{{- end }}
{{- if .RecordingsURL }}
* [Meeting recordings]({{.RecordingsURL}}).
{{- end }}
{{- end }}
{{- end }}
{{- if .Leadership }}
{{- if .Leadership.Chairs }}
## Members
{{ range .Leadership.Chairs }}
* {{.Name}} (**[@{{.GitHub}}](https://github.com/{{.GitHub}})**){{if .Company}}, {{.Company}}{{end}}
{{- end }}
{{- end }}
{{- end }}
## Contact
{{- if .Contact.Slack }}
* [Slack](https://kubernetes.slack.com/messages/{{.Contact.Slack}})
{{- end }}
{{- if .Contact.MailingList }}
* [Mailing list]({{.Contact.MailingList}})
{{- end }}
{{- if .Contact.PrivateMailingList }}
* Private Mailing List: {{.Contact.PrivateMailingList}}
{{- end }}
{{- if .Label }}
* [Open Community Issues/PRs](https://github.com/kubernetes/community/labels/ug%2F{{.Label}})
{{- end }}
{{ if .Contact.GithubTeams }}
## GitHub Teams
The below teams can be mentioned on issues and PRs in order to get attention from the right people.
Note that the links to display team membership will only work if you are a member of the org.
| Team Name | Details | Description |
| --------- |:-------:| ----------- |
{{- range .Contact.GithubTeams }}
| @kubernetes/{{.Name}} | [link](https://github.com/orgs/kubernetes/teams/{{.Name}}) | {{.Description}} |
{{- end }}
{{ end }}

View File

@ -44,3 +44,10 @@ When the need arises, a [new SIG can be created](sig-wg-lifecycle.md)
|[{{.Name}}]({{.Dir}}/README.md)|{{range .Leadership.Chairs}}* [{{.Name}}](https://github.com/{{.GitHub}}){{if .Company}}, {{.Company}}{{end}}<br>{{end}}|* [Slack](https://kubernetes.slack.com/messages/{{.Contact.Slack}})<br>* [Mailing List]({{.Contact.MailingList}})|{{range .Meetings}}* {{.Description}}: [{{.Day}}s at {{.Time}} {{.TZ}} ({{.Frequency}})]({{.URL}})<br>{{end}} |[{{.Name}}]({{.Dir}}/README.md)|{{range .Leadership.Chairs}}* [{{.Name}}](https://github.com/{{.GitHub}}){{if .Company}}, {{.Company}}{{end}}<br>{{end}}|* [Slack](https://kubernetes.slack.com/messages/{{.Contact.Slack}})<br>* [Mailing List]({{.Contact.MailingList}})|{{range .Meetings}}* {{.Description}}: [{{.Day}}s at {{.Time}} {{.TZ}} ({{.Frequency}})]({{.URL}})<br>{{end}}
{{- end }} {{- end }}
{{ end }} {{ end }}
### Master Committee List
| Name | Label | Members | Contact |
|------|--------|---------|---------|
{{- range .Committees}}
|[{{.Name}}]({{.Dir}}/README.md)|{{.Label}}|{{range .Leadership.Chairs}}* [{{.Name}}](https://github.com/{{.GitHub}}){{if .Company}}, {{.Company}}{{end}}<br>{{end}}|{{ if .Contact.Slack }}* [Slack](https://kubernetes.slack.com/messages/{{.Contact.Slack}})<br>{{ end }}{{ if .Contact.MailingList }}* [Mailing List]({{.Contact.MailingList}})<br>{{ end }}{{ if .Contact.PrivateMailingList }}* [Private Mailing List]({{.Contact.PrivateMailingList}}){{ end }}
{{- end }}

View File

@ -37,7 +37,7 @@ make 1>/dev/null
mismatches=0 mismatches=0
break=$(printf "=%.0s" $(seq 1 68)) break=$(printf "=%.0s" $(seq 1 68))
for file in $(ls ${CRT_DIR}/sig-*/README.md ${CRT_DIR}/wg-*/README.md ${CRT_DIR}/ug-*/README.md ${CRT_DIR}/sig-list.md ${CRT_DIR}/OWNERS_ALIASES); do for file in $(ls ${CRT_DIR}/sig-*/README.md ${CRT_DIR}/wg-*/README.md ${CRT_DIR}/ug-*/README.md ${CRT_DIR}/committee-*/README.md ${CRT_DIR}/sig-list.md ${CRT_DIR}/OWNERS_ALIASES); do
real=${file#$CRT_DIR/} real=${file#$CRT_DIR/}
if ! diff -q ${file} ${WORKING_DIR}/${real} &>/dev/null; then if ! diff -q ${file} ${WORKING_DIR}/${real} &>/dev/null; then
echo "${file} does not match ${WORKING_DIR}/${real}"; echo "${file} does not match ${WORKING_DIR}/${real}";