Add community members page (#4970)

Signed-off-by: svrnm <neumanns@cisco.com>
Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com>
This commit is contained in:
Severin Neumann 2024-09-13 12:08:31 +02:00 committed by GitHub
parent 2ef12796ed
commit 21ccf0a714
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 5164 additions and 2 deletions

View File

@ -9,6 +9,7 @@ import:
caseSensitive: true
ignorePaths:
- '*.svg'
- data/community/members.yaml
- vendors.yaml
- content/ja
- content/zh

View File

@ -2,6 +2,7 @@
title: End-user resources
linkTitle: End user
description: Vendor-agnostic resources for OpenTelemetry users
weight: 40
---
Looking to connect with other OpenTelemetry end users in a vendor-agnostic

View File

@ -2,6 +2,7 @@
title: OpenTelemetry Marketing Guidelines for Contributing Organizations
linkTitle: Marketing Guidelines
cSpell:ignore: devstats
weight: 999
---
OpenTelemetry (aka OTel) is a collaboration among end-users, adjacent OSS

View File

@ -0,0 +1,76 @@
---
title: Members of the OpenTelemetry Project
linkTitle: Members
weight: 30
cSpell:ignore: subproject triagers
---
The OpenTelemetry community consists of many individuals from different
backgrounds, who help to accomplish the
[vision and mission](/community/mission/) of the project.
Below you find all the established community members in their different roles
for the project.
If you are a contributor to the OpenTelemetry project already, and not listed
here, you either have not
[set your membership to public](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-your-membership-in-organizations/publicizing-or-hiding-organization-membership),
or you need to take a look in our
[contributor guidelines](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md)
on how you can start your contributor as a member, and move up the ladder, all
the way to maintainer!
## Governance Committee
The Governance Committee (GC) is the governing body of the OpenTelemetry
project. Members of the GC are
[elected by the Members Of Standing in the OpenTelemetry community](https://github.com/open-telemetry/community/blob/main/governance-charter.md#elections)
{{% community/members-list "governance-committee" %}}
## Technical Committee
The Technical Committee (TC) is responsible for all technical development within
the OpenTelemetry project.
{{% community/members-list "technical-committee" %}}
## Specification Sponsors
Specification sponsors are trusted collaborators of the technical committee, and
work to review, approve, and sponsor
[OpenTelemetry specification](https://opentelemetry.io/docs/specs/otel/) issues
and PRs.
{{% community/members-list "spec-sponsors" %}}
## Maintainers
Maintainers are the technical authority for a subproject in the OpenTelemetry
project. Maintainers set technical direction and make or approve design
decisions for their subproject.
{{% community/members-list "maintainers" %}}
## Approvers
Code approvers are able to both review and approve code contributions, as well
as help maintainers triage issues and do project management.
{{% community/members-list "approvers" %}}
## Triagers
Triagers assist the maintainers and approvers with project management and
backlog organization. The specific workflows and triage requirements depend on
the project, and are set by the project maintainers.
{{% community/members-list "triagers" %}}
## Members
Members are continuously active contributors in the community. They can have
issues and PRs assigned to them. Members are expected to participate in SIG(s)
and remain active contributors to the community.
{{% community/members-list "members" %}}

2191
data/community/members.yaml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -12,8 +12,7 @@ const markdownFiles = [
'!content-modules/**',
'!examples/**',
'!layouts/**',
'!node_modules/**',
'!scripts/registry-scanner/node_modules/**',
'!**/node_modules/**',
'!tools/examples/**',
'!themes/**',
'!tmp/**',

View File

@ -0,0 +1,83 @@
{{ $data := $.Site.Data.community.members -}}
{{ $key := .Get 0 -}}
{{ $group := index $data $key -}}
{{ $lastIndex := 0 }}
{{ $colors := dict
"dotnet" "secondary"
"dotnet-contrib" "success"
"python" "danger"
"python-contrib" "light"
"sqlcommenter" "info"
"erlang" "dark"
"erlang-contrib" "secondary"
"configuration" "success"
"sig-developer-experience" "danger"
"rust" "info"
"dotnet-instrumentation" "dark"
"specs-semconv" "secondary"
"sig-security" "success"
"collector-contrib" "danger"
"collector" "light"
"sig-contributor-experience" "info"
"docs-pt" "dark"
"helm" "secondary"
"javascript" "success"
"sandbox-web-js" "danger"
"ruby" "light"
"ruby-contrib" "info"
"weaver" "dark"
"java-instrumentation" "secondary"
"java-contrib" "success"
"java" "danger"
"android" "light"
"go" "info"
"proto-go" "dark"
"go-instrumentation" "secondary"
"cpp" "success"
"cpp-contrib" "danger"
"docs-cn" "light"
"php" "info"
"swift" "dark"
"docs" "secondary"
"docs-zh" "success"
"docs-ja" "danger"
"docs-es" "light"
"arrow" "info"
"sig-end-user" "dark"
"opamp-go" "secondary"
"opamp-spec" "success"
"opamp-java" "danger"
"demo" "light"
"operator" "info"
"operator-ta" "dark"
"lambda-extension" "secondary"
"network" "success"
"profiling" "danger"
"ebpf-profiler" "light"
"sig-mainframe" "info"
"semconv-security" "dark"
"semconv-jvm" "secondary"
"semconv-system" "success"
"semconv-mobile" "danger"
"semconv-container" "light"
"semconv-k8s" "info"
"semconv-messaging" "dark"
"semconv-db" "secondary"
"semconv-llm" "success"
"semconv-event" "danger"
"semconv-cicd" "light"
-}}
{{ $defaultColor := "primary" }}
{{ range sort $group "name" }}
- [{{ .name }}]({{ .html_url }})
{{- range .teams -}}
{{- if hasSuffix . $key -}}
{{- $sig := replace (replace . (printf "-%s" $key) "") "opentelemetry-" "" -}}
{{- $color := default $defaultColor (index $colors $sig) -}}
&nbsp;<span class="badge rounded-pill text-bg-{{ $color }}">{{ $sig -}}</span>
{{- end -}}
{{- end -}}
{{- end -}}

View File

@ -0,0 +1,2 @@
.env
output.*

View File

@ -0,0 +1,176 @@
import { config } from 'dotenv';
import { Octokit } from '@octokit/rest';
import fs from 'fs';
import yaml from 'js-yaml';
config(); // Load .env file contents into process.env
const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
const org = 'open-telemetry';
const configParams = {
terms: ['maintainers', 'approvers', 'triagers'],
// Note that below is some custom code that will remove technical-committee members from spec-sponsors
committees: ['governance-committee', 'technical-committee', 'spec-sponsors'],
includePrivateMembersInGeneral: false,
includePrivateMembersInGroups: true,
createMembersList: true,
};
const outputPath = process.argv[2] || 'output.yml';
async function getTeams() {
const teams = await octokit.paginate(octokit.rest.teams.list, {
org,
per_page: 100,
});
return teams;
}
async function getTeamMembers(team_slug) {
const members = await octokit.paginate(octokit.rest.teams.listMembersInOrg, {
org,
team_slug,
per_page: 100,
});
return members;
}
async function getOrgMembers() {
const members = await octokit.paginate(octokit.rest.orgs.listMembers, {
org,
per_page: 100,
});
return members;
}
async function getPublicOrgMembers() {
const publicMembers = await octokit.paginate(
octokit.rest.orgs.listPublicMembers,
{
org,
per_page: 100,
},
);
return publicMembers;
}
async function collectDetails() {
const teams = await getTeams();
const allMembers = await getOrgMembers();
const publicMembers = await getPublicOrgMembers();
const teamMembers = new Set();
const memberDetails = {};
const result = {
maintainers: [],
approvers: [],
triagers: [],
};
const committees = {};
if (configParams.createMembersList) {
result.members = [];
}
for (const team of teams) {
const members = await getTeamMembers(team.slug);
const filteredMembers = configParams.includePrivateMembersInGroups
? members
: members.filter((member) =>
publicMembers.some((pubMember) => pubMember.login === member.login),
);
const teamName = team.name.toLowerCase();
// Check for committees
for (const committee of configParams.committees) {
if (teamName === committee) {
if (!committees[committee]) {
committees[committee] = [];
}
committees[committee].push(
...filteredMembers.map((member) => ({
name: member.login,
html_url: member.html_url,
avatar_url: member.avatar_url,
})),
);
}
}
// Collect members based on terms
for (const term of configParams.terms) {
if (teamName.includes(term)) {
filteredMembers.forEach((member) => {
teamMembers.add(member.login);
if (!memberDetails[member.login]) {
memberDetails[member.login] = {
name: member.login,
teams: [],
html_url: member.html_url,
avatar_url: member.avatar_url,
};
}
memberDetails[member.login].teams.push(teamName);
});
}
}
}
// Deduplicate and prioritize members
const categorizedMembers = new Set();
for (const term of configParams.terms) {
Object.values(memberDetails).forEach((member) => {
if (
member.teams.some((team) => team.includes(term)) &&
!categorizedMembers.has(member.name)
) {
result[term].push(member);
categorizedMembers.add(member.name);
}
});
}
// Find members who are not in any team
if (configParams.createMembersList) {
result.members = allMembers
.filter((member) => !teamMembers.has(member.login))
.filter(
(member) =>
configParams.includePrivateMembersInGeneral ||
publicMembers.some((pubMember) => pubMember.login === member.login),
)
.map((member) => ({
name: member.login,
html_url: member.html_url,
avatar_url: member.avatar_url,
}));
}
// Remove technical-committee members from spec-sponsors
if (committees['spec-sponsors'] && committees['technical-committee']) {
committees['spec-sponsors'] = committees['spec-sponsors'].filter(
(member) =>
!committees['technical-committee'].some(
(tcMember) => tcMember.name === member.name,
),
);
}
// Sort committees to the top of the output
const sortedResult = { ...committees, ...result };
// Convert result to a plain JSON object to avoid YAML anchors
const plainResult = JSON.parse(JSON.stringify(sortedResult));
// Convert result to YAML and write to file
const yamlResult = yaml.dump(plainResult, { lineWidth: -1 });
fs.writeFileSync(outputPath, yamlResult, 'utf8');
console.log(`Output written to ${outputPath}`);
}
collectDetails().catch(console.error);

View File

@ -0,0 +1,8 @@
{
"type": "module",
"dependencies": {
"@octokit/rest": "^18.0.0",
"dotenv": "^10.0.0",
"js-yaml": "^4.1.0"
}
}

File diff suppressed because it is too large Load Diff