diff --git a/build/Dockerfile b/build/Dockerfile new file mode 100644 index 000000000..e07f42e4c --- /dev/null +++ b/build/Dockerfile @@ -0,0 +1 @@ +FROM golang:1.6-onbuild diff --git a/build/README.md b/build/README.md new file mode 100644 index 000000000..97e075f64 --- /dev/null +++ b/build/README.md @@ -0,0 +1,19 @@ +# SIG Doc builder + +This script will generate the following documentation files: + +``` +sig-*/README.md +sig-list.md +``` + +Based off the `sigs.yaml` metadata file. + +## How to use + +To (re)build documentation for all the SIGs, run these commands: + +```bash +docker build -t sigdocs -f build/Dockerfile build +docker run -v $(pwd):/go/src/app sigdocs +``` diff --git a/build/app.go b/build/app.go new file mode 100644 index 000000000..43701fcde --- /dev/null +++ b/build/app.go @@ -0,0 +1,139 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "os" + + "github.com/cbroglie/mustache" + "gopkg.in/yaml.v2" +) + +var ( + sigsYamlFile = "sigs.yaml" + templateDir = "build" + indexTemplate = fmt.Sprintf("%s/sig_index.mustache", templateDir) + listTemplate = fmt.Sprintf("%s/sig_list.mustache", templateDir) + sigListOutput = "sig-list.md" + sigIndexOutput = "README.md" +) + +type Lead struct { + Name string + Company string + GitHub string +} + +type Meeting struct { + Day string + UTC string + PST string + Frequency string +} + +type Contact struct { + Slack string + MailingList string `yaml:"mailing_list"` + GitHubTeam string `yaml:"github_team"` +} + +type Sig struct { + Name string + Dir string + MissionStatement string `yaml:"mission_statement"` + Leads []Lead + Meetings []Meeting + MeetingURL string `yaml:"meeting_url"` + MeetingArchiveURL string `yaml:"meeting_archive_url"` + Contact Contact +} + +type SigEntries struct { + Sigs []Sig +} + +func dirExists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return true, err +} + +func createReadmeFiles(ctx SigEntries) error { + template, err := mustache.ParseFile(indexTemplate) + if err != nil { + return err + } + + for _, sig := range ctx.Sigs { + data, err := template.Render(sig) + if err != nil { + return err + } + + exists, err := dirExists(sig.Dir) + if err != nil { + return err + } + if !exists { + err = os.Mkdir(sig.Dir, 0755) + if err != nil { + return err + } + } + + err = ioutil.WriteFile(fmt.Sprintf("%s/%s", sig.Dir, sigIndexOutput), []byte(data), 0644) + if err != nil { + return err + } + } + + return nil +} + +func createListFile(ctx SigEntries) error { + template, err := mustache.ParseFile(listTemplate) + if err != nil { + return err + } + + data, err := template.Render(ctx) + if err != nil { + return err + } + + err = ioutil.WriteFile(sigListOutput, []byte(data), 0644) + if err != nil { + return err + } + + return nil +} + +func main() { + yamlData, err := ioutil.ReadFile(sigsYamlFile) + if err != nil { + log.Fatal(err) + } + + var ctx SigEntries + err = yaml.Unmarshal(yamlData, &ctx) + if err != nil { + log.Fatal(err) + } + + err = createReadmeFiles(ctx) + if err != nil { + log.Fatal(err) + } + + err = createListFile(ctx) + if err != nil { + log.Fatal(err) + } +} diff --git a/build/sig_index.mustache b/build/sig_index.mustache new file mode 100644 index 000000000..d80f0719b --- /dev/null +++ b/build/sig_index.mustache @@ -0,0 +1,19 @@ +# {{Name}} SIG + +{{MissionStatement}} +## Meetings +{{#Meetings}} +- [{{Day}}s at {{UTC}} UTC]({{MeetingURL}}) ({{Frequency}}) +{{/Meetings}} +Meeting notes and Agenda can be found [here]({{MeetingArchiveURL}}). + +## Leads +{{#Leads}} +- [{{Name}}](https://github.com/{{GitHub}}){{#Company}}, {{Company}}{{/Company}} +{{/Leads}} +## Contact +{{#Contact}} +Slack: https://kubernetes.slack.com/messages/{{Slack}} +Mailing list: {{MailingList}} +{{#GitHubTeam}}GitHub Team: https://github.com/kubernetes/teams/{{GitHubTeam}}{{/GitHubTeam}} +{{/Contact}} diff --git a/build/sig_list.mustache b/build/sig_list.mustache new file mode 100644 index 000000000..7637f192c --- /dev/null +++ b/build/sig_list.mustache @@ -0,0 +1,19 @@ +# SIGs and Working Groups + +Most community activity is organized into Special Interest Groups (SIGs), +time bounded Working Groups, and the [community meeting](communication.md#Meeting). + +SIGs follow these [guidelines](governance.md) although each of these groups may operate a little differently +depending on their needs and workflow. + +Each group's material is in its subdirectory in this project. + +When the need arises, a [new SIG can be created](sig-creation-procedure.md) + +### Master SIG List + +| Name | Leads | Contact | Meetings | +|------|-------|---------|----------| +{{#Sigs}} +|[{{ Name }}]({{ Dir }}/README.md)|{{#Leads}}- [{{Name}}](https://github.com/{{GitHub}}){{#Company}}, {{Company}}{{/Company}}
{{/Leads}}|{{#Contact}}- [Slack](https://kubernetes.slack.com/messages/{{Slack}})
- [Mailing List]({{MailingList}}){{/Contact}}|{{#Meetings}}- [{{Day}}s at {{UTC}} UTC ({{Frequency}})]({{MeetingURL}})
{{/Meetings}} +{{/Sigs}}