Woodpecker CI, रास्ते में कहीं भी कोई SaaS नहीं
प्राग या कोविल्हा में एक छोटी मशीन पर सर्वर और एजेंट, आपकी अपनी फ़ोर्ज से जुड़े - CI का वह वर्शन जहाँ पाइपलाइन की कोई भी चीज़ ऐसी इंफ्रास्ट्रक्चर नहीं छोड़ती जिसका आप नाम ले सकें।
यह किसके लिए है
एक टीम जो पहले से बाकी सब कुछ सेल्फ-होस्ट करती है
फ़ोर्ज आपकी है, रजिस्ट्री आपकी है, डिप्लॉय लक्ष्य आपका है - और CI ही वह एकमात्र हॉप है जो अभी भी इमारत छोड़ता है, और यही ठीक वह हॉप है जो सोर्स रखता है।
एक Drone इंस्टॉलेशन जो आगे बढ़ना बंद हो गया
Woodpecker वह फ़ोर्क है जो आगे बढ़ता रहा और Apache-2.0 बना रहा। माइग्रेशन छोटा है; सवाल यह है कि इसे किस पर चलाया जाए।
एक छोटी टीम जो चाहती है कि CI उबाऊ हो
दो कंटेनर, प्रति रिपॉज़िटरी एक YAML फ़ाइल, सीखने के लिए कोई कंट्रोल प्लेन नहीं और देखने के लिए कोई प्रति-मिनट काउंटर नहीं। इसे बस रहने के लिए कहीं चाहिए।
यह रूप आपको क्या देता है
- एक होस्ट पर दो कंटेनरों के रूप में सर्वर और एजेंट, जो इतना छोटा है कि CI एक इंफ्रास्ट्रक्चर प्रोजेक्ट नहीं रहती।
- कोई भी फ़ोर्ज जो Woodpecker सपोर्ट करता है - GitHub, GitLab, Gitea, Forgejo या Bitbucket - जिसमें एक ऐसी भी शामिल है जिसे आप उसी नेटवर्क पर स्वयं होस्ट करते हैं।
- बाद में अलग होस्ट के रूप में जोड़े गए एजेंट, सभी उसी सर्वर पर ऑथेंटिकेट करते हुए, जब एक मशीन पर्याप्त नहीं रहती।
- पूरी तरह Apache-2.0, इसलिए पाइपलाइन में कुछ भी किसी विक्रेता के मुफ़्त स्तर बनाए रखने के फ़ैसले पर निर्भर नहीं है।
- AS204057 से एक स्थिर IPv4, ताकि फ़ोर्ज वेबहुक और डिप्लॉय लक्ष्य दोनों के पास भरोसा करने के लिए एक पता हो।
- वर्कस्पेस और Docker लेयर कैश के लिए स्थानीय NVMe, पाइपलाइनों के बीच वार्म।
पाइपलाइन वास्तव में क्या करती है उसके अनुसार आकार
Woodpecker स्वयं हल्का है: सर्वर एक छोटा Go प्रोसेस है जिसमें एक एम्बेडेड डेटाबेस है जब तक आप इसे Postgres पर पॉइंट न करें, और एजेंट एक सुपरवाइज़र है जो कंटेनर शुरू करता है। जो चीज़ होस्ट का उपभोग करती है वह बिल्ड है, ठीक किसी अन्य रनर की तरह - इसलिए सबसे भारी जॉब से मशीन का आकार तय करें, और लेयर कैश के लिए डिस्क में जगह दें जो दूसरी पाइपलाइन को तेज़ बनाती है। नीचे दिया गया प्रवेश आकार एक छोटी टीम के लिए आराम से सर्वर और एजेंट को एक साथ चलाता है। एक ईमानदार चेतावनी: एक फ़्लैट मासिक होस्ट उस हफ़्ते भी उतना ही खर्च करता है जब कोई पुश नहीं करता, जहाँ होस्टेड CI मिनट कुछ खर्च नहीं करते।
Docker Compose के साथ Woodpecker CI कैसे इंस्टॉल करें
इस उदाहरण में एक होस्ट पर सर्वर और एजेंट, GitHub से जुड़े। यदि आपकी फ़ोर्ज उनमें से एक है तो फ़ोर्ज ब्लॉक को Gitea, Forgejo, GitLab या Bitbucket वेरिएबल से बदलें।
-
Docker और Compose इंस्टॉल करें
sudo apt install docker.io docker-compose-v2 sudo systemctl enable --now dockerदोनों कंटेनर और हर पाइपलाइन चरण इस डेमन पर चलते हैं, इसलिए यही एकमात्र डिपेंडेंसी है जो होस्ट को चाहिए।
-
अपनी फ़ोर्ज पर एक OAuth एप्लिकेशन पंजीकृत करें
# GitHub: Settings -> Developer settings -> OAuth Apps -> New OAuth App # Homepage URL: https://ci.example.com # Authorization callback: https://ci.example.com/authorizeWoodpecker फ़ोर्ज के माध्यम से उपयोगकर्ताओं को साइन इन करता है और उस अनुमति से रिपॉज़िटरी पढ़ता है, इसलिए यह जो क्लाइंट आईडी और सीक्रेट वापस देता है वही सर्वर को चाहिए। हर समर्थित फ़ोर्ज में एक समकक्ष फ़ॉर्म है।
-
साझा एजेंट सीक्रेट जनरेट करें
openssl rand -hex 32सर्वर और एजेंट इस स्ट्रिंग से एक-दूसरे को ऑथेंटिकेट करते हैं, और Woodpecker दस्तावेज़ीकरण इसे बनाने के लिए यही सटीक कमांड बताता है। इसे compose फ़ाइल से बाहर रखें - इसे उसके बगल में एक .env फ़ाइल में रखें।
-
compose फ़ाइल लिखें
services: woodpecker-server: image: woodpeckerci/woodpecker-server:v3 ports: - 8000:8000 volumes: - woodpecker-server-data:/var/lib/woodpecker/ environment: - WOODPECKER_OPEN=true - WOODPECKER_HOST=${WOODPECKER_HOST} - WOODPECKER_GITHUB=true - WOODPECKER_GITHUB_CLIENT=${WOODPECKER_GITHUB_CLIENT} - WOODPECKER_GITHUB_SECRET=${WOODPECKER_GITHUB_SECRET} - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} woodpecker-agent: image: woodpeckerci/woodpecker-agent:v3 command: agent restart: always depends_on: - woodpecker-server volumes: - woodpecker-agent-config:/etc/woodpecker - /var/run/docker.sock:/var/run/docker.sock environment: - WOODPECKER_SERVER=woodpecker-server:9000 - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} volumes: woodpecker-server-data: woodpecker-agent-config:यह अपस्ट्रीम उदाहरण है। WOODPECKER_HOST वह सार्वजनिक URL है जिस तक उपयोगकर्ता और वेबहुक पहुँचते हैं, पोर्ट 8000 वेब इंटरफ़ेस है और 9000 वह gRPC पोर्ट है जिस पर एजेंट जुड़ते हैं। WOODPECKER_OPEN=true फ़ोर्ज अकाउंट वाले किसी को भी साइन इन करने देता है - एक बार आपकी टीम पंजीकृत हो जाए तो इसे बंद कर दें।
-
इसे शुरू करें
docker compose up -d docker compose logs -f woodpecker-agentएजेंट साझा सीक्रेट के साथ सर्वर से जुड़ता है और पहले संपर्क पर स्वयं को पंजीकृत करता है। यदि यह किसी ऑथेंटिकेशन त्रुटि पर लूप करता है, तो दोनों सीक्रेट मेल नहीं खाते - अक्सर इसलिए क्योंकि .env फ़ाइल नहीं पढ़ी गई।
-
एक पाइपलाइन जोड़ें
when: - event: push steps: - name: smoke image: alpine:latest commands: - cat /etc/os-release - echo "built on $CI_MACHINE"इसे .woodpecker.yaml के रूप में कमिट करें, वेबहुक बनाने के लिए वेब इंटरफ़ेस में रिपॉज़िटरी सक्षम करें, और पुश करें। हर चरण एक कंटेनर है, इसीलिए एजेंट को Docker सॉकेट चाहिए।
आधिकारिक दस्तावेज़ीकरण के विरुद्ध जाँचा गया 2026-08-15 — स्रोत पढ़ें
हम क्या नहीं हैं
- हम Woodpecker प्रोजेक्ट नहीं हैं। Woodpecker CI एक स्वतंत्र Apache-2.0 प्रोजेक्ट है और यहाँ कुछ भी इसके द्वारा समर्थित नहीं है। हम वह मशीन बेचते हैं जिस पर यह चलता है।
- हम इस पेज पर आपकी फ़ोर्ज को होस्ट नहीं करते। इसके बगल में Gitea, Forgejo या एक सेल्फ-मैनेज्ड GitLab एक सीधा दूसरा सर्वर है, लेकिन यह अलग आकार और अलग कोटेशन है।
- हम आपकी पाइपलाइनें नहीं लिखते। YAML आपका है; होस्ट, नेटवर्क और पता हमारे हैं।
- Woodpecker डिफ़ॉल्ट रूप से आपके लिए प्रबंधित नहीं है। दोनों कंटेनर आप चलाते हैं, या आप हमारी प्रशासन सेवा जोड़ते हैं और हम उन्हें अपडेटेड और बैकअप युक्त रखते हैं।
- एजेंट में Docker सॉकेट माउंट करना पाइपलाइन चरणों को होस्ट पर बहुत शक्ति देता है। यही इस डिज़ाइन के काम करने का तरीका है, और यही एक कारण है कि एजेंट को ऐसी मशीन पर रखा जाए जो कुछ और न करे।
वे हिस्से जो टीमें देर से खोजती हैं
- WOODPECKER_AGENT_SECRET के दो मोड हैं। सर्वर और हर एजेंट पर वही मान एक सिस्टम टोकन है; प्रति-एजेंट टोकन पहले इंटरफ़ेस में एजेंट को पंजीकृत करने से आता है, जो आप तब चाहते हैं जब एक से ज़्यादा टीम होस्ट तक पहुँच सकती है।
- हर संवेदनशील वेरिएबल का एक _FILE रूप भी है, ताकि सीक्रेट को compose फ़ाइल या environment में रहने के बजाय एक माउंटेड फ़ाइल से पढ़ा जा सके।
- एम्बेडेड डेटाबेस शुरू करने के लिए ठीक है और फिर भी पहले स्थानांतरित करने वाली चीज़ है। इंस्टॉलेशन किसी के लिए मायने रखने से पहले सर्वर को Postgres पर पॉइंट करें।
- WOODPECKER_OPEN=true का मतलब है कि जुड़ी हुई फ़ोर्ज पर कोई भी अकाउंट साइन इन कर सकता है। यह पहले दिन सुविधाजनक है और तीसवें दिन तक गलत है।
- एजेंट को Docker सॉकेट चाहिए क्योंकि हर चरण एक कंटेनर है, जो प्रभावी रूप से पाइपलाइन को उस होस्ट पर रूट देता है। एजेंट होस्ट को उबाऊ और अलग रखें।
- WOODPECKER_HOST वह URL होना चाहिए जिस तक फ़ोर्ज वास्तव में पहुँच सके, आंतरिक वाला नहीं - वेबहुक इसके विरुद्ध बनाया जाता है, और वहाँ एक निजी पता ऐसी पाइपलाइनें पैदा करता है जो कभी ट्रिगर नहीं होतीं।
होस्टेड CI मिनट बनाम आपका अपना रनर
| प्रोवाइडर-होस्टेड CI मिनट | DCXV पर एक रनर | |
|---|---|---|
| आप किसके लिए भुगतान करते हैं | जब तक प्रोजेक्ट रहता है, हर जॉब के चलने का हर मिनट | उस महीने पाइपलाइन जो भी करे, एक फ़्लैट मासिक होस्ट |
| एक बिल्ड जो धीमी हो जाती है | हर महीने जब तक यह धीमी रहती है ज़्यादा खर्च होता है | और कुछ खर्च नहीं होता - मशीन का भुगतान पहले से हो चुका है |
| Docker लेयर कैश | जब तक आप इसे स्वयं अपलोड और डाउनलोड न करें हर जॉब पर कोल्ड | स्थानीय NVMe पर वार्म, जॉब्स के बीच और दिनों के बीच |
| समवर्तिता | एक प्लान स्तर जिसे आप अपग्रेड करते हैं | एक संख्या जिसे आप अपनी कॉन्फ़िगरेशन फ़ाइल में सेट करते हैं |
| चेकआउट कहाँ लैंड होता है | एक साझा फ्लीट, अक्सर एक ऐसे क्षेत्र में जिसे आप पिन नहीं कर सकते | प्राग या कोविल्हा में एक मशीन, एक साइप्रस अनुबंध के अंतर्गत |
| आउटबाउंड पता | एक बड़ी साझा रेंज जिसे कोई अनुमति नहीं दे सकता | AS204057 से एक स्थिर IPv4, अनुमति देने के लिए आपका |
| मशीन क्या रख सकती है | जो भी रनर इमेज संयोग से साथ में शिप हो | कोई भी टूलचेन, लाइसेंस या फ़िक्सचर सेट जिसे आप एक बार इंस्टॉल करते हैं |
यह आपके होस्ट पर कैसे शुरू होता है
बताएं कि पाइपलाइन क्या करती है
आज आप जो सबसे भारी जॉब चलाते हैं, एक साथ कितने चाहिए, और क्या यह कंटेनर इमेज बनाता है। बिना अनुमान लगाए होस्ट का आकार तय करने के लिए इतना पर्याप्त है।
हम मशीन सौंपते हैं
प्राग या कोविल्हा, रूट एक्सेस और एक स्थिर IPv4, दस मिनट से कम में। यदि रनर पहले से किसी इमेज में बना हुआ है तो अपनी इमेज लाएं।
इस पेज पर दिए गए वॉकथ्रू का पालन करें
यह विक्रेता का क्रम है, किसी ब्लॉग पोस्ट के बजाय उनके वर्तमान दस्तावेज़ीकरण से लिया गया है, और एक स्वच्छ होस्ट पर इसमें कुछ मिनट लगते हैं।
इसका स्नैपशॉट लें, फिर दूसरा जोड़ें
पहली पाइपलाइन के हरी होते ही एक स्नैपशॉट लें, ताकि अगली मशीन एक रीबिल्ड के बजाय एक रीस्टोर हो। एक पूल होस्ट जोड़कर बढ़ता है, एक को विशाल बनाकर नहीं।
हमें क्यों चुनें
- टियर III प्रमाणित फ़ैसिलिटी, 99.982% फ़ैसिलिटी SLA
- स्वयं का नेटवर्क, AS204057, IPv4 और IPv6 ड्यूल-स्टैक
- ~10 मिनट की औसत प्रतिक्रिया के साथ 24/7/365 सहायता
- साइप्रस कंपनी, EU क्षेत्राधिकार, 2007 से GDPR-अनुरूप
FAQ
- Woodpecker CI क्या है?
एक हल्का Apache-2.0 CI इंजन, Drone से फ़ोर्क किया गया, जो एक सर्वर और एक या अधिक एजेंट के रूप में चलता है। हर पाइपलाइन चरण एक कंटेनर है, पाइपलाइनें रिपॉज़िटरी में एक YAML फ़ाइल हैं, और यह आपकी फ़ोर्ज के माध्यम से उपयोगकर्ताओं को साइन इन करता है। यह GitHub, GitLab, Gitea, Forgejo और Bitbucket को सपोर्ट करता है, जिसमें आपके द्वारा स्वयं होस्ट किए गए इंस्टेंस भी शामिल हैं
- मैं Woodpecker CI कैसे इंस्टॉल करूँ?
Docker Compose दस्तावेज़ीकृत मार्ग है: पोर्ट 8000 को एक्सपोज़ करने वाला एक woodpecker-server कंटेनर और माउंटेड Docker सॉकेट वाला एक woodpecker-agent कंटेनर, openssl rand -hex 32 से जनरेट किया गया एक सीक्रेट साझा करते हुए, साथ ही आपकी फ़ोर्ज का OAuth क्लाइंट आईडी और सीक्रेट। अपस्ट्रीम compose फ़ाइल और आसपास के चरण इस पेज पर हैं
- WOODPECKER_AGENT_SECRET क्या है और मैं इसे कैसे जनरेट करूँ?
यह वह साझा सीक्रेट है जिससे सर्वर और एजेंट ऑथेंटिकेट करते हैं, और Woodpecker दस्तावेज़ीकरण इसे बनाने के लिए openssl rand -hex 32 बताता है। हर जगह वही मान सेट करना इसे एक सिस्टम टोकन बनाता है; पहले इंटरफ़ेस में एक एजेंट को पंजीकृत करना उस एजेंट को इसके बजाय अपना खुद का टोकन देता है, जो आप तब चाहते हैं जब एक से ज़्यादा टीम होस्ट तक पहुँच सकती है। हर संवेदनशील वेरिएबल का एक _FILE रूप भी है ताकि मान को एक माउंटेड फ़ाइल से पढ़ा जा सके
- Woodpecker को किस आकार के सर्वर की आवश्यकता है?
सॉफ़्टवेयर स्वयं हल्का है - सर्वर एक छोटा Go प्रोसेस है जिसमें एक एम्बेडेड डेटाबेस है जब तक आप इसे Postgres पर पॉइंट न करें, और एजेंट एक सुपरवाइज़र है जो कंटेनर शुरू करता है। जो चीज़ मशीन का उपभोग करती है वह बिल्ड है। 2 vCPU, 4 GB और 64 GB NVMe एक छोटी टीम के लिए सर्वर और एजेंट को एक साथ चलाता है; जब पाइपलाइनें कतार में लगने लगें तो एक डेडिकेटेड एजेंट होस्ट पर जाएं
- एजेंट को Docker सॉकेट की आवश्यकता क्यों है?
क्योंकि हर पाइपलाइन चरण एक कंटेनर है जिसे एजेंट होस्ट डेमन पर शुरू करता है। यह प्रभावी रूप से पाइपलाइन चरणों को उस मशीन पर रूट देता है, जो एक गलत कॉन्फ़िगरेशन के बजाय डिज़ाइन है - और यही कारण है कि एजेंट को ऐसे होस्ट पर रखा जाए जो कुछ और न करे, जो सस्ता है जब दूसरी मशीन की कीमत EUR 15 प्रति माह हो
- मेरी पाइपलाइनें कभी ट्रिगर नहीं होतीं। क्या गलत है?
दस में से नौ बार यह WOODPECKER_HOST है। वह मान वह सार्वजनिक URL है जिसका उपयोग फ़ोर्ज वेबहुक बनाते समय करता है, इसलिए वहाँ एक आंतरिक पता एक ऐसा इंस्टॉलेशन बनाता है जो स्वस्थ दिखता है और कभी पुश प्राप्त नहीं करता। दूसरा सामान्य मामला WOODPECKER_OPEN=true है, जो कोई ट्रिगर समस्या नहीं है लेकिन इसका मतलब है कि आपकी फ़ोर्ज पर अकाउंट वाला कोई भी साइन इन कर सकता है - पहले दिन सुविधाजनक, तीसवें दिन तक गलत
यदि आपको सहायता चाहिए या अतिरिक्त प्रश्न हैं, तो कृपया मैनेजरों से संपर्क करें या सहायता टीम को इस पते पर लिखें support@dcxv.com
शुरू करने के लिए तैयार हैं?
मासिक बिलिंग, कोई सेटअप शुल्क नहीं, कोई लॉक-इन नहीं