Go के लिए CI/CD: 20 मिनट में स्क्रैच से पाइपलाइन लिखना

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका Go प्रोजेक्ट CI/CD क्यों मांगता है, जैसे कुत्ता टहलने के लिए मांगता है

\n\n

आपने Go में एक शानदार माइक्रोसर्विस लिखी है। यह तेज़ है, टेस्ट पास होते हैं, कोड सुंदर है। लेकिन हर सुबह आप मैन्युअल रूप से go build चलाते हैं, SSH के ज़रिए सर्वर पर बाइनरी अपलोड करते हैं और प्रार्थना करते हैं कि कुछ खराब न हो। परिचित लगता है? यदि हाँ — तो मेरे पास आपके लिए एक खबर है: आप अपने जीवन का 15% उस काम में बर्बाद कर रहे हैं जो एक रोबोट कर सकता है।

\n\n

CI/CD (Continuous Integration / Continuous Deployment) — यह सिर्फ DevOps नौकरियों का एक फैशनेबल शब्द नहीं है। यह आपका निजी सहायक है, जो:

\n
    \n
  • Git में हर पुश पर टेस्ट चलाता है;
  • \n
  • Linux/amd64 के लिए बाइनरी बनाता है, भले ही आपके पास Mac हो;
  • \n
  • बिल्ड फेल होने पर Telegram में सूचना भेजता है;
  • \n
  • जब आप main में PR मर्ज करते हैं तो स्वचालित रूप से सर्वर पर डिप्लॉय करता है।
  • \n
\n\n

इस लेख में हम स्क्रैच से Go के लिए CI/CD पाइपलाइन सेटअप करेंगे। बिना पानी के, बिना "20 सर्वरों पर Jenkins लगाएं"। केवल GitHub Actions, Docker और थोड़ा जादू। चलिए शुरू करते हैं!

\n\n

हमें क्या चाहिए

\n

सेटअप के लिए हमें आवश्यकता होगी:

\n
    \n
  • GitHub पर रिपॉजिटरी (अभी एक टेस्ट रिपॉजिटरी बना सकते हैं);
  • \n
  • मॉड्यूल के साथ Go प्रोजेक्ट (हम एक सरल HTTP सर्वर लिखेंगे);
  • \n
  • Docker Hub (या किसी अन्य रजिस्ट्री) पर खाता;
  • \n
  • 5 मिनट का ध्यान और रूटीन को ऑटोमेट करने की इच्छा।
  • \n
\n\n

हम जो भी कोड उपयोग करेंगे, वह सार्वजनिक रूप से उपलब्ध है। आप इसे कॉपी करके अपने प्रोजेक्ट के अनुसार अनुकूलित कर सकते हैं। मुख्य बात — टोकन और रिपॉजिटरी के नाम अपने से बदलना न भूलें।

\n\n

चरण 1: एक सरल Go एप्लिकेशन लिखना

\n

प्रदर्शन के लिए हम एक न्यूनतम HTTP सर्वर लेंगे। main.go फ़ाइल बनाएं:

\n\n
package main\n\nimport (\n    "fmt"\n    "net/http"\n)\n\nfunc main() {\n    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n        fmt.Fprintf(w, "Hello from Go CI/CD pipeline!")\n    })\n\n    http.ListenAndServe(":8080", nil)\n}\n
\n\n

और कार्यक्षमता जांचने के लिए main_test.go फ़ाइल:

\n\n
package main\n\nimport (\n    "net/http"\n    "net/http/httptest"\n    "testing"\n)\n\nfunc TestHelloHandler(t *testing.T) {\n    req := httptest.NewRequest("GET", "/", nil)\n    w := httptest.NewRecorder()\n\n    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n        fmt.Fprintf(w, "Hello from Go CI/CD pipeline!")\n    })\n\n    http.DefaultServeMux.ServeHTTP(w, req)\n\n    if w.Code != http.StatusOK {\n        t.Errorf("expected status 200, got %d", w.Code)\n    }\n}\n
\n\n

मॉड्यूल इनिशियलाइज़ करें:

\n
go mod init github.com/आपका-यूज़रनेम/go-cicd-example\ngo mod tidy\n
\n\n

जांचें कि सब कुछ काम कर रहा है:

\n
go test ./... -v\ngo run main.go\n
\n\n

यदि आप ok और localhost:8080 पर स्वागत संदेश देखते हैं — आप शानदार हैं। आगे बढ़ते हैं।

\n\n

चरण 2: Go एप्लिकेशन के लिए Dockerfile बनाना

\n

कंटेनरीकरण — आधुनिक डिप्लॉयमेंट का एक अनिवार्य चरण है। हम एक स्टैटिक बाइनरी (CGO के बिना) बनाएंगे और इसे scratch या alpine पर आधारित न्यूनतम इमेज में पैक करेंगे। इससे हमें 300+ MB के बजाय लगभग 10–15 MB की इमेज मिलेगी।

\n\n

प्रोजेक्ट की रूट में Dockerfile फ़ाइल बनाएं:

\n\n
FROM golang:1.22-alpine AS builder\n\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -o main .\n\nFROM alpine:latest\nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /app/main .\nEXPOSE 8080\nCMD ["./main"]\n
\n\n

ध्यान दें: हम मल्टी-स्टेज बिल्ड का उपयोग कर रहे हैं। पहला चरण — पूर्ण Go वातावरण में कंपाइलेशन। दूसरा — न्यूनतम Alpine इमेज, जिसमें केवल बाइनरी कॉपी की जाती है। Go एप्लिकेशन के लिए यह उद्योग मानक है।

\n\n

इमेज को लोकल बनाएं और जांचें:

\n
docker build -t go-cicd-example .\ndocker run -p 8080:8080 go-cicd-example\n
\n\n

यदि सब ठीक है — तो आगे बढ़ते हैं

ब्लॉग

पुस्तक अनुशंसाएँ