mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2025-12-13 07:45:56 +00:00
8 lines
21 KiB
JavaScript
8 lines
21 KiB
JavaScript
import{_ as r}from"./plugin-vue_export-helper-DlAUqK2U.js";import{c as l,a as s,b as o,d as i,e as t,f as n,r as h,o as d}from"./app-42vVvAb-.js";const p={};function c(k,e){const a=h("RouteLink");return d(),l("div",null,[e[7]||(e[7]=s('<h1 id="contributing" tabindex="-1"><a class="header-anchor" href="#contributing"><span>CONTRIBUTING</span></a></h1><p>Thank you so much for thinking of contributing to the <a href="https://ocelot.social" target="_blank" rel="noopener noreferrer">ocelot.social</a> project! It's awesome you're here, we really appreciate it. :-)</p><h2 id="getting-set-up" tabindex="-1"><a class="header-anchor" href="#getting-set-up"><span>Getting Set Up</span></a></h2>',3)),o("p",null,[e[2]||(e[2]=i("Instructions for how to install all the necessary software and some code guidelines can be found in our main ")),t(a,{to:"/"},{default:n(()=>e[0]||(e[0]=[i("Readme")])),_:1}),e[3]||(e[3]=i(" or in our ")),t(a,{to:"/SUMMARY.html"},{default:n(()=>e[1]||(e[1]=[i("documentation")])),_:1}),e[4]||(e[4]=i("."))]),e[8]||(e[8]=s('<p>To get you started we recommend that you join forces with a regular contributor. Please join <a href="https://discord.gg/AJSX9DCSUA" target="_blank" rel="noopener noreferrer">our Discord instance</a> to chat with developers or just get in touch directly on an issue on either <a href="https://github.com/Ocelot-Social-Community/Ocelot-Social/issues" target="_blank" rel="noopener noreferrer">Github</a> or <a href="https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089" target="_blank" rel="noopener noreferrer">Zenhub</a>:</p><p>We also can have pair programming sessions for you! We feel this is often the best way to get to know both the project and the team. Most developers are also available for spontaneous sessions.</p><h2 id="development-flow" tabindex="-1"><a class="header-anchor" href="#development-flow"><span>Development Flow</span></a></h2><p>We operate in two week sprints that are planned, estimated and prioritised on <a href="https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089" target="_blank" rel="noopener noreferrer">Zenhub</a>. All issues are also linked to and synced with <a href="https://github.com/Ocelot-Social-Community/Ocelot-Social/issues" target="_blank" rel="noopener noreferrer">Github</a>. Look for the <code>good first issue</code> label if you're not sure where to start!</p><p>We try to discuss all questions directly related to a feature or bug in the respective issue, in order to preserve it for the future and for other developers. We use <a href="https://discord.gg/AJSX9DCSUA" target="_blank" rel="noopener noreferrer">Discord</a> for real-time communication.</p><p>This is how we solve bugs and implement features, step by step:</p><ol><li>We find an issue we want to work on, usually during the sprint planning but as an open source contributor this can happen at any time.</li><li>We communicate with the team to see if the issue is still available. (When you comment on an issue but don't get an answer there within 1-2 days try to mention @Ocelot-Social-Community/core-team to make sure we check in.)</li><li>We make sure we understand the issue in detail – what problem is it solving and how should it be implemented?</li><li>We assign ourselves to the issue and move it to <code>In Progress</code> on <a href="https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089" target="_blank" rel="noopener noreferrer">Zenhub</a>.</li><li>We start working on it in a <code>new branch</code> and open a <code>pull request</code> prefixed with <code>[WIP]</code> (work in progress) to which we regularly push our changes.</li><li>When questions come up we clarify them with the team (directly in the issue on Github).</li><li>When we are happy with our work and our PR is passing all tests we remove the <code>[WIP]</code> from the PR description and ask for reviews (if you're not sure who to ask there is @Ocelot-Social-Community/core-team which pings all core developers).</li><li>We then incorporate the suggestions from the reviews into our work and once it has been approved it can be merged into master!</li></ol><p>Every pull request needs to:</p><ul><li>fix an issue (if there is something you want to work on but there is no issue for it, create one first and discuss it with the team)</li><li>include tests for the code that is added or changed</li><li>pass all tests (linter, backend, webapp, code coverage, end-to-end)</li><li>be approved by at least 1 developer who is not the owner of the PR (when more than 10 files were changed it needs 2 approvals)</li></ul><h2 id="contribution-flow-for-open-source-contributors" tabindex="-1"><a class="header-anchor" href="#contribution-flow-for-open-source-contributors"><span>Contribution Flow For Open Source Contributors</span></a></h2>',10)),o("p",null,[e[6]||(e[6]=i("See ")),t(a,{to:"/#contributing"},{default:n(()=>e[5]||(e[5]=[i("contributing in main README.md")])),_:1})]),e[9]||(e[9]=s(`<h2 id="the-team" tabindex="-1"><a class="header-anchor" href="#the-team"><span>The Team</span></a></h2><p>There are many volunteers all around the world helping us build this network and without their contributions we wouldn't be where we are today. Big thank you to all of you!</p><p>You can talk to our core team on <a href="https://discord.gg/AJSX9DCSUA" target="_blank" rel="noopener noreferrer">Discord</a>. And on Github you will mostly run into our core developers:</p><ul><li>Ulf (@ulfgebhardt)</li><li>Moriz (@Mogge)</li><li>Wolle (@Tirokk)</li><li>Alex (@ogerly)</li><li>Hannes (@elweyn5803)</li><li>Mathias (@mahula)</li><li>Markus (@maeckes#1133)</li></ul><h2 id="meetings-and-pair-programming-sessions" tabindex="-1"><a class="header-anchor" href="#meetings-and-pair-programming-sessions"><span>Meetings and Pair Programming Sessions</span></a></h2><p>Times below refer to <strong>German Time</strong> – that's CET (GMT+1) in winter and CEST (GMT+2) in summer – because most ocelot.social Community core team members are living in Germany.</p><p>Daily standup</p><ul><li>every Monday–Thursday 11:30 am (german time see above 👆🏼)</li><li>in our <a href="https://discord.gg/AJSX9DCSUA" target="_blank" rel="noopener noreferrer">Discord</a> <code>Office Cube</code></li><li>all contributors welcome!</li><li>everybody shares what they are working on and asks for help if they are blocked</li></ul><h2 id="philosophy" tabindex="-1"><a class="header-anchor" href="#philosophy"><span>Philosophy</span></a></h2><p>We practice <a href="http://www.extremeprogramming.org/rules/collective.html" target="_blank" rel="noopener noreferrer">collective code ownership</a> rather than strong code ownership, which means that:</p><ul><li>developers can make contributions to other people's PRs (after checking in with them)</li><li>we avoid blocking because someone else isn't working, so we sometimes take over PRs from other developers</li><li>everyone should always push their code to branches so others can see it</li></ul><p>We believe in open source contributions as a learning experience – everyone is welcome to join our team of volunteers and to contribute to the project, no matter their background or level of experience. To support your learning experience we founded the charity association <a href="https://www.busfaktor.org/en" target="_blank" rel="noopener noreferrer">busFaktor() e.V.</a>.</p><p>We use pair programming sessions as a tool for knowledge sharing. We can learn a lot from each other and only by sharing what we know and overcoming challenges together can we grow as a team and truly own this project collectively.</p><p>As a volunteer you have no commitment except your own self development and your awesomeness by contributing to this free and open-source software project. Cheers to you!</p><h2 id="programming" tabindex="-1"><a class="header-anchor" href="#programming"><span>Programming</span></a></h2><h3 id="localization" tabindex="-1"><a class="header-anchor" href="#localization"><span>Localization</span></a></h3><h4 id="quotation-marks" tabindex="-1"><a class="header-anchor" href="#quotation-marks"><span>Quotation Marks</span></a></h4><p>The following characters are different from the programming quotation mark:</p><p><code>"</code> or <code>\\"</code></p><p>Please copy and paste the following quotes for the languages:</p><ul><li>de: „Dies ist ein Beispielsatz.“</li><li>en: “This is a sample sentence.” <ul><li>See <a href="https://grammar.collinsdictionary.com/easy-learning/when-do-you-use-quotation-marks-or-in-english" target="_blank" rel="noopener noreferrer">https://grammar.collinsdictionary.com/easy-learning/when-do-you-use-quotation-marks-or-in-english</a></li></ul></li></ul><h2 id="docker-–-more-closely" tabindex="-1"><a class="header-anchor" href="#docker-–-more-closely"><span>Docker – More Closely</span></a></h2><h3 id="apple-silicon-platform" tabindex="-1"><a class="header-anchor" href="#apple-silicon-platform"><span>Apple Silicon Platform</span></a></h3><p><em><strong>ATTENTION:</strong> For using Docker commands in Apple Silicon environments!</em></p><h4 id="environment-variable-for-apple-silicon-platform-m1-m2-chips" tabindex="-1"><a class="header-anchor" href="#environment-variable-for-apple-silicon-platform-m1-m2-chips"><span>Environment Variable For Apple Silicon Platform (M1, M2 Chips)</span></a></h4><p>If you encounter trouble building the docker containers on an Apple M1 chip you can try to explicitly define the target platform docker builds and pulls images for:</p><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"># set env variable for your shell</span></span>
|
||
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">$</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> export</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> DOCKER_DEFAULT_PLATFORM=linux/amd64</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>Or alternatively use a <code>YAML</code> docker compose overwrite file with <code>platform: linux/amd64</code>.</p><h3 id="analyzing-docker-builds" tabindex="-1"><a class="header-anchor" href="#analyzing-docker-builds"><span>Analyzing Docker Builds</span></a></h3><p>To analyze a Docker build, there is a wonderful tool called <a href="https://github.com/wagoodman/dive" target="_blank" rel="noopener noreferrer">dive</a>. Please sponsor if you're using it!</p><p>The <code>dive build</code> command is exactly the right one to fulfill what we are looking for. We can use it just like the <code>docker build</code> command and get an analysis afterwards.</p><p>So, in our main folder, we use it in the following way:</p><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"># in main folder</span></span>
|
||
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">$</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> dive</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> build</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --target</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> <</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">layer-nam</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">e> </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">-t</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "ocelotsocialnetwork/<app-name>:local-<layer-name>"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --build-arg</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> BBUILD_DATE="<build-date>"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --build-arg</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> BBUILD_VERSION="<build-version>"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --build-arg</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> BBUILD_COMMIT="<build-commit>"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> <</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">app-folder-name-or-do</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">t></span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">/</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>The build arguments are optional.</p><p>For the specific applications, we use them as follows.</p><h4 id="backend" tabindex="-1"><a class="header-anchor" href="#backend"><span>Backend</span></a></h4><h5 id="production-for-backend" tabindex="-1"><a class="header-anchor" href="#production-for-backend"><span>Production For Backend</span></a></h5><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"># in main folder</span></span>
|
||
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">$</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> dive</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> build</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --target</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> production</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> -t</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "ocelotsocialnetwork/backend:local-production"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> backend/</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="development-for-backend" tabindex="-1"><a class="header-anchor" href="#development-for-backend"><span>Development For Backend</span></a></h5><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"># in main folder</span></span>
|
||
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">$</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> dive</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> build</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --target</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> development</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> -t</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "ocelotsocialnetwork/backend:local-development"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> backend/</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="webapp" tabindex="-1"><a class="header-anchor" href="#webapp"><span>Webapp</span></a></h4><h5 id="production-for-webapp" tabindex="-1"><a class="header-anchor" href="#production-for-webapp"><span>Production For Webapp</span></a></h5><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"># in main folder</span></span>
|
||
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">$</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> dive</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> build</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --target</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> production</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> -t</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "ocelotsocialnetwork/webapp:local-production"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> webapp/</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="development-for-webapp" tabindex="-1"><a class="header-anchor" href="#development-for-webapp"><span>Development For Webapp</span></a></h5><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"># in main folder</span></span>
|
||
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">$</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> dive</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> build</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --target</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> development</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> -t</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "ocelotsocialnetwork/webapp:local-development"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> webapp/</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div>`,45))])}const m=r(p,[["render",c],["__file","CONTRIBUTING.html.vue"]]),b=JSON.parse(`{"path":"/CONTRIBUTING.html","title":"CONTRIBUTING","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Getting Set Up","slug":"getting-set-up","link":"#getting-set-up","children":[]},{"level":2,"title":"Development Flow","slug":"development-flow","link":"#development-flow","children":[]},{"level":2,"title":"Contribution Flow For Open Source Contributors","slug":"contribution-flow-for-open-source-contributors","link":"#contribution-flow-for-open-source-contributors","children":[]},{"level":2,"title":"The Team","slug":"the-team","link":"#the-team","children":[]},{"level":2,"title":"Meetings and Pair Programming Sessions","slug":"meetings-and-pair-programming-sessions","link":"#meetings-and-pair-programming-sessions","children":[]},{"level":2,"title":"Philosophy","slug":"philosophy","link":"#philosophy","children":[]},{"level":2,"title":"Programming","slug":"programming","link":"#programming","children":[{"level":3,"title":"Localization","slug":"localization","link":"#localization","children":[]}]},{"level":2,"title":"Docker – More Closely","slug":"docker-–-more-closely","link":"#docker-–-more-closely","children":[{"level":3,"title":"Apple Silicon Platform","slug":"apple-silicon-platform","link":"#apple-silicon-platform","children":[]},{"level":3,"title":"Analyzing Docker Builds","slug":"analyzing-docker-builds","link":"#analyzing-docker-builds","children":[]}]}],"git":{"createdTime":1752750935000,"updatedTime":1752750935000,"contributors":[{"name":"dependabot[bot]","email":"49699333+dependabot[bot]@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":5.68,"words":1703},"filePathRelative":"CONTRIBUTING.md","localizedDate":"July 17, 2025","excerpt":"\\n<p>Thank you so much for thinking of contributing to the <a href=\\"https://ocelot.social\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">ocelot.social</a> project! It's awesome you're here, we really appreciate it. :-)</p>\\n<h2>Getting Set Up</h2>\\n<p>Instructions for how to install all the necessary software and some code guidelines can be found in our main <a href=\\"/\\" target=\\"_blank\\">Readme</a> or in our <a href=\\"/SUMMARY.html\\" target=\\"_blank\\">documentation</a>.</p>"}`);export{m as comp,b as data};
|