From 1dd876bbaee09fc3247dbb0220765e8edda6cd1f Mon Sep 17 00:00:00 2001 From: V Thulisile Sibanda <66913810+thulieblack@users.noreply.github.com> Date: Wed, 5 Jul 2023 11:02:54 +0200 Subject: [PATCH 01/14] chore: add Thulie to the TSC list (#772) Co-authored-by: Lukasz Gornicki --- CODEOWNERS | 4 ++-- TSC_MEMBERS.json | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index df52d8e31..ddfd73356 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -5,7 +5,7 @@ # For more details, read the following article on GitHub: https://help.github.com/articles/about-codeowners/. # The default owners are automatically added as reviewers when you open a pull request unless different owners are specified in the file. -* @fmvilas @alequetzalli @derberg @asyncapi-bot-eve +* @fmvilas @alequetzalli @derberg @asyncapi-bot-eve @thulieblack # All ambassadors related files -AMBASSADOR* @Barbanio \ No newline at end of file +AMBASSADOR* @Barbanio diff --git a/TSC_MEMBERS.json b/TSC_MEMBERS.json index 1de572a3c..e0577da96 100644 --- a/TSC_MEMBERS.json +++ b/TSC_MEMBERS.json @@ -421,6 +421,19 @@ "java-template" ] }, + { + "name": "Thulisile Sibanda", + "github": "thulieblack", + "linkedin": "v-thulisile-sibanda", + "twitter": "thulieblack", + "slack": "U03CNJPMT7C", + "availableForHire": false, + "company": "AsyncAPI Initiative", + "repos": [ + "website", + "community" + ] + }, { "name": "Lewis Relph", "github": "lewis-relph", From 0f2ce6212c1a098ca05a2c0da4e63f798d7e27a3 Mon Sep 17 00:00:00 2001 From: Richa <41283476+14Richa@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:09:43 +0530 Subject: [PATCH 02/14] ci: add new maintainers.yaml file with tsc_members.json data (#720) Co-authored-by: Lukasz Gornicki --- .../workflows/msg-to-new-member-pr-merged.yml | 51 +- .../tsc_members_validator/schema.json | 164 +++--- .github/workflows/update-website-tsc.yml | 35 +- .github/workflows/validate-maintainers.yml | 78 +++ .github/workflows/validate-tsc-members.yml | 67 --- MAINTAINERS.yaml | 510 ++++++++++++++++++ 6 files changed, 722 insertions(+), 183 deletions(-) create mode 100644 .github/workflows/validate-maintainers.yml delete mode 100644 .github/workflows/validate-tsc-members.yml create mode 100644 MAINTAINERS.yaml diff --git a/.github/workflows/msg-to-new-member-pr-merged.yml b/.github/workflows/msg-to-new-member-pr-merged.yml index 042937864..1d24c861e 100644 --- a/.github/workflows/msg-to-new-member-pr-merged.yml +++ b/.github/workflows/msg-to-new-member-pr-merged.yml @@ -4,7 +4,7 @@ on: pull_request: types: [closed] paths: - - 'TSC_MEMBERS.json' + - 'MAINTAINERS.yaml' jobs: welcome: @@ -27,14 +27,18 @@ jobs: - name: List of directory run: ls -la - run: cd community && git checkout HEAD^ + - name: Install dependencies + run: npm install js-yaml@4.1.0 - name: Compare files id: compare-files uses: actions/github-script@v6 with: script: | const fs = require("fs"); - const main_file = require('./community-main/TSC_MEMBERS.json'); - const pr_file = require('./community/TSC_MEMBERS.json'); + const yaml = require('js-yaml'); + + const main_file = yaml.load('./community-main/MAINTAINERS.yaml', 'utf8'); + const pr_file = yaml.load('./community/MAINTAINERS.yaml', 'utf8'); const removed = pr_file.filter( (newObj) => !main_file.some((oldObj) => oldObj.github === newObj.github) ); @@ -42,39 +46,38 @@ jobs: (oldObj) => !pr_file.some((newObj) => newObj.github === oldObj.github) ); if(added.length > 0) { - core.info(`Added Contributors : ${JSON.stringify(added, null, 2)}`) + core.info(`Added Contributors:\n${yaml.dump(added)}`); core.setOutput("newContributors", added.map((obj) => obj.github).join(",")); } if(removed.length > 0) { - core.info(`Removed Contributors : ${JSON.stringify(removed, null, 2)}`) + core.info(`Removed Contributors:\n${yaml.dump(removed)}`); core.setOutput("removed", "true"); } - core.info('TSC members in main branch:'); - core.info(JSON.stringify(main_file, null, 2)); - core.info('Location of TSC members in main branch:'); - core.info(fs.realpathSync('./community-main/TSC_MEMBERS.json')); - core.info('TSC members in PR branch:'); - core.info(JSON.stringify(pr_file, null, 2)); - core.info('Location of TSC members in PR branch:'); - core.info(fs.realpathSync('./community/TSC_MEMBERS.json')); + core.info('Maintainers in main branch:\n' + yaml.dump(main_file)); + core.info('Location of Maintainers in main branch:'); + core.info(fs.realpathSync('./community-main/MAINTAINERS.yaml')); + core.info('Maintainers in PR branch:\n' + yaml.dump(pr_file)); + core.info('Location of Maintainers in PR branch:'); + core.info(fs.realpathSync('./community/MAINTAINERS.yaml')); + - name: Set newMaintainers as environment variable + run: echo "newMaintainers=${{ steps.compare-files.outputs.newMaintainers }}" >> $GITHUB_ENV + - name: Debug newMaintainers output + run: | + echo "newMaintainers = $newMaintainers" - name: Display welcome message - if: ${{steps.compare-files.outputs.newContributors != ''}} + if: env.newMaintainers != '' uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const newContributors = `${{steps.compare-files.outputs.newContributors}}`.split(","); - const welcomeMessage = newContributors.map((contributor) => `@${contributor.trim().replace(/^@/, '')} Soon you will be invited to join the AsyncAPI GitHub organization and you will be added to the team that lists all TSC members. - - We use this team to mention in different discussions in different places in GitHub where TSC opinion is needed or even voting on some topic. Once TSC is mentioned: - + const newMaintainers = process.env.newMaintainers.split(","); + const welcomeMessage = newMaintainers.map((maintainer) => `@${maintainer.trim().replace(/^@/, '')} I have invited you to join the AsyncAPI organization and you will soon be added to the team that lists all Maintainers. + We use this team to mention in different discussions in different places in GitHub where Maintainer's opinion is needed or even voting on some topic. Once Maintainers are mentioned: - You get GitHub notification - - We also drop notification in our slack in #95_bot-tsc-members-mentioned channel - - We drop an email to people that subscribed to TSC news here https://www.asyncapi.com/community/tsc - + - We also drop notification in our slack in #95_bot-maintainers-mentioned channel + - We drop an email to people that subscribed to Maintainer news here https://www.asyncapi.com/community/maintainers Pick the channel for notifications that you prefer. Welcome aboard! We are excited to have you as part of the team.`).join("\n"); - const { owner, repo } = context.repo; const { number: issue_number } = context.issue; return github.rest.issues.createComment({ owner, repo, issue_number, body: welcomeMessage }); @@ -84,5 +87,5 @@ jobs: env: SLACK_WEBHOOK: ${{secrets.SLACK_CI_FAIL_NOTIFY}} SLACK_TITLE: 🚨 Welcome new contributor action failed 🚨 - SLACK_MESSAGE: Failed to post a message to new TSC member + SLACK_MESSAGE: Failed to post a message to new Maintainer MSG_MINIMAL: true \ No newline at end of file diff --git a/.github/workflows/tsc_members_validator/schema.json b/.github/workflows/tsc_members_validator/schema.json index 98e5a0b5d..63408c53a 100644 --- a/.github/workflows/tsc_members_validator/schema.json +++ b/.github/workflows/tsc_members_validator/schema.json @@ -1,84 +1,92 @@ { - "$id": "root", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "array", - "description": "List of all TSC members and information about them.", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "minLength": 1, - "description": "Full name of the person, a nice human-readable name", - "examples": [ - "Lukasz Gornicki" - ] - }, - "github": { - "type": "string", - "minLength": 1, - "description": "In must be a valid GitHub handle. It is used to provide a link to person's profile on GitHub and display profile picture on the AsyncAPI website", - "examples": [ - "derberg" - ] - }, - "linkedin": { - "type": "string", - "minLength": 1, - "description": "Only LinkedIn profile name, everything you see after https://www.linkedin.com/in/ link. It is used on the AsyncAPI website to provide link to profile.", - "examples": [ - "lukasz-gornicki-a621914" - ] - }, - "twitter": { - "type": "string", - "minLength": 1, - "description": "Twitter profile name. It is used on the AsyncAPI website to provide link to profile.", - "examples": [ - "derberq" - ] - }, - "availableForHire": { - "type": "boolean", - "description": "It is not mandatory property as by default it is set to false. Nevertheless please add it, even if 'false' for better clarity. We use it on the AsyncAPI website to visually indicate that given person is available for hire.", - "default": false, - "examples": [ - true, - false - ] - }, - "company": { + "$id": "root", + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "array", + "description": "List of all maintainers and information about them.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Full name of the person, a nice human-readable name", + "examples": [ + "Lukasz Gornicki" + ] + }, + "github": { + "type": "string", + "minLength": 1, + "description": "It must be a valid GitHub handle. It is used to provide a link to the person's profile on GitHub and display the profile picture on the AsyncAPI website", + "examples": [ + "derberg" + ] + }, + "linkedin": { + "type": "string", + "minLength": 1, + "description": "Only the LinkedIn profile name, everything you see after the https://www.linkedin.com/in/ link. It is used on the AsyncAPI website to provide a link to the profile.", + "examples": [ + "lukasz-gornicki-a621914" + ] + }, + "twitter": { + "type": "string", + "minLength": 1, + "description": "Twitter profile name. It is used on the AsyncAPI website to provide a link to the profile.", + "examples": [ + "derberq" + ] + }, + "availableForHire": { + "type": "boolean", + "description": "It is not a mandatory property as it is set to false by default. Nevertheless, please add it, even if 'false,' for better clarity. We use it on the AsyncAPI website to visually indicate whether the person is available for hire.", + "default": false, + "examples": [ + true, + false + ] + }, + "company": { + "type": "string", + "minLength": 1, + "description": "It must be clear if the maintainer is affiliated with a company. AsyncAPI's open governance model allows no more than 1/4 of maintainers to be from the same company. If you are an individual contributor, you do not have to provide this property. In the UI, we will mark you as an individual contributor if this property is missing.", + "examples": [ + "Postman" + ] + }, + "slack": { + "type": "string", + "description": "It must be a valid Slack ID. It is the ID of the person's profile in Slack", + "examples": [ + "U01QPAP1QWE" + ] + }, + "repos": { + "type": "array", + "minItems": 1, + "items": { "type": "string", - "minLength": 1, - "description": "It must be clear if given TSC member is affiliated with some company. AsyncAPI's open governance model allows no more than 1/4 of TSC representatives from the same company. In case you are an individual contributor, you do not have to provide this property. In the UI we will mark you as individual contributor if this property is missing.", + "description": "List of repository names that must match the GitHub name of the repository. It is used to provide a link to the repository on the AsyncAPI website", "examples": [ - "Postman" - ] - }, - "slack":{ - "type":"string", - "description": "It must be a valid slackID. It is the ID of the slack of the person 's profile", - "examples":[ - "U01QPAP1QWE" + "avro-schema-parser" ] - }, - "repos": { - "type": "array", - "minItems": 1, - "items": { - "type": "string", - "description": "List of repositories names that must match the GitHub name of the repository. It is used to provide a link to the repository in AsyncAPI website", - "examples": [ - "avro-schema-parser" - ] - } } }, - "required": [ - "github", - "repos", - "slack" - ], - "additionalProperties": false - } - } \ No newline at end of file + "isTscMember": { + "type": "boolean", + "description": "Indicates whether the maintainer is a member of the technical steering committee", + "default": false, + "examples": [ + true, + false + ] + } + }, + "required": [ + "github", + "repos" + ], + "additionalProperties": false + } +} \ No newline at end of file diff --git a/.github/workflows/update-website-tsc.yml b/.github/workflows/update-website-tsc.yml index 655ab5d80..21c9379e8 100644 --- a/.github/workflows/update-website-tsc.yml +++ b/.github/workflows/update-website-tsc.yml @@ -1,16 +1,14 @@ -#This action update the list of TSC members in the website repository. List of all TSC members is later rendered in the asyncapi.com website. -name: Update list of TSC members in the website repo - +#This action update the list of TSC members in the website repository. List of all Maintainers is later rendered in the asyncapi.com website. +name: Update list of Maintainers in the website repo on: push: branches: - - 'master' + - "master" paths: - - 'TSC_MEMBERS.json' - + - "MAINTAINERS.yaml" jobs: update-website: - name: Make PR on website repository with updated tsc members list + name: Make PR on website repository with updated maintainers list runs-on: ubuntu-latest env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} @@ -29,21 +27,30 @@ jobs: run: | git config --global user.name asyncapi-bot git config --global user.email info@asyncapi.io - - name: Create branch - working-directory: ./website + - name: Convert YAML to JSON using Python + working-directory: ./community run: | - git checkout -b update-tscmembers-${{ github.head_ref }} - - name: Copy tsc members file from Current Repo to Another + python -c 'import sys, yaml, json; json.dump(yaml.safe_load(sys.stdin), sys.stdout, indent=4)' < MAINTAINERS.yaml > MAINTAINERS.json + - name: Copy maintainers file from Current Repo to Another working-directory: ./website run: | - cp ../community/TSC_MEMBERS.json ./config/TSC_MEMBERS.json + cp ../community/MAINTAINERS.json ./config/MAINTAINERS.json - name: Commit and push working-directory: ./website run: | git add . - git commit -m "docs(community): update latest tsc members list" + git commit -m "docs(community): update latest maintainers list" git push https://${{ env.GITHUB_TOKEN }}@github.com/asyncapi/website - name: Create PR working-directory: ./website run: | - gh pr create --title "docs(community): update latest tsc members list" --body "Updated TSC members list is available and this PR introduces changes with latest information about TSC members" --head "update-tscmembers-${{ github.head_ref }}" + gh pr create --title "docs(community): update latest maintainers list" --body "Updated Maintainers list is available and this PR introduces changes with latest information about Maintainers" --head "update-tscmembers-${{ github.head_ref }}" + + - name: Report workflow run status to Slack + if: failure() # Only, on failure, send a message on the slack channel + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_CI_FAIL_NOTIFY }} + SLACK_TITLE: 🚨 Update maintainers list action failed 🚨 + SLACK_MESSAGE: Failed to update the maintainers list in the website repository. + MSG_MINIMAL: true diff --git a/.github/workflows/validate-maintainers.yml b/.github/workflows/validate-maintainers.yml new file mode 100644 index 000000000..7890c4632 --- /dev/null +++ b/.github/workflows/validate-maintainers.yml @@ -0,0 +1,78 @@ +name: Validating the list of maintainers + +on: + pull_request: + types: [opened, reopened, synchronize, ready_for_review] + paths: + - 'MAINTAINERS.yaml' + +jobs: + # Make sure that changes in the MAINTAINERS.yaml file do not break the schema + # Until we have MAINTAINERS.yaml updates automated, we need to ensure we are not breaking things + validate_schema: + if: github.event.pull_request.draft == false + name: Validate JSON Schema for MAINTAINERS list + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - run: npm install ajv@6.12.6 + - name: Install dependencies + run: npm install js-yaml@4.1.0 + - name: Validate list with schema + uses: actions/github-script@v4 + with: + script: | + const Ajv = require("ajv"); + const fs = require('fs').promises; + const yaml = require('js-yaml'); + + const schema = await fs.readFile('.github/workflows/tsc_members_validator/schema.json', 'utf8'); + const members = await fs.readFile('MAINTAINERS.yaml', 'utf8'); + + const ajv = new Ajv(); + const validator = ajv.compile(JSON.parse(schema)); + + const valid = validator(yaml.load(members)); + + if (!valid) { + core.error(`Validation of maintainers file failed with the following errors:`); + core.error(validator.errors); + } else { + core.info(`MAINTAINERS file is valid`); + } + + # Open governance model doesn't allow more than 1/4 maintainers affiliated with a single company + calculate_companies: + if: github.event.pull_request.draft == false + name: Calculate TSC members affiliation + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Install dependencies + run: npm install js-yaml@4.1.0 + - name: Calculate + uses: actions/github-script@v4 + with: + script: | + const fs = require('fs'); + const yaml = require('js-yaml'); + const members = yaml.load(fs.readFileSync('./MAINTAINERS.yaml', 'utf8')); + // Filter in the members who are part of the TSC + const tscMembers = members.filter(member => member.isTscMember); + + const allTscMembers = tscMembers.length; + + const allowedMemberPerCompany = Math.floor(allTscMembers / 4); + const numberOfMemByCompany = tscMembers.reduce((acc, m) => { + const company = m.company && m.company.toLowerCase(); + if (company) acc.has(company) ? acc.set(company, acc.get(company) + 1) : acc.set(company, 1); + return acc; + }, new Map()); + + numberOfMemByCompany.forEach((numberOfRepresentatives, companyName) => { + if (numberOfRepresentatives > allowedMemberPerCompany) { + core.setFailed(`There are too many TSC members affiliated with ${companyName} and it violates the open governance model. ${numberOfRepresentatives} is more than 1/4 of ${allTscMembers}`); + } + }); diff --git a/.github/workflows/validate-tsc-members.yml b/.github/workflows/validate-tsc-members.yml deleted file mode 100644 index 13012efde..000000000 --- a/.github/workflows/validate-tsc-members.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: Validating the list of technical steering committee members - -on: - pull_request: - types: [opened, reopened, synchronize, ready_for_review] - paths: - - 'TSC_MEMBERS.json' -jobs: - # make sure that changes in the TSC_MEMBERS file is not breaking the schema - # until we have TSC_MEMBERS.json updates automated we need to make sure we are not breaking things - validate_schema: - if: github.event.pull_request.draft == false - name: Validate JSON Schema for TSC_MEMBERS list - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - run: npm install ajv@6.12.6 - - name: Validate list with schema - uses: actions/github-script@v4 - with: - script: | - const Ajv = require("ajv"); - const fs = require('fs').promises; - - const schema = await fs.readFile('.github/workflows/tsc_members_validator/schema.json', 'utf8'); - const members = await fs.readFile('TSC_MEMBERS.json', 'utf8'); - - const ajv = new Ajv(); - const validator = ajv.compile(JSON.parse(schema)); - - const valid = validator(JSON.parse(members)); - - if (!valid) { - core.error(`Validation of members file failed with the following errors:`); - core.error(validator.errors); - } else { - core.info(`TSC members file is valid`); - } - - # open governance model doesn't allow more than 1/4 TSC members affiliated with a single company - calculate_companies: - if: github.event.pull_request.draft == false - name: Calculate TSC members affiliation - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - name: Calculate - uses: actions/github-script@v4 - with: - script: | - const members = require('./TSC_MEMBERS.json'); - const allMembers = members.length; - - const allowedMemberPerCompany = (allMembers/4).toFixed(0) - const numberOfMemByCompany = members.reduce((acc, m) => { - const company = m.company && m.company.toLowerCase(); - - if (company) acc.has(company) ? acc.set(company,acc.get(company)+1) : acc.set(company,1); - return acc; - }, new Map()) - - numberOfMemByCompany.forEach((numberOfRepresentatives, companyName) => { - if (numberOfRepresentatives > allowedMemberPerCompany) core.setFailed(`There are to many members affiliated with ${companyName} and it violates open governance model. ${numberOfRepresentatives} is more that 1/4 of ${allMembers}`) - }) - diff --git a/MAINTAINERS.yaml b/MAINTAINERS.yaml new file mode 100644 index 000000000..26eaf29e8 --- /dev/null +++ b/MAINTAINERS.yaml @@ -0,0 +1,510 @@ +--- +- name: Aayush Sahu + github: aayushmau5 + linkedin: aayushmau5 + slack: U01QRHR1ABH + twitter: aayushmau5 + availableForHire: false + isTscMember: true + repos: + - diff +- name: Abir Pal + linkedin: imabp + slack: U01S8EQ9LQ2 + twitter: imabptweets + github: imabp + availableForHire: false + isTscMember: true + repos: + - problem +- name: Akshat Nema + github: akshatnema + linkedin: akshat-nema + slack: U02TAMG2VKN + twitter: AksNema + availableForHire: true + isTscMember: true + repos: + - website +- name: Anand Sunderraman + github: anandsunderraman + linkedin: anand-sunderraman-a6b7a131 + slack: U0231F9KXNK + availableForHire: false + isTscMember: true + repos: + - go-watermill-template +- name: Arjun Garg + github: arjungarg07 + linkedin: arjungarg17 + slack: U01QX79S734 + twitter: ArjunGarg07 + availableForHire: true + isTscMember: true + repos: + - cupid +- name: Cameron Rushton + github: CameronRushton + slack: U01DVKKAV5K + availableForHire: false + company: Solace + isTscMember: true + repos: + - java-spring-cloud-stream-template + - python-paho-template + - bindings +- name: Dale Lane + github: dalelane + linkedin: dalelane + slack: U01EYAFR5BR + twitter: dalelane + availableForHire: false + isTscMember: true + company: IBM + repos: + - avro-schema-parser + - bindings + - java-template +- name: Emiliano Zublena + github: emilianozublena + linkedin: emilianozublena + slack: U01LYC8PW0M + availableForHire: false + isTscMember: true + repos: + - asyncapi-php-template +- name: Fran Méndez + github: fmvilas + slack: U34F2JRRS + availableForHire: false + company: Postman + linkedin: fmvilas + isTscMember: true + repos: + - raml-dt-schema-parser + - avro-schema-parser + - openapi-schema-parser + - asyncapi-react + - glee + - generator + - nodejs-template + - nodejs-ws-template + - parser-js + - playground + - spec + - spec-json-schemas + - website + - bindings +- name: Gerald Loeffler + github: GeraldLoeffler + linkedin: geraldloeffler + slack: U01P5QDLP0X + availableForHire: false + company: Salesforce + isTscMember: true + repos: + - bindings +- name: Jonas Lagoni + github: jonaslagoni + linkedin: jonaslagoni + slack: UQ2ANBG1E + availableForHire: false + company: Postman + isTscMember: true + repos: + - dotnet-nats-template + - ts-nats-template + - generator-react-sdk + - generator + - modelina + - parser-js + - parser-api + - simulator +- name: Khuda Dad Nomani + github: KhudaDad414 + twitter: KhudaDadNomani + linkedin: khudadadnomani + slack: U01RVRD1TCL + availableForHire: false + company: Postman + isTscMember: true + repos: + - optimizer + - bindings + - glee + - ".github" +- name: Laurent Broudoux + github: lbroudoux + twitter: lbroudoux + linkedin: laurentbroudoux + slack: U018NLDV5E1 + availableForHire: false + isTscMember: true + repos: + - bindings +- name: Ludovic Dussart + github: m3lkior + linkedin: ludovic-dussart-846a8063 + slack: U01BM49KL3Z + twitter: ldussart + availableForHire: false + company: Ineat + isTscMember: true + repos: + - avro-schema-parser +- name: Lukasz Gornicki + github: derberg + linkedin: lukasz-gornicki-a621914 + slack: UD698Q5LM + twitter: derberq + availableForHire: false + company: Postman + isTscMember: true + repos: + - avro-schema-parser + - openapi-schema-parser + - chatbot + - diff + - cli + - generator-filters + - generator-hooks + - github-action-for-generator + - generator + - nodejs-template + - nodejs-ws-template + - parser-js + - playground + - spec + - spec-json-schemas + - template-for-generator-templates + - website + - bundler +- name: Maciej Urbańczyk + github: magicmatatjahu + availableForHire: false + linkedin: maciej-urbańczyk-909547164 + slack: U01EB02BP7A + company: Postman + isTscMember: true + repos: + - asyncapi-react + - chatbot + - cli + - converter-go + - event-gateway + - generator-react-sdk + - generator + - html-template + - markdown-template + - modelina + - parser-js + - parser-go + - playground + - server-api + - template-for-go-projects + - website +- name: Azeez Elegbede + linkedin: acebuild + github: AceTheCreator + twitter: _acebuild + slack: U01RWDD69PZ + company: Postman + availableForHire: false + isTscMember: true + repos: + - chatbot +- name: Michael Davis + github: damaru-inc + availableForHire: false + slack: UH3B166TD + company: Solace + isTscMember: true + repos: + - java-spring-cloud-stream-template + - python-paho-template + - bindings +- name: Missy Turco + github: mcturco + twitter: missyturco + slack: U02JVEQ6S9W + linkedin: missy-turco-a476a6126 + availableForHire: false + company: Postman + isTscMember: true + repos: + - brand + - design-system + - studio + - website +- name: Nektarios Fifes + github: NektariosFifes + linkedin: nektarios-fifes-372740220 + slack: U01SE93Q48N + availableForHire: true + isTscMember: true + repos: + - simulator +- name: Pavel Bodiachevskii + github: Pakisan + slack: U0132LQU8C9 + twitter: pbodiachevskii + availableForHire: false + isTscMember: true + repos: + - jasyncapi +- name: Philip Schlesinger + github: theschles + slack: U054UUYBNLF + twitter: philschlesinger + availableForHire: false + isTscMember: true + repos: + - jasyncapi-idea-plugin +- name: Pratik Haldankar + github: pratik2315 + slack: U03ADC8FD2S + linkedin: pratik-haldankar-1b237a205 + twitter: PratikHaldankr + availableForHire: true + isTscMember: true + repos: + - generator +- name: Richard Coppen + github: rcoppen + linkedin: richard-coppen + slack: U01L3FH3BUH + availableForHire: false + company: IBM + isTscMember: true + repos: + - bindings +- name: Sergio Moya + github: smoya + linkedin: smoya + slack: UN22ZTLHG + twitter: smoyac + availableForHire: false + company: Postman + isTscMember: true + repos: + - bindings + - converter-go + - event-gateway + - go-watermill-template + - infra + - parser-api + - parser-go + - server-api + - spec + - spec-json-schemas + - template-for-go-projects +- name: Souvik De + github: Souvikns + slack: U01SGCZMJKW + twitter: souvik_ns + linkedin: souvik-de-a2b941169 + availableForHire: false + company: Postman + isTscMember: true + repos: + - cli + - bundler + - glee +- name: Alejandra Quetzalli + github: alequetzalli + twitter: QuetzalliAle + slack: U02AKC14WAJ + linkedin: alejandra-quetzalli + availableForHire: false + company: Postman + isTscMember: true + repos: + - website + - training + - community +- name: David Pereira + github: BOLT04 + twitter: BOLT2938 + slack: U02EC8BT0TX + linkedin: josé-david-pereira-13ba5315a + availableForHire: false + company: Create IT + isTscMember: true + repos: + - server-api +- name: Daniel Raper + github: dan-r + slack: U02FP8WBFQE + linkedin: danielr + availableForHire: false + company: IBM + isTscMember: true + repos: + - java-template +- name: Kieran Murphy + github: KieranM1999 + linkedin: kieran-murphy-175b0412b + availableForHire: false + slack: U02FT2TKM37 + company: IBM + isTscMember: true + repos: + - java-template +- name: Tom Jefferson + github: JEFFLUFC + linkedin: t-jefferson + slack: U02FPPCEH6H + availableForHire: false + company: IBM + isTscMember: true + repos: + - java-template +- name: Lewis Relph + github: lewis-relph + availableForHire: false + slack: U02G8MDDEF3 + company: IBM + isTscMember: true + repos: + - java-template +- name: David Boyne + github: boyney123 + twitter: boyney123 + slack: U020GN9C6FM + availableForHire: false + company: AWS + isTscMember: true + repos: + - studio + - cli +- name: Semen Tenishchev + github: Tenischev + linkedin: semen-tenishchev + availableForHire: true + slack: U011D1DAU6S + isTscMember: true + repos: + - java-spring-template +- name: Samridhi Agrawal + github: Samridhi-98 + slack: U02T2MY9W5T + linkedin: samridhi-agrawal-1713201ab + availableForHire: false + company: ThoughtWorks + isTscMember: true + repos: + - modelina +- name: Debajyoti Halder + github: ron-debajyoti + twitter: rondebajyoti + slack: U02UK9RUPGQ + linkedin: rondebajyoti + availableForHire: false + company: Narvar + isTscMember: true + repos: + - modelina +- name: Ivan Garcia Sainz-Aja + github: ivangsa + linkedin: ivangarciasainzaja + slack: UTCN3ET4M + availableForHire: false + company: SNGULAR + isTscMember: true + repos: + - vs-asyncapi-preview +- name: Florence Njeri + github: Florence-Njeri + linkedin: florencenjeri + slack: U03D18YKX2M + twitter: njericodes + availableForHire: true + isTscMember: true + repos: + - generator +- name: Jeremy Whitlock + github: whitlockjc + linkedin: whitlockjc + slack: U03HBC08EBB + twitter: whitlockjc + availableForHire: false + company: Google + isTscMember: true + repos: + - bindings +- name: Vladimír Gorej + github: char0n + linkedin: vladimirgorej + slack: U03NV5L4S49 + twitter: vladimirgorej + availableForHire: false + company: SmartBear + isTscMember: true + repos: + - bindings + - spec + - spec-json-schemas +- name: Alexander Wichmann + github: VisualBean + linkedin: alexcarlsen + slack: U04C58GB8TF + availableForHire: false + company: The LEGO Group + isTscMember: true + repos: + - bindings +- name: Barbaño González + linkedin: barbano-gonzalez-moreno + twitter: BarbanoGonzalez + github: Barbanio + slack: U01J42QDSLU + availableForHire: false + company: Postman + isTscMember: true + repos: + - training + - community +- name: Kenneth Aasan + github: kennethaasan + slack: U037S2HK4TS + twitter: kennethaasan + availableForHire: false + company: Sportradar + isTscMember: true + repos: + - modelina +- name: Heiko Henning + github: GreenRover + slack: U03AC4G51H8 + availableForHire: false + company: mtrail GmbH + isTscMember: true + repos: + - protobuf-schema-parser +- name: connil + github: connil + slack: U03A51H8 + availableForHire: false + company: GmbH + isTscMember: false + repos: + - dotnet-rabbitmq-template +- name: mr-nuno + github: mr-nuno + slack: U03A5345 + availableForHire: false + company: GmbH + isTscMember: false + repos: + - dotnet-rabbitmq-template +- name: Thulisile Sibanda + github: thulieblack + linkedin: v-thulisile-sibanda + twitter: thulieblack + slack: U03CNJPMT7C + availableForHire: false + company: AsyncAPI Initiative + isTscMember: true + repos: + - website + - community \ No newline at end of file From ada6d91d23fd4be305d7463d22183a076865dcab Mon Sep 17 00:00:00 2001 From: Richa <41283476+14Richa@users.noreply.github.com> Date: Wed, 5 Jul 2023 19:44:42 +0530 Subject: [PATCH 03/14] ci: add 'Create Branch' step in `update-website-tsc.yaml` workflow (#785) --- .github/workflows/update-website-tsc.yml | 4 ++++ MAINTAINERS.yaml | 8 -------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/update-website-tsc.yml b/.github/workflows/update-website-tsc.yml index 21c9379e8..8faa6fb0d 100644 --- a/.github/workflows/update-website-tsc.yml +++ b/.github/workflows/update-website-tsc.yml @@ -27,6 +27,10 @@ jobs: run: | git config --global user.name asyncapi-bot git config --global user.email info@asyncapi.io + - name: Create branch + working-directory: ./website + run: | + git checkout -b update-tscmembers-${{ github.run_id }} - name: Convert YAML to JSON using Python working-directory: ./community run: | diff --git a/MAINTAINERS.yaml b/MAINTAINERS.yaml index 26eaf29e8..ba3ae2c66 100644 --- a/MAINTAINERS.yaml +++ b/MAINTAINERS.yaml @@ -489,14 +489,6 @@ isTscMember: false repos: - dotnet-rabbitmq-template -- name: mr-nuno - github: mr-nuno - slack: U03A5345 - availableForHire: false - company: GmbH - isTscMember: false - repos: - - dotnet-rabbitmq-template - name: Thulisile Sibanda github: thulieblack linkedin: v-thulisile-sibanda From ed18ce325461688ec75a43d60fa10a35c68b8c2c Mon Sep 17 00:00:00 2001 From: Richa <41283476+14Richa@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:12:39 +0530 Subject: [PATCH 04/14] ci: adjust the branch name in `update-website-tsc.yml` workflow (#786) --- .github/workflows/update-website-tsc.yml | 2 +- MAINTAINERS.yaml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-website-tsc.yml b/.github/workflows/update-website-tsc.yml index 8faa6fb0d..71175fc85 100644 --- a/.github/workflows/update-website-tsc.yml +++ b/.github/workflows/update-website-tsc.yml @@ -30,7 +30,7 @@ jobs: - name: Create branch working-directory: ./website run: | - git checkout -b update-tscmembers-${{ github.run_id }} + git checkout -b update-tscmembers-${{ github.head_ref }} - name: Convert YAML to JSON using Python working-directory: ./community run: | diff --git a/MAINTAINERS.yaml b/MAINTAINERS.yaml index ba3ae2c66..92940121b 100644 --- a/MAINTAINERS.yaml +++ b/MAINTAINERS.yaml @@ -489,6 +489,14 @@ isTscMember: false repos: - dotnet-rabbitmq-template +- name: mr-nuno + github: mr-nuno + slack: U03A5145 + availableForHire: false + company: GmbH + isTscMember: false + repos: + - dotnet-rabbitmq-template - name: Thulisile Sibanda github: thulieblack linkedin: v-thulisile-sibanda From 762df1db20226b40bbfbf2fa7db41ad37ec1ee27 Mon Sep 17 00:00:00 2001 From: Prince Rajpoot <44585452+princerajpoot20@users.noreply.github.com> Date: Thu, 6 Jul 2023 19:09:06 +0530 Subject: [PATCH 05/14] docs: added the 2023 mentorship idea list and updated the status of the mentorship program. (#759) Co-authored-by: Ace <40604284+AceTheCreator@users.noreply.github.com>%0ACo-authored-by: V Thulisile Sibanda <66913810+thulieblack@users.noreply.github.com> --- mentorship/asyncapi-mentorship/2023/README.md | 23 +++++++++++++++++++ mentorship/asyncapi-mentorship/README.md | 6 ++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 mentorship/asyncapi-mentorship/2023/README.md diff --git a/mentorship/asyncapi-mentorship/2023/README.md b/mentorship/asyncapi-mentorship/2023/README.md new file mode 100644 index 000000000..617aae1ed --- /dev/null +++ b/mentorship/asyncapi-mentorship/2023/README.md @@ -0,0 +1,23 @@ +# Status: In Progress + +## Timeline + +- Project proposals applications open: April 1st - June 6th +- Mentees applications open: June 6th - June 23rd +- Application review by the mentors/admission decisions: June 23rd - July 7th + +Mentorship duration - Six months \(full-time schedule\) + +## Accepted projects +| No | Project Idea | Mentor/s | Category | Mentee | +| --- | --- | --- | --- | --- | +| 1 | [Add help/{command} endpoint](https://github.com/asyncapi/server-api/issues/144) | [David Pereira](https://github.com/BOLT04) | Engineering | [@princerajpoot20](https://github.com/princerajpoot20) | +| 2 | [Website UI Kit design/dev project](https://github.com/asyncapi/design-system/issues/4) | [AceTheCreator](https://github.com/AceTheCreator) | Design | [@Mayaleeeee](https://github.com/Mayaleeeee) | +| 3 | [MVP integration of extensions catalog with AsyncAPI tools](https://github.com/asyncapi/extensions-catalog/issues/78) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | [@sambhavgupta0705](https://github.com/sambhavgupta0705) | +| 4 | [Documenting how different protocols work with AsyncAPI](https://github.com/orgs/asyncapi/discussions/533) | [Alejandra Quetzalli](https://github.com/alequetzalli) | Documentation | To be announced(TBA) | +| 5 | [Rewrite this template and NodeJS WS template](https://github.com/asyncapi/nodejs-template/issues/133) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | To be announced(TBA) | +| 6 | [Simulator Desktop Application](https://github.com/asyncapi/community/issues/691) | [Nektarios Fifes](https://github.com/NektariosFifes) | Engineering | To be announced(TBA) | +| 7 | [Tutorial document or separate guides for glee](https://github.com/asyncapi/glee/issues/431) | [Souvik](https://github.com/Souvikns) & [Khuda Dad Nomani](https://github.com/KhudaDad414) | Documentation | To be announced(TBA) | +| 8 | [Add support for translations](https://github.com/asyncapi/website/issues/267) | [Maciej Urbańczyk](https://github.com/magicmatatjahu) | Engineering | To be announced(TBA) | +| 9 | [Prepare CLI for v1.0.0 release](https://github.com/asyncapi/cli/issues/599) | [Souvik](https://github.com/Souvikns) | Engineering | To be announced(TBA) | +| 10 | [DocsUI: Messages Object output](https://github.com/asyncapi/asyncapi-react/issues/618) | [Missy Turco](https://github.com/mcturco) & [Fran Méndez](https://github.com/fmvilas) | Design | To be announced(TBA) | diff --git a/mentorship/asyncapi-mentorship/README.md b/mentorship/asyncapi-mentorship/README.md index fd5629b74..e5aabd0e0 100644 --- a/mentorship/asyncapi-mentorship/README.md +++ b/mentorship/asyncapi-mentorship/README.md @@ -5,11 +5,11 @@ The AsyncAPI Mentorship makes it easy to sponsor and help train the next generat ## Program Cycles and Archive data | Year | Term | Status | Announcement | Details | | ---- | ------ | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | -| 2023 | Jan-Nov | Planning | | [Jan-Nov](2023/README.md) | -| 2022 | Jan-Nov | In progress | | [Jan-Nov](2022/README.md) | +| 2023 | Jan-Nov | In progress | | [Jan-Nov](2023/README.md) | +| 2022 | Jan-Nov | Completed | | [Jan-Nov](2022/README.md) | ## Current cycle -The AsyncAPI Mentorship program current cycle is 2022 and more details are coming in Q1 of 2023. The next cycle will kick off Q1 of 2023 +The AsyncAPI Mentorship program current cycle is 2023 and more details are coming in Q3 of 2023. The next cycle will kick off Q1 of 2024 ## Program Maintainers From 18a0eb90a64b09759f0025b511bcff5217894fc1 Mon Sep 17 00:00:00 2001 From: Dipesh Shivrame Date: Thu, 6 Jul 2023 20:35:04 +0530 Subject: [PATCH 06/14] docs: update AsyncAPI Mentorship Program mentees (#789) Co-authored-by: V Thulisile Sibanda <66913810+thulieblack@users.noreply.github.com>%0ACo-authored-by: Dipesh Shivrame --- mentorship/asyncapi-mentorship/2023/README.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mentorship/asyncapi-mentorship/2023/README.md b/mentorship/asyncapi-mentorship/2023/README.md index 617aae1ed..c8808fab8 100644 --- a/mentorship/asyncapi-mentorship/2023/README.md +++ b/mentorship/asyncapi-mentorship/2023/README.md @@ -9,15 +9,15 @@ Mentorship duration - Six months \(full-time schedule\) ## Accepted projects -| No | Project Idea | Mentor/s | Category | Mentee | +| No | Project Idea | Mentor/s | Category | Mentee/s | | --- | --- | --- | --- | --- | -| 1 | [Add help/{command} endpoint](https://github.com/asyncapi/server-api/issues/144) | [David Pereira](https://github.com/BOLT04) | Engineering | [@princerajpoot20](https://github.com/princerajpoot20) | -| 2 | [Website UI Kit design/dev project](https://github.com/asyncapi/design-system/issues/4) | [AceTheCreator](https://github.com/AceTheCreator) | Design | [@Mayaleeeee](https://github.com/Mayaleeeee) | -| 3 | [MVP integration of extensions catalog with AsyncAPI tools](https://github.com/asyncapi/extensions-catalog/issues/78) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | [@sambhavgupta0705](https://github.com/sambhavgupta0705) | -| 4 | [Documenting how different protocols work with AsyncAPI](https://github.com/orgs/asyncapi/discussions/533) | [Alejandra Quetzalli](https://github.com/alequetzalli) | Documentation | To be announced(TBA) | -| 5 | [Rewrite this template and NodeJS WS template](https://github.com/asyncapi/nodejs-template/issues/133) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | To be announced(TBA) | -| 6 | [Simulator Desktop Application](https://github.com/asyncapi/community/issues/691) | [Nektarios Fifes](https://github.com/NektariosFifes) | Engineering | To be announced(TBA) | -| 7 | [Tutorial document or separate guides for glee](https://github.com/asyncapi/glee/issues/431) | [Souvik](https://github.com/Souvikns) & [Khuda Dad Nomani](https://github.com/KhudaDad414) | Documentation | To be announced(TBA) | -| 8 | [Add support for translations](https://github.com/asyncapi/website/issues/267) | [Maciej Urbańczyk](https://github.com/magicmatatjahu) | Engineering | To be announced(TBA) | -| 9 | [Prepare CLI for v1.0.0 release](https://github.com/asyncapi/cli/issues/599) | [Souvik](https://github.com/Souvikns) | Engineering | To be announced(TBA) | -| 10 | [DocsUI: Messages Object output](https://github.com/asyncapi/asyncapi-react/issues/618) | [Missy Turco](https://github.com/mcturco) & [Fran Méndez](https://github.com/fmvilas) | Design | To be announced(TBA) | +| 1 | [Add help/{command} endpoint](https://github.com/asyncapi/server-api/issues/144) | [David Pereira](https://github.com/BOLT04) | Engineering | [Prince Rajpoot](https://github.com/princerajpoot20) | +| 2 | [Website UI Kit design/dev project](https://github.com/asyncapi/design-system/issues/4) | [AceTheCreator](https://github.com/AceTheCreator) | Design | [AISHAT MUIBUDEEN](https://github.com/Mayaleeeee) | +| 3 | [MVP integration of extensions catalog with AsyncAPI tools](https://github.com/asyncapi/extensions-catalog/issues/78) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | [Sambhav Gupta](https://github.com/sambhavgupta0705) | +| 4 | [Documenting how different protocols work with AsyncAPI](https://github.com/orgs/asyncapi/discussions/533) | [Alejandra Quetzalli](https://github.com/alequetzalli) | Documentation | [Cynthia Peter](https://github.com/CynthiaPeter), [Arya Gupta](https://github.com/Arya-Gupta), [Joy Almeida](https://github.com/J0SAL), [Vaishnavi Nandakumar](https://github.com/VaishnaviNandakumar)| +| 5 | [Rewrite this template and NodeJS WS template](https://github.com/asyncapi/nodejs-template/issues/133) | [Lukasz Gornicki](https://github.com/derberg) | Engineering | [Kaushik Rishi](https://github.com/kaushik-rishi) | +| 6 | [Simulator Desktop Application](https://github.com/asyncapi/community/issues/691) | [Nektarios Fifes](https://github.com/NektariosFifes) | Engineering | [Sumant Tirkey](https://github.com/SumantxD) | +| 7 | [Tutorial document or separate guides for glee](https://github.com/asyncapi/glee/issues/431) | [Souvik](https://github.com/Souvikns) & [Khuda Dad Nomani](https://github.com/KhudaDad414) | Documentation | [Afzal Ansari](https://github.com/afzal442) | +| 8 | [Add support for translations](https://github.com/asyncapi/website/issues/267) | [Maciej Urbańczyk](https://github.com/magicmatatjahu) | Engineering | [Ansh Goyal](https://github.com/anshgoyalevil/) | +| 9 | [Prepare CLI for v1.0.0 release](https://github.com/asyncapi/cli/issues/599) | [Souvik](https://github.com/Souvikns) | Engineering | [Ashish Padhy](https://github.com/Shurtu-gal) | +| 10 | [DocsUI: Messages Object output](https://github.com/asyncapi/asyncapi-react/issues/618) | [Missy Turco](https://github.com/mcturco) & [Fran Méndez](https://github.com/fmvilas) | Design | [Asmit Malakannawar](https://github.com/asmitbm) | From 749e32ec56bb3d2667ed91e540dfee56469aa335 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Sat, 8 Jul 2023 12:05:36 +0200 Subject: [PATCH 07/14] chore(tweet): recurring tweet about slack link (#794) --- tweets/recurring-slack-link/2023-07-08.tweet | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tweets/recurring-slack-link/2023-07-08.tweet diff --git a/tweets/recurring-slack-link/2023-07-08.tweet b/tweets/recurring-slack-link/2023-07-08.tweet new file mode 100644 index 000000000..0bd3e8865 --- /dev/null +++ b/tweets/recurring-slack-link/2023-07-08.tweet @@ -0,0 +1,7 @@ +✨ Did you know #AsyncAPI is on Slack? ✨ + +Join our Slack workspace to chat with anyone from our Open-Source community! + +🔗 asyncapi.com/slack-invite + +Ask for help and help others too. 💪🏿💪🏽🦾 \ No newline at end of file From d614d527be954443b0c0b0cb6178b344c58dc41f Mon Sep 17 00:00:00 2001 From: AISHAT MUIBUDEEN <105395613+Mayaleeeee@users.noreply.github.com> Date: Thu, 13 Jul 2023 15:46:54 +0200 Subject: [PATCH 08/14] chore(tsc): add Maya as TSC member (#801) --- MAINTAINERS.yaml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/MAINTAINERS.yaml b/MAINTAINERS.yaml index 92940121b..226675aa7 100644 --- a/MAINTAINERS.yaml +++ b/MAINTAINERS.yaml @@ -1,4 +1,12 @@ ---- +- name: Aishat Muibudeen + github: mayaleeeee + linkedin: aishatmuibudeen + slack: U03CNHGEUR1 + twitter: maya_ux_ui + availableForHire: true + isTscMember: true + repos: + - website - name: Aayush Sahu github: aayushmau5 linkedin: aayushmau5 @@ -507,4 +515,4 @@ isTscMember: true repos: - website - - community \ No newline at end of file + - community From 7f824798e4d899c0f0c6c497a6441e6563a52b4a Mon Sep 17 00:00:00 2001 From: Namit Arjaria <89105989+depleur@users.noreply.github.com> Date: Fri, 14 Jul 2023 15:08:01 +0530 Subject: [PATCH 09/14] docs: fix typo in contributing file (#796) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 15b5b3df5..c01cb7020 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,7 +18,7 @@ To get a PR merged: - it is not a **Draft** PR - it is not labeled as **do-not-merge** -Once all above requirements are met, anyone can merge a PR asking the AsyncAPI bot for help. Simply add a comment to the PR such as `/ready-to-merge` or `rtm`. This prompts the bot to add a `ready-to-merge` label and then proceeds to merge the PR for you. The PR title is used as a commit message of both squashed and merged PRa. +Once all above requirements are met, anyone can merge a PR asking the AsyncAPI bot for help. Simply add a comment to the PR such as `/ready-to-merge` or `rtm`. This prompts the bot to add a `ready-to-merge` label and then proceeds to merge the PR for you. The PR title is used as a commit message of both squashed and merged PRs. If you are a maintainer and for some reason, you prefer to merge the PR on your own and you do not want a contributor to decide on it, add a `/do-not-merge` or `/dnm` comment to the PR. The bot will then add a `do-not-merge` label that only the repository maintainer can remove. From ef6c6d36c0123eb70f2916c3f10437aabb1b6acb Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Sat, 15 Jul 2023 12:05:36 +0200 Subject: [PATCH 10/14] chore(tweet): recurring tweet about slack link (#804) --- tweets/recurring-slack-link/2023-07-15.tweet | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tweets/recurring-slack-link/2023-07-15.tweet diff --git a/tweets/recurring-slack-link/2023-07-15.tweet b/tweets/recurring-slack-link/2023-07-15.tweet new file mode 100644 index 000000000..0bd3e8865 --- /dev/null +++ b/tweets/recurring-slack-link/2023-07-15.tweet @@ -0,0 +1,7 @@ +✨ Did you know #AsyncAPI is on Slack? ✨ + +Join our Slack workspace to chat with anyone from our Open-Source community! + +🔗 asyncapi.com/slack-invite + +Ask for help and help others too. 💪🏿💪🏽🦾 \ No newline at end of file From 056740b078c760231063b279a9510a72ae446aba Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Sat, 22 Jul 2023 12:05:19 +0200 Subject: [PATCH 11/14] chore(tweet): recurring tweet about slack link (#809) --- tweets/recurring-slack-link/2023-07-22.tweet | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tweets/recurring-slack-link/2023-07-22.tweet diff --git a/tweets/recurring-slack-link/2023-07-22.tweet b/tweets/recurring-slack-link/2023-07-22.tweet new file mode 100644 index 000000000..0bd3e8865 --- /dev/null +++ b/tweets/recurring-slack-link/2023-07-22.tweet @@ -0,0 +1,7 @@ +✨ Did you know #AsyncAPI is on Slack? ✨ + +Join our Slack workspace to chat with anyone from our Open-Source community! + +🔗 asyncapi.com/slack-invite + +Ask for help and help others too. 💪🏿💪🏽🦾 \ No newline at end of file From 22c944e1331450f5d0fdd17e6d0a084759f9747c Mon Sep 17 00:00:00 2001 From: Richa <41283476+14Richa@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:43:16 +0530 Subject: [PATCH 12/14] chore: add Emeritus.yaml file (#806) Co-authored-by: Lukasz Gornicki --- Emeritus.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Emeritus.yaml diff --git a/Emeritus.yaml b/Emeritus.yaml new file mode 100644 index 000000000..5d706296d --- /dev/null +++ b/Emeritus.yaml @@ -0,0 +1,5 @@ +# This file lists individuals who were previously TSC members but are no longer active. +emeritus: + - jotamusik + - LouisXhaferi + - aeworxet \ No newline at end of file From f3c7c4e70ee3130df4196dc7cf2fc4f6fefef296 Mon Sep 17 00:00:00 2001 From: asyncapi-bot Date: Sat, 29 Jul 2023 12:05:40 +0200 Subject: [PATCH 13/14] chore(tweet): recurring tweet about slack link (#819) --- tweets/recurring-slack-link/2023-07-29.tweet | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tweets/recurring-slack-link/2023-07-29.tweet diff --git a/tweets/recurring-slack-link/2023-07-29.tweet b/tweets/recurring-slack-link/2023-07-29.tweet new file mode 100644 index 000000000..0bd3e8865 --- /dev/null +++ b/tweets/recurring-slack-link/2023-07-29.tweet @@ -0,0 +1,7 @@ +✨ Did you know #AsyncAPI is on Slack? ✨ + +Join our Slack workspace to chat with anyone from our Open-Source community! + +🔗 asyncapi.com/slack-invite + +Ask for help and help others too. 💪🏿💪🏽🦾 \ No newline at end of file From a76b5ebf5aebbaf7cb44fb8e3834989d2d28ec49 Mon Sep 17 00:00:00 2001 From: Richa <41283476+14Richa@users.noreply.github.com> Date: Mon, 31 Jul 2023 14:55:18 +0530 Subject: [PATCH 14/14] refactor: automate invitation of new maintainers to organization (asyncapi) and team (maintainers) (#803) Co-authored-by: Lukasz Gornicki --- .github/workflows/maintainer_management.yml | 270 ++++++++++++++++++ .../workflows/msg-to-new-member-pr-merged.yml | 91 ------ 2 files changed, 270 insertions(+), 91 deletions(-) create mode 100644 .github/workflows/maintainer_management.yml delete mode 100644 .github/workflows/msg-to-new-member-pr-merged.yml diff --git a/.github/workflows/maintainer_management.yml b/.github/workflows/maintainer_management.yml new file mode 100644 index 000000000..662811c21 --- /dev/null +++ b/.github/workflows/maintainer_management.yml @@ -0,0 +1,270 @@ +name: Maintainer Management Workflow + +on: + pull_request: + types: [closed] + paths: + - 'MAINTAINERS.yaml' +env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + +jobs: + detect_maintainer_changes: + if: github.event.pull_request.merged + runs-on: ubuntu-latest + steps: + - name: Checkout main branch + uses: actions/checkout@v3 + with: + ref: master + path: community-main + - name: List of directory + run: ls -la + - name: Checkout one commit before last one + uses: actions/checkout@v3 + with: + fetch-depth: 2 + ref: master + path: community + - name: List of directory + run: ls -la + - run: cd community && git checkout HEAD^ + - name: Install dependencies + run: npm install js-yaml@4.1.0 + - name: Compare files + id: compare-files + uses: actions/github-script@v6 + with: + script: | + const fs = require("fs"); + const yaml = require('js-yaml'); + + const currentMaintainers = yaml.load(fs.readFileSync('./community-main/MAINTAINERS.yaml', 'utf8')); + const previousMaintainers = yaml.load(fs.readFileSync('./community/MAINTAINERS.yaml', 'utf8')); + + const removed = previousMaintainers.filter( + (newObj) => !currentMaintainers.some((oldObj) => oldObj.github === newObj.github) + ); + const added = currentMaintainers.filter( + (oldObj) => !previousMaintainers.some((newObj) => newObj.github === oldObj.github) + ); + + if (added.length > 0) { + core.setOutput("newMaintainers", added.map((obj) => obj.github).join(",")); + } + if (removed.length > 0) { + core.setOutput("removedMaintainers", removed.map((obj) => obj.github).join(",")); + } + + const removedTscMembers = pr_file.filter( + (obj) => !currentMaintainers.some((mainObj) => mainObj.github === obj.github) && obj.isTscMember === true + ); + + if (removedTscMembers.length > 0) { + core.setOutput("removedTscMembers", removedTscMembers.map((obj) => obj.github).join(",")); + core.info(`Removed TSC Members: ${removedTscMembers.map((obj) => obj.github).join(",")}`); + } + + // Log information for debugging + core.info('Maintainers in main branch:\n' + yaml.dump(currentMaintainers)); + core.info('Location of Maintainers in main branch:'); + core.info(fs.realpathSync('./community-main/MAINTAINERS.yaml')); + core.info('Maintainers in PR branch:\n' + yaml.dump(previousMaintainers)); + core.info('Location of Maintainers in PR branch:'); + core.info(fs.realpathSync('./community/MAINTAINERS.yaml')); + + - name: Debug newMaintainers output + run: | + echo "newMaintainers = $newMaintainers" + + - name: Debug removedMaintainers output + run: | + echo "removedMaintainers = $removedMaintainers" + + outputs: + newMaintainers: ${{ steps.compare-files.outputs.newMaintainers }} + removedMaintainers: ${{ steps.compare-files.outputs.removedMaintainers }} + removedTscMembers: ${{ steps.compare-files.outputs.removedTscMembers }} + + add_maintainer: + needs: detect_maintainer_changes + if: needs.detect_maintainer_changes.outputs.newMaintainers != '' + runs-on: ubuntu-latest + steps: + - name: Invite new maintainers to the organization + uses: actions/github-script@v6 + with: + github-token: ${{ env.GH_TOKEN }} + script: | + const newMaintainers = '${{ needs.detect_maintainer_changes.outputs.newMaintainers }}'.split(','); + for (const maintainer of newMaintainers) { + try { + await github.request('PUT /orgs/{org}/memberships/{username}', { + org: 'asyncapi', + username: maintainer + }); + } catch (error) { + core.setFailed(`Failed to add ${maintainer} to the organization: ${error.message}`); + } + } + + - name: Add new maintainers to the team + uses: actions/github-script@v6 + with: + github-token: ${{ env.GH_TOKEN }} + script: | + const newMaintainers = '${{ needs.detect_maintainer_changes.outputs.newMaintainers }}'.split(','); + for (const maintainer of newMaintainers) { + try { + await github.request('PUT /orgs/{org}/teams/{team_slug}/memberships/{username}', { + org: 'asyncapi', + team_slug: 'maintainers', + username: maintainer + }); + } catch (error) { + core.setFailed(`Failed to add ${maintainer} to the team: ${error.message}`); + } + } + + outputs: + newMaintainers: ${{needs.detect_maintainer_changes.outputs.newMaintainers }} + + display_message: + needs: add_maintainer + if: needs.add_maintainer.outputs.newMaintainers != '' + runs-on: ubuntu-latest + steps: + - name: Display welcome message for new maintainers + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GH_TOKEN }} + script: | + const newMaintainers = "${{ needs.add_maintainer.outputs.newMaintainers }}".split(","); + console.log(`New maintainers: ${newMaintainers}`); + const welcomeMessage = newMaintainers.map((maintainer) => `@${maintainer.trim().replace(/^@/, '')} I have invited you to join the AsyncAPI organization, and you are added to the team that lists all Maintainers.\n + + Please take a moment to verify if you would like to provide more details for your account, such as your LinkedIn profile, Twitter handle, or company affiliation. In case there is anything you want to add, please open up a separate pull request for the \`MAINTAINERS.yaml\` file.\n + + Additionally, if you are interested in becoming a [TSC member](https://github.com/amadeus4dev-examples/amadeus-async-flight-status) and contributing to the direction of the AsyncAPI Initiative, let us know, and we'll be happy to guide you through the process. Every maintainer has the right to become a TSC member, just open a pull request to modify your entry in \`MAINTAINER.yaml\` file and make sure \`isTscMember\` property is set to \`true\`. You can find some basic information about TSC membership in [this TSC-related guide](https://github.com/asyncapi/community/blob/master/TSC_MEMBERSHIP.md). Feel free to reach out to us for more help by dropping a comment in this pull request, or by asking for help in our Slack.\n + + Welcome aboard! We are excited to have you as part of the team.`).join("\n"); + + const { owner, repo } = context.repo; + const { number: issue_number } = context.issue; + return github.rest.issues.createComment({ owner, repo, issue_number, body: welcomeMessage }); + + remove_maintainer: + needs: detect_maintainer_changes + if: needs.detect_maintainer_changes.outputs.removedMaintainers != '' + runs-on: ubuntu-latest + steps: + - name: Remove maintainers from the organization + uses: actions/github-script@v6 + with: + github-token: ${{ env.GH_TOKEN }} + script: | + const removedMaintainers = '${{ needs.detect_maintainer_changes.outputs.removedMaintainers }}'.split(','); + for (const maintainer of removedMaintainers) { + try { + await github.request('DELETE /orgs/asyncapi/memberships/{username}', { + username: maintainer + }); + core.info(`Successfully removed ${maintainer} from the organization.`); + } catch (error) { + core.setFailed(`Failed to remove ${maintainer} from the organization: ${error.message}`); + } + } + + outputs: + removedMaintainers: ${{ needs.detect_maintainer_changes.outputs.removedMaintainers }} + removedTscMembers: ${{ needs.detect_maintainer_changes.outputs.removedTscMembers }} + + remove_maintainer_goodbye: + needs: remove_maintainer + if: needs.remove_maintainer.outputs.removedMaintainers != '' + runs-on: ubuntu-latest + steps: + - name: Display goodbye message to removed maintainers + uses: actions/github-script@v6 + with: + github-token: ${{ env.GH_TOKEN }} + script: | + const removedMaintainers = "${{ needs.remove_maintainer.outputs.removedMaintainers }}".split(","); + const removedTscMembers = "${{ needs.remove_maintainer.outputs.removedTscMembers }}".split(","); + + // Goodbye message to removed maintainers and notification to TSC members + const combinedMessages = removedMaintainers.map((maintainer) => { + const tscNotification = removedTscMembers.includes(maintainer) + ? `@asyncapi/tsc_members We want to inform you that @${maintainer.trim().replace(/^@/, '')} is no longer a maintainer of any repository under AsyncAPI Initiative. It means this maintainer is also no longer a member of TSC.` + : ''; + return `@${maintainer.trim().replace(/^@/, '')} We wanted to express our gratitude for your contributions as a maintainer of AsyncAPI Initiative. Your efforts have been immensely valuable to us, and we truly appreciate your dedication. Thank you once again, and we wish you all the best in your future endeavors!\n\n${tscNotification}`; + }); + + const { owner, repo } = context.repo; + const { number: issue_number } = context.issue; + for (const message of combinedMessages) { + github.rest.issues.createComment({ owner, repo, issue_number, body: message }); + } + + + update_emeritus: + needs: detect_maintainer_changes + if: needs.detect_maintainer_changes.outputs.removedTscMembers != '' + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Add TSC members to Emeritus.yaml and print + uses: actions/github-script@v6 + with: + github-token: ${{ env.GH_TOKEN }} + script: | + const fs = require('fs'); + const path = './Emeritus.yaml'; + + // Read the current content of the file + let content = fs.readFileSync(path, 'utf8').trim(); // remove any trailing whitespaces + + // Split the removed maintainers and prepare them for the yaml format + const removedTscMembers = "${{ needs.detect_maintainer_changes.outputs.removedTscMembers }}".split(',') + .map(maintainer => ` - ${maintainer.trim()}`) + .join('\n'); + + // Append the removed maintainers to the file content + if (removedTscMembers) { + content = content + '\n' + removedTscMembers; + } + + // Write the updated content back to the file + fs.writeFileSync(path, content); + + // Log the updated content to the console + core.info('Updated Emeritus.yaml:\n', content); + + - name: Create new branch + run: | + git checkout -b update-emeritus-${{ github.run_id }} + + - name: Commit and push + run: | + git add . + git commit -m "Update Emeritus.yaml" + git push https://${{ secrets.GH_TOKEN}}@github.com/asyncapi/community update-emeritus-${{ github.run_id }} + + - name: Create PR + run: | + gh pr create --title "docs(community): update latest emeritus list" --body "Updated Emeritus list is available and this PR introduces changes with latest information about Emeritus" --head update-emeritus-${{ github.run_id }} + + notify_slack_on_failure: + if: always() && (needs.detect_maintainer_changes.result == 'failure' || needs.add_maintainer.result == 'failure' || needs.display_message.result == 'failure' || needs.remove_maintainer.result == 'failure' || needs.update_emeritus.result == 'failure' || needs.remove_maintainer_goodbye.result == 'failure' ) + needs: [detect_maintainer_changes, add_maintainer.result, display_message, remove_maintainer,remove_maintainer_goodbye, update_emeritus] + runs-on: ubuntu-latest + steps: + - name: Report workflow run status to Slack + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{secrets.SLACK_CI_FAIL_NOTIFY}} + SLACK_TITLE: 🚨 Welcome new contributor action failed 🚨 + SLACK_MESSAGE: Failed to post a message to new Maintainer + MSG_MINIMAL: true diff --git a/.github/workflows/msg-to-new-member-pr-merged.yml b/.github/workflows/msg-to-new-member-pr-merged.yml deleted file mode 100644 index 1d24c861e..000000000 --- a/.github/workflows/msg-to-new-member-pr-merged.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: Welcome New Contributor - -on: - pull_request: - types: [closed] - paths: - - 'MAINTAINERS.yaml' - -jobs: - welcome: - if: github.event.pull_request.merged - runs-on: ubuntu-latest - steps: - - name: Checkout main branch - uses: actions/checkout@v3 - with: - ref: master - path: community-main - - name: List of directory - run: ls -la - - name: Checkout one commit before last one - uses: actions/checkout@v3 - with: - fetch-depth: 2 - ref: master - path: community - - name: List of directory - run: ls -la - - run: cd community && git checkout HEAD^ - - name: Install dependencies - run: npm install js-yaml@4.1.0 - - name: Compare files - id: compare-files - uses: actions/github-script@v6 - with: - script: | - const fs = require("fs"); - const yaml = require('js-yaml'); - - const main_file = yaml.load('./community-main/MAINTAINERS.yaml', 'utf8'); - const pr_file = yaml.load('./community/MAINTAINERS.yaml', 'utf8'); - const removed = pr_file.filter( - (newObj) => !main_file.some((oldObj) => oldObj.github === newObj.github) - ); - const added = main_file.filter( - (oldObj) => !pr_file.some((newObj) => newObj.github === oldObj.github) - ); - if(added.length > 0) { - core.info(`Added Contributors:\n${yaml.dump(added)}`); - core.setOutput("newContributors", added.map((obj) => obj.github).join(",")); - } - if(removed.length > 0) { - core.info(`Removed Contributors:\n${yaml.dump(removed)}`); - core.setOutput("removed", "true"); - } - core.info('Maintainers in main branch:\n' + yaml.dump(main_file)); - core.info('Location of Maintainers in main branch:'); - core.info(fs.realpathSync('./community-main/MAINTAINERS.yaml')); - core.info('Maintainers in PR branch:\n' + yaml.dump(pr_file)); - core.info('Location of Maintainers in PR branch:'); - core.info(fs.realpathSync('./community/MAINTAINERS.yaml')); - - - name: Set newMaintainers as environment variable - run: echo "newMaintainers=${{ steps.compare-files.outputs.newMaintainers }}" >> $GITHUB_ENV - - name: Debug newMaintainers output - run: | - echo "newMaintainers = $newMaintainers" - - name: Display welcome message - if: env.newMaintainers != '' - uses: actions/github-script@v6 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const newMaintainers = process.env.newMaintainers.split(","); - const welcomeMessage = newMaintainers.map((maintainer) => `@${maintainer.trim().replace(/^@/, '')} I have invited you to join the AsyncAPI organization and you will soon be added to the team that lists all Maintainers. - We use this team to mention in different discussions in different places in GitHub where Maintainer's opinion is needed or even voting on some topic. Once Maintainers are mentioned: - - You get GitHub notification - - We also drop notification in our slack in #95_bot-maintainers-mentioned channel - - We drop an email to people that subscribed to Maintainer news here https://www.asyncapi.com/community/maintainers - Pick the channel for notifications that you prefer. Welcome aboard! We are excited to have you as part of the team.`).join("\n"); - const { owner, repo } = context.repo; - const { number: issue_number } = context.issue; - return github.rest.issues.createComment({ owner, repo, issue_number, body: welcomeMessage }); - - if: failure() # Only, on failure, send a message on the 94_bot-failing-ci slack channel - name: Report workflow run status to Slack - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_WEBHOOK: ${{secrets.SLACK_CI_FAIL_NOTIFY}} - SLACK_TITLE: 🚨 Welcome new contributor action failed 🚨 - SLACK_MESSAGE: Failed to post a message to new Maintainer - MSG_MINIMAL: true \ No newline at end of file