{"id":30911,"date":"2026-10-15T21:59:16","date_gmt":"2026-10-15T21:59:16","guid":{"rendered":"https:\/\/umang.pk\/2026\/10\/15\/github-%d8%a7%db%8c%da%a9%d8%b4%d9%86%d8%b2%d8%8c-%d8%a7%d9%86%da%af%d8%b1%db%8c%d8%b3%d8%8c-%d8%a7%d9%88%d8%b1-%d8%ae%d9%88%d8%af%da%a9%d8%a7%d8%b1-tls-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85\/"},"modified":"2026-10-15T21:59:18","modified_gmt":"2026-10-15T21:59:18","slug":"github-%d8%a7%db%8c%da%a9%d8%b4%d9%86%d8%b2%d8%8c-%d8%a7%d9%86%da%af%d8%b1%db%8c%d8%b3%d8%8c-%d8%a7%d9%88%d8%b1-%d8%ae%d9%88%d8%af%da%a9%d8%a7%d8%b1-tls-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/10\/15\/github-%d8%a7%db%8c%da%a9%d8%b4%d9%86%d8%b2%d8%8c-%d8%a7%d9%86%da%af%d8%b1%db%8c%d8%b3%d8%8c-%d8%a7%d9%88%d8%b1-%d8%ae%d9%88%d8%af%da%a9%d8%a7%d8%b1-tls-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85\/","title":{"rendered":"GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632\u060c \u0627\u0646\u06af\u0631\u06cc\u0633\u060c \u0627\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 TLS \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 GKE \u067e\u0631 \u0627\u06cc\u06a9 \u0639\u0627\u0631\u0636\u06cc PR \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2"},"content":{"rendered":"\n<div id=\"\">\n<p>\u06c1\u0631 \u0648\u06c1 \u0679\u06cc\u0645 \u062c\u0648 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0622\u062e\u0631 \u06a9\u0627\u0631 \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06c1\u0631 \u0679\u06cc\u0645 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0634\u062a\u0631\u06a9\u06c1 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0645\u0627\u062d\u0648\u0644\u060c \u06a9\u0626\u06cc \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0633\u06cc \u06a9\u0648 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0622\u062f\u06be\u06cc \u0645\u06a9\u0645\u0644 \u062e\u0635\u0648\u0635\u06cc\u062a \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0634\u062e\u0635 \u0631\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062a\u06cc\u0633\u0631\u0627 \u0634\u062e\u0635 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0645\u0639\u0631\u0627\u062a \u06a9\u06cc \u062f\u0648\u067e\u06c1\u0631 \u062a\u06a9\u060c \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646 \u0633\u06a9\u06d2 \u06af\u0627 \u06a9\u06c1 \u0628\u0631\u0627\u0646\u0686 \u06a9\u0627 \u06a9\u0648\u0646 \u0633\u0627 \u0648\u0631\u0698\u0646 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 &quot;\u06cc\u06c1 \u0627\u0633\u0679\u06cc\u062c \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2&#8221; \u06a9\u0627 \u0628\u06cc\u0627\u0646 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u063a\u06cc\u0631 \u0645\u0639\u0644\u0648\u0645\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062d\u0644 \u0648\u0627\u0642\u0641 \u06c1\u06d2\u06d4 \u0633\u0644\u06cc\u06a9 \u0686\u06cc\u0646\u0644\u0632 \u062c\u06c1\u0627\u06ba \u0644\u0648\u06af \u0633\u0679\u06cc\u062c\u0646\u06af \u067e\u0631 \u0627\u0635\u0631\u0627\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u06cc\u0633\u06d2 \u06a9\u0627\u0646\u0641\u0631\u0646\u0633 \u0631\u0648\u0645\u0632\u060c \u06af\u06be\u0648\u0645\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06d2 \u0646\u0638\u0627\u0645 \u0627\u0644\u0627\u0648\u0642\u0627\u062a\u060c \u06cc\u0627 \u062f\u0648\u0633\u0631\u0627 \u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644\u060c \u062a\u06cc\u0633\u0631\u0627 \u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644\u060c \u06c1\u0631 \u0627\u06cc\u06a9 \u0622\u062e\u0631\u06cc \u06a9\u06cc \u0646\u0633\u0628\u062a \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0633\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0648\u06c1\u0627\u06ba \u0628\u06c1\u062a\u0631 \u0646\u0645\u0648\u0646\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 Vercel\u060c Netlify\u060c \u0627\u0648\u0631 Shopify \u062c\u06cc\u0633\u06cc \u06a9\u0645\u067e\u0646\u06cc\u0648\u06ba \u06a9\u06cc \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645\u0648\u06ba \u0646\u06d2 \u0627\u0646\u06c1\u06cc\u06ba \u0645\u0639\u06cc\u0627\u0631\u06cc \u0628\u0646\u0627 \u062f\u06cc\u0627 \u06c1\u06d2\u06d4 <strong>\u06c1\u0631 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u0646\u0641\u0631\u062f \u062a\u062c\u0631\u0628\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba\u06d4<\/strong>.<\/p>\n<p>PR \u06a9\u06be\u0648\u0644\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u0627\u06cc\u06a9 \u0646\u0626\u06cc\u060c \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u06a9\u0627\u067e\u06cc \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u062a\u0639\u06cc\u0646\u0627\u062a \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u0628 \u0622\u067e \u06a9\u0633\u06cc \u0627\u0648\u0631 \u06a9\u0645\u0679 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0633\u06d2 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u06af\u0631 \u0622\u067e PR \u06a9\u0648 \u0636\u0645 \u06cc\u0627 \u0628\u0646\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0633\u0628 \u06a9\u0686\u06be \u062d\u0630\u0641 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u06a9\u0648\u0626\u06cc \u0642\u0637\u0627\u0631 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u0628\u0644\u0646\u06af \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u06a9\u0644\u06cc\u0626\u0631\u0646\u0633 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u0628\u06c1\u0627\u0624 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u06c1\u0645 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u0628\u0646\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0646\u0642\u0627\u062f \u06a9\u06d2 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0633\u06d2 \u0627\u06cc\u0633\u0627 \u06c1\u06cc \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0635\u0644 \u0648\u0642\u062a \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 URLs \u06a9\u06d2 \u0633\u0627\u062a\u06be \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0628\u0648\u0679 \u062a\u0628\u0635\u0631\u06d2\u06d4<\/p>\n<h2 id=\"heading-what-youll-build\">\u06a9\u06cc\u0627 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u0646\u0627 \u06c1\u06d2<\/h2>\n<p>\u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u06a9\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645 \u062a\u06a9\u060c \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0648\u0631\u06a9\u0646\u06af \u0633\u0633\u0679\u0645 \u06c1\u0648\u06af\u0627 \u062c\u0648 \u0627\u0633 \u0637\u0631\u062d \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u0627:<\/p>\n<ul wp_automatic_readability=\"10.5\">\n<li wp_automatic_readability=\"0\">\n<p>\u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06be\u0648\u0644\u0646\u06d2 \u0633\u06d2 \u0627\u06cc\u06a9 GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u06c1 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 PR \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u06cc\u06af \u06a9\u0631\u062f\u06c1 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u0627\u0645\u06cc\u062c \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>\u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648 \u06af\u0648\u06af\u0644 \u0622\u0631\u0679\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u0645\u06cc\u06ba \u062f\u06be\u06a9\u06cc\u0644 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"3\">\n<p>\u0627\u06cc\u06a9 \u0648\u0642\u0641 Kubernetes \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 (<code>pr-42<\/code>\u060c <code>pr-43<\/code>\u0648\u063a\u06cc\u0631\u06c1) \u0627\u06cc\u06a9 GKE \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u06a9\u0648\u0679\u06d2 \u06a9\u06d2 \u062a\u0627\u0628\u0639 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"0\">\n<p>\u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0627\u0646 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0645\u0627\u0645 \u062f\u06cc\u06af\u0631 PR \u0645\u0627\u062d\u0648\u0644 \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0644\u06af \u062a\u06be\u0644\u06af\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"1\">\n<p>\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0646\u06af\u0631\u06cc\u0633 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0631\u0648\u0679\u0646\u06af <code>pr-42.preview.yourdomain.com<\/code> \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u062c\u0627\u0631\u06cc \u06a9\u0631\u062f\u06c1 \u062f\u0631\u0633\u062a TLS \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"0\">\n<p>\u0628\u0648\u0679 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0644\u0627\u0626\u06cc\u0648 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u067e\u0631 \u062a\u0628\u0635\u0631\u06d2 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u062f\u06be\u06a9\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633\u06cc \u062a\u0628\u0635\u0631\u06d2 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>\u0627\u06cc\u06a9 \u0646\u0626\u06cc \u06a9\u0645\u0679 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0646\u0627 \u0622\u067e \u06a9\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u0634\u062f\u06c1 \u06a9\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>PR \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u0646\u06d2 \u06cc\u0627 \u0636\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0645\u0648\u062c\u0648\u062f \u06c1\u0631 \u0686\u06cc\u0632 \u062d\u0630\u0641 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>\u0637\u06d2 \u0634\u062f\u06c1 \u0679\u0627\u0633\u06a9 \u0633\u0691\u0646 \u0645\u06cc\u06ba \u0686\u06be\u0648\u0679 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0622\u067e \u062a\u06cc\u0646 \u06a9\u0644\u06cc\u062f\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 Terraform \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u0628\u06be\u06cc \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u060c \u06c1\u0631 \u0627\u06cc\u06a9 \u0627\u067e\u0646\u06d2 \u062d\u0635\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u06d4<\/p>\n<ol wp_automatic_readability=\"6.5\">\n<li wp_automatic_readability=\"3\">\n<p><strong>\u06a9\u0648\u0626\u06cc \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0644\u06cc\u062f \u0646\u06c1\u06cc\u06ba:<\/strong> GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u06a9\u0648 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0628\u0644\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0642\u0644\u06cc\u0644 \u0627\u0644\u0645\u062f\u062a\u06cc OIDC \u0679\u0648\u06a9\u0646 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1\u06d4 GitHub \u0631\u0627\u0632\u0648\u06ba \u0645\u06cc\u06ba \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 JSON \u06a9\u06cc\u0632 \u0622\u062c \u06a9\u0644 CI\/CD \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0639\u0627\u0645 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u0645\u0633\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0636\u0631\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"4\">\n<p><strong>\u0627\u06cc\u06a9 PR \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631:<\/strong> \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0646\u06af\u0631\u06cc\u0633 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0631\u0648\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645\u0648\u06ba \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u0627\u062f\u06c1 \u0648\u0631\u0698\u0646 \u06c1\u0631 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0624\u0688 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u062c\u0644\u062f\u06cc \u0645\u06c1\u0646\u06af\u0627 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"3\">\n<p><strong>\u062a\u06be\u06cc\u0648\u0631\u06cc\u0645 \u0641\u0631\u0636 \u06a9\u0631\u0646\u0627 \u0646\u0627\u06a9\u0627\u0645\u06cc:<\/strong> \u062c\u0628 PR \u062e\u062a\u0645 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0633\u0691\u0646 \u0686\u0644\u0627\u0626\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0634\u06cc\u0688\u06cc\u0648\u0644\u0688 \u0631\u06cc\u067e\u0631\u0632 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u0628\u06be\u06cc \u062d\u0630\u0641 \u06a9\u0631 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06d2 PR \u063a\u0627\u0626\u0628 \u06c1\u0648 \u0686\u06a9\u06d2 \u06c1\u06cc\u06ba \u06cc\u0627 \u0627\u0646 \u06a9\u06cc \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0632\u0646\u062f\u06af\u06cc \u06af\u0632\u0631 \u0686\u06a9\u06cc \u06c1\u06d2\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0644\u06cc\u0646 \u0627\u067e \u0628\u06be\u06cc \u062c\u0648 95% \u0645\u0648\u062b\u0631 \u06c1\u06cc\u06ba \u067e\u06be\u0631 \u0628\u06be\u06cc \u0644\u06cc\u06a9 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0644\u06cc\u06a9 \u0622\u067e \u06a9\u06d2 \u0628\u0644 \u067e\u0631 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u06c1\u0645 \u062c\u0633 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u06c1\u06d2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101547_235_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u067e\u0648\u0631\u06d2 \u0646\u0638\u0627\u0645 \u06a9\u0627 \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631 \u0688\u0627\u06cc\u0627\u06af\u0631\u0627\u0645\u06d4 GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u0648\u0631\u06a9 \u0644\u0648\u0688 \u0622\u0626\u06cc\u0688\u06cc\u0646\u0679\u06cc \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u0627\u0648\u0631 \u0622\u0631\u0679\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 GKE \u06a9\u0644\u0633\u0679\u0631\u0632 \u0628\u0646\u0627\u062a\u0627 \u0627\u0648\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0628 \u06a9\u06c1 \u0628\u0631\u0627\u0624\u0632\u0631 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 DNS\u060c \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 Google \u06a9\u0644\u0627\u0624\u0688 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631\u060c \u0627\u0648\u0631 TLS \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 NGINX Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0641\u06cc \u067e\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u062a\u06a9 \u067e\u06c1\u0646\u0686\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4\" style=\"display: block;\" width=\"2136\" height=\"1424\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062e\u0627\u06a9\u06c1 \u0627\u06cc\u06a9 \u06c1\u06cc \u0646\u0638\u0627\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0648 \u0627\u0644\u06af \u0627\u0644\u06af \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0646\u06cc\u0644\u06d2 \u0631\u0646\u06af \u0645\u06cc\u06ba \u0646\u0634\u0627\u0646 \u0632\u062f \u0631\u0627\u0633\u062a\u06d2 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06c1\u06cc\u06ba\u06d4 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u06a9\u0648 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 GitHub \u0627\u06cc\u06a9\u0634\u0646 \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 PR-\u0679\u06cc\u06af \u0634\u062f\u06c1 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0648 \u0622\u0631\u0679\u06cc\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u0645\u06cc\u06ba \u062f\u06be\u06a9\u06cc\u0644\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 GKE \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 (<code>pr-42<\/code>\u060c <code>pr-43<\/code>\u0648\u063a\u06cc\u0631\u06c1) \u0627\u0646 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u060c \u062e\u062f\u0645\u0627\u062a\u060c \u0627\u0648\u0631 \u067e\u0648\u0688\u0632 \u06c1\u0631 \u0686\u06cc\u0632 \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0622\u06af\u06d2 \u062f\u0648 \u0627\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062d\u0635\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0628\u0648\u0679 \u06c1\u06d2 \u062c\u0648 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u0648 \u067e\u0648\u0633\u0679 \u0627\u0648\u0631 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u0627 \u0627\u06cc\u06a9 \u0637\u06d2 \u0634\u062f\u06c1 \u0631\u06cc\u067e\u0631 \u06c1\u06d2 \u062c\u0648 \u06cc\u062a\u06cc\u0645 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u062a\u0644\u0627\u0634 \u0627\u0648\u0631 \u062d\u0630\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0628\u0632 \u0646\u0642\u0637\u06d2 \u0648\u0627\u0644\u0627 \u0631\u0627\u0633\u062a\u06c1 \u0639\u0648\u0627\u0645\u06cc \u0646\u0642\u0644 \u0648 \u062d\u0645\u0644 \u06c1\u06d2\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 URL \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u06cc\u06a9 GCP \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u062c\u0648 \u067e\u06be\u0631 \u0627\u0633\u06d2 \u0645\u0634\u062a\u0631\u06a9\u06c1 NGINX Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0648 \u0628\u06be\u06cc\u062c \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0645\u0648\u0627\u062f \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4 <code>Host<\/code> \u06c1\u06cc\u0688\u0631 \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0635\u062d\u06cc\u062d \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u0644\u06d2 \u062c\u0627\u0626\u06cc\u06ba\u06d4 cert-manager Let&#8217;s Encrypt \u0633\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u06c1\u0631 \u0645\u0627\u062d\u0648\u0644 \u0627\u067e\u0646\u0627 \u062f\u0631\u0633\u062a TLS \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u06d2\u06d4<\/p>\n<p>\u0627\u06c1\u0645 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06a9\u06cc\u0627 \u06c1\u06cc\u06ba\u061f <em>\u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba<\/em> \u0636\u0631\u0628 \u0627\u06cc\u06a9 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631\u060c \u0627\u06cc\u06a9 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06be\u0644\u06cc \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0633\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<p>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06cc\u06ba:<\/p>\n<ul wp_automatic_readability=\"18.655068078669\">\n<li wp_automatic_readability=\"1.8008298755187\">\n<p><strong>\u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679<\/strong> \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u0648 \u0686\u0627\u0644\u0648 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062a\u0648 console.cloud.google.com \u067e\u0631 \u0627\u06cc\u06a9 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06cc \u0644\u0627\u06af\u062a \u062a\u0642\u0631\u06cc\u0628\u0627\u064b $5-$10 \u06c1\u06d2\u060c \u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u06a9\u062a\u0646\u06cc \u062f\u06cc\u0631 \u062a\u06a9 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u062e\u0631 \u0645\u06cc\u06ba \u0635\u0641\u0627\u0626\u06cc \u06a9\u06d2 \u062d\u0635\u06d2 \u06a9\u0648 \u0645\u062a \u0686\u06be\u0648\u0691\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"1\">\n<p><code>gcloud<\/code> <strong>\u0633\u06cc \u0627\u06cc\u0644 \u0622\u0626\u06cc<\/strong> \u0627\u0646\u0633\u0679\u0627\u0644 \u0627\u0648\u0631 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1\u06d4 \u0686\u0644\u0627\u0626\u06cc\u06ba <code>gcloud auth login<\/code> \u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 <code>gcloud config set project YOUR_PROJECT_ID<\/code> \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0627\u067e\u0646\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p><strong>\u0679\u06cc\u0631\u0627\u0641\u0627\u0631\u0645<\/strong> \u0648\u0631\u0698\u0646 1.5 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0627\u0648\u067e\u0631\u06d4 \u0627\u0633\u06d2 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba <code>terraform version<\/code>.<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p><code>kubectl<\/code>    \u0627\u0646\u0633\u0679\u0627\u0644 \u0622\u067e \u06a9\u06d2 Kubernetes \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0639\u0627\u0645\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 CLI\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"0\">\n<p><strong>\u0688\u0627\u06a9\u0631<\/strong> \u062a\u0639\u0645\u06cc\u0631\u0627\u062a \u06a9\u0648 CI \u06a9\u06d2 \u062d\u0648\u0627\u0644\u06d2 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0679\u06cc\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"1\">\n<p><strong>GitHub \u0630\u062e\u06cc\u0631\u06c1<\/strong> \u062c\u0648 \u0622\u067e \u06a9\u06d2 \u0645\u0627\u0644\u06a9 \u06c1\u06cc\u06ba\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0627 \u0645\u062d\u0631\u06a9 \u06c1\u06d2 \u062c\u0648 \u06c1\u0645 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u0630\u062e\u06cc\u0631\u06c1 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u06c1\u0627\u06ba \u06c1\u0645 \u0634\u0627\u062e\u0648\u06ba \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u06a9\u06be\u0648\u0644 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"11\">\n<p><strong>\u0688\u0648\u06a9\u0631 \u06a9\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0639\u0644\u0645<\/strong> (\u062a\u0635\u0648\u06cc\u0631\u060c \u067e\u0631\u062a\u060c \u0688\u0627\u06a9\u0631 \u0641\u0627\u0626\u0644) <strong>\u06a9\u0648\u0628\u0631\u0646\u06cc\u0679\u0633<\/strong> (\u067e\u0648\u0688\u060c \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u060c \u062e\u062f\u0645\u062a\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1) \u0627\u0648\u0631 <strong>\u06af\u0679 \u06c1\u0628 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632<\/strong> (\u0648\u0631\u06a9 \u0641\u0644\u0648\u060c \u0679\u0627\u0633\u06a9\u060c \u0645\u0631\u062d\u0644\u06c1)\u06d4 \u0622\u067e \u06a9\u0648 \u0645\u0627\u06c1\u0631 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0622\u067e \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0686\u06cc\u0632\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"0\">\n<p><strong>\u06a9\u0646\u0679\u0631\u0648\u0644<\/strong> \u0648\u0631\u0698\u0646 3 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba (\u0627\u0646\u06af\u0631\u06cc\u0633 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0627\u0648\u0631 \u0633\u0631\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2) <code>helm version<\/code>.<\/p>\n<\/li>\n<li wp_automatic_readability=\"4\">\n<p><strong>\u0688\u0648\u0645\u06cc\u0646 \u06a9\u0627 \u0646\u0627\u0645 \u062c\u0633 \u06a9\u0627 \u0622\u067e \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/strong>\u0627\u0633 \u0645\u06cc\u06ba DNS \u0631\u06cc\u06a9\u0627\u0631\u0688\u0632 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u06c1\u06d2\u06d4 \u0627\u0633 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0641\u0631\u0642 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u062a\u0627 \u06a9\u06c1 \u0622\u067e \u06a9\u06c1\u0627\u06ba \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06cc\u06ba\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u0642\u0641 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u06a9 \u0630\u06cc\u0644\u06cc \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba\u060c \u062c\u06cc\u0633\u0627 \u06a9\u06c1: <code>preview.yourdomain.com<\/code>\u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u067e\u0648\u0631\u0627 \u0645\u0627\u062d\u0648\u0644 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0688\u0648\u0645\u06cc\u0646 \u06a9\u06cc \u0636\u0631\u0648\u0631\u06cc\u0627\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0646\u0648\u0679: \u06cc\u06c1 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u0646\u0627\u0642\u0627\u0628\u0644 \u0641\u0631\u0627\u0645\u0648\u0634 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4 \u0622\u0626\u06cc\u06d2 \u0627\u0646\u06a9\u0631\u067e\u0679 \u06a9\u0648 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u0622\u067e \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u067e\u0646\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0639\u0648\u0627\u0645\u06cc \u0627\u0646\u0679\u0631\u0646\u06cc\u0679 \u067e\u0631 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u06a9\u06d2 \u0627\u06cc\u0633\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>.local<\/code> \u0688\u0648\u0645\u06cc\u0646\u060c \u0622\u0626\u0679\u0645 <code>\/etc\/hosts<\/code>\u06cc\u0627 \u0648\u06c1 \u0688\u0648\u0645\u06cc\u0646 \u062c\u0648 \u0622\u067e \u06a9\u06d2 \u0645\u0627\u0644\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u062c\u0628 \u06a9\u0648\u0626\u06cc \u0641\u0627\u0644\u062a\u0648 \u0688\u0648\u0645\u06cc\u0646 \u0646\u06c1 \u06c1\u0648\u06d4 <code>.dev<\/code> \u06cc\u0627 <code>.xyz<\/code> \u0627\u0633 \u06a9\u06cc \u0644\u0627\u06af\u062a \u0627\u06cc\u06a9 \u0633\u0627\u0644 \u0645\u06cc\u06ba \u0686\u0646\u062f \u067e\u0627\u0624\u0646\u0688 \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u0627\u0644\u06a9\u0644 \u0627\u0633 \u0642\u0633\u0645 \u06a9\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0648\u062c\u06c1 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0686\u06cc\u0632 \u06c1\u06d2: <code>gke-gcloud-auth-plugin<\/code>. \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0648\u0631\u0698\u0646 <code>gcloud<\/code> \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0627\u067e\u0646\u06d2 GKE \u06a9\u0644\u0633\u0679\u0631 \u0633\u06d2 \u062c\u0691\u06cc\u06ba \u06af\u06d2 \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0627\u0633\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u06a9\u06c1\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0622\u067e \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06a9\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">gcloud components install gke-gcloud-auth-plugin\n<\/code><\/pre>\n<h2 id=\"heading-step-1-set-up-the-project-structure\">\u0645\u0631\u062d\u0644\u06c1 1: \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u0688\u06be\u0627\u0646\u0686\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/h2>\n<p>\u067e\u06c1\u0644\u06d2 \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc\u0632 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0648\u0627\u0636\u062d \u0630\u06c1\u0646\u06cc \u0645\u0627\u0688\u0644 \u06c1\u0648 \u06a9\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u06a9\u06c1\u0627\u06ba \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">mkdir -p pr-preview-envs\/{app,terraform,k8s\/base,.github\/workflows}\ncd pr-preview-envs\ngit init\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2:<\/p>\n<ul wp_automatic_readability=\"2.5\">\n<li wp_automatic_readability=\"-1\">\n<p><code>app\/<\/code>: \u06af\u0648 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u0648\u0631 \u0645\u062a\u0639\u0644\u0642\u06c1 \u0688\u0627\u06a9\u0631 \u0641\u0627\u0626\u0644<\/p>\n<\/li>\n<li wp_automatic_readability=\"2\">\n<p><code>terraform\/<\/code>: \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06c1 \u0628\u0637\u0648\u0631 \u06a9\u0648\u0688: GKE \u06a9\u0644\u0633\u0679\u0631\u060c \u0622\u0631\u0679\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc\u060c \u06a9\u0627\u0645 \u06a9\u0627 \u0628\u0648\u062c\u06be \u0634\u0646\u0627\u062e\u062a \u0627\u062a\u062d\u0627\u062f \u0633\u06cc\u0679 \u0627\u067e<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p><code>k8s\/base\/<\/code>: \u0628\u0646\u06cc\u0627\u062f\u06cc Kubernetes \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062a\u0645\u0627\u0645 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p><code>.github\/workflows\/<\/code>: \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u0646\u06d2 \u0627\u0648\u0631 \u062a\u0628\u0627\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648 GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648\u0632<\/p>\n<\/li>\n<\/ul>\n<p>\u0645\u0631\u062d\u0644\u06c1 5 \u0645\u06cc\u06ba \u0648\u0631\u06a9 \u0644\u0648\u0688 \u0622\u0626\u06cc\u0688\u06cc\u0646\u0679\u06cc \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u0633\u06cc\u0679\u0646\u06af\u0632 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u0627 \u067e\u0648\u0631\u0627 \u0646\u0627\u0645 \u062f\u0631\u062c \u06a9\u0631\u06cc\u06ba (<code>owner\/repo<\/code>):<\/p>\n<pre><code class=\"language-bash\">git remote add origin https:\/\/github.com\/YOUR_USERNAME\/pr-preview-envs.git\n<\/code><\/pre>\n<h2 id=\"heading-step-2-write-the-application\">\u0645\u0631\u062d\u0644\u06c1 2: \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06a9\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0622\u067e \u06a9\u0648 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 <strong>\u062c\u0627\u0624<\/strong>\u0627\u0633 \u0645\u0646\u0635\u0648\u0628\u06d2 \u06a9\u06cc \u062e\u0627\u0635 \u0627\u06c1\u0645\u06cc\u062a \u06a9\u06cc \u062a\u06cc\u0646 \u0648\u062c\u0648\u06c1\u0627\u062a \u06c1\u06cc\u06ba:<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06af\u0648 \u06a9\u0648 \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f \u062c\u0627\u0645\u062f \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u0633\u0644\u06a9 \u0628\u0627\u0626\u0646\u0631\u06cc \u0645\u06cc\u06ba \u0645\u0631\u062a\u0628 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0631\u0646 \u0679\u0627\u0626\u0645 \u06cc\u0627 \u0627\u0646\u0679\u0631\u067e\u0631\u06cc\u0679\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u06a9\u06cc \u0628\u06c1\u062a \u0686\u06be\u0648\u0679\u06cc \u062a\u0635\u0627\u0648\u06cc\u0631\u060c \u0627\u0648\u0631 \u0686\u06be\u0648\u0679\u06cc \u062a\u0635\u0627\u0648\u06cc\u0631 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u062a\u06cc\u0632 \u062f\u06be\u06a9\u06d2 \u0627\u0648\u0631 \u062a\u06cc\u0632 \u06a9\u06be\u06cc\u0646\u0686\u0646\u0627\u060c \u062c\u0648 \u06a9\u06c1 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0628\u0646\u0627\u062a\u06d2 \u0648\u0642\u062a \u0628\u06c1\u062a \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 <em>\u062a\u0645\u0627\u0645 \u0639\u0648\u0627\u0645\u06cc PRs \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u06c1\u06d2\u06d4<\/em>.<\/p>\n<p>\u062f\u0648\u0633\u0631\u0627\u060c \u062c\u0627\u0624 <code>-ldflags -X<\/code> \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u0622\u067e \u06a9\u0648 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0648\u0642\u062a \u0627\u067e\u0646\u06cc \u0628\u0627\u0626\u0646\u0631\u06cc \u0645\u06cc\u06ba \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0627\u0633\u06d2 PR \u0646\u0645\u0628\u0631\u0648\u06ba \u06a9\u0648 \u0628\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 Git \u06a9\u0645\u0679 SHA \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0627\u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u0628\u062e\u0648\u0628\u06cc \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648 \u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u06a9\u06cc\u0627 \u0686\u0644 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0627\u0648\u0642\u0627\u062a \u062a\u06cc\u0632 \u06c1\u06cc\u06ba \u0627\u0648\u0631 CI \u0648\u0642\u062a \u0645\u0641\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>app\/main.go<\/code>:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"fmt\"\n\t\"net\/http\"\n\t\"os\"\n)\n\n\/\/ These values are empty at compile time and get injected by the\n\/\/ linker via -ldflags -X during the Docker build. See the Dockerfile.\nvar (\n\tprNumber = \"local\"\n\tgitSha   = \"dev\"\n)\n\nfunc handler(w http.ResponseWriter, r *http.Request) {\n\t\/\/ Kubernetes injects these via the Downward API \u2014 see deployment.yaml\n\tnamespace := os.Getenv(\"POD_NAMESPACE\")\n\tpodName := os.Getenv(\"POD_NAME\")\n\n\tif namespace == \"\" {\n\t\tnamespace = \"not-in-kubernetes\"\n\t}\n\tif podName == \"\" {\n\t\tpodName, _ = os.Hostname()\n\t}\n\n\tfmt.Fprintf(w, \"Preview environment is livenn\")\n\tfmt.Fprintf(w, \"PR number  : %sn\", prNumber)\n\tfmt.Fprintf(w, \"Git SHA    : %sn\", gitSha)\n\tfmt.Fprintf(w, \"Namespace  : %sn\", namespace)\n\tfmt.Fprintf(w, \"Pod name   : %sn\", podName)\n}\n\nfunc healthz(w http.ResponseWriter, r *http.Request) {\n\tw.WriteHeader(http.StatusOK)\n\tfmt.Fprintln(w, \"ok\")\n}\n\nfunc main() {\n\thttp.HandleFunc(\"\/\", handler)\n\thttp.HandleFunc(\"\/healthz\", healthz)\n\n\tfmt.Println(\"Server starting on port 8080...\")\n\tif err := http.ListenAndServe(\":8080\", nil); err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"server error: %vn\", err)\n\t\tos.Exit(1)\n\t}\n}\n<\/code><\/pre>\n<p>\u0627\u0646\u062f\u0631 \u0633\u06d2 \u0627\u06cc\u06a9 \u06af\u0648 \u0645\u0627\u0688\u06cc\u0648\u0644 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u0627 <code>app\/<\/code>:<\/p>\n<pre><code class=\"language-bash\">cd app\ngo mod init preview-app\n<\/code><\/pre>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0633 \u067e\u0631 \u0627\u06cc\u06a9 \u0646\u0638\u0631 \u0688\u0627\u0644\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u06a9\u0648\u0688 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u062d\u0635\u06c1 \u0648\u06c1\u0627\u06ba \u06a9\u06cc\u0648\u06ba \u06c1\u06d2\u06d4<\/p>\n<p><code>var prNumber = \"local\"<\/code> <strong>\u0627\u0648\u0631<\/strong> <code>var gitSha = \"dev\"<\/code>    \u0688\u06cc\u0641\u0627\u0644\u0679 \u0642\u062f\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u067e\u06cc\u06a9\u06cc\u062c \u0644\u06cc\u0648\u0644 \u0633\u0679\u0631\u0646\u06af \u0645\u062a\u063a\u06cc\u0631\u06d4 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u062f\u06cc\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u06af\u0631 \u0622\u067e \u0628\u0627\u0626\u0646\u0631\u06cc \u06a9\u0648 \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u063a\u06cc\u0631 \u0688\u0648\u06a9\u0631 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u0633\u06d2 \u06af\u0632\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>CI \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646\u060c Go \u0644\u0646\u06a9\u0631 CI \u06a9\u0648 \u0627\u0635\u0644 PR \u0646\u0645\u0628\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 SHA \u06a9\u0627 \u0627\u0631\u062a\u06a9\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u067e\u0648\u0631\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0627\u0631\u0622\u0645\u062f \u0688\u06cc\u0628\u06af\u0646\u06af \u0641\u06cc\u0686\u0631 \u06c1\u06d2\u06d4 \u062c\u0628 \u0622\u067e \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u06cc\u06ba \u06af\u06d2\u060c \u062a\u0648 \u0627\u06cc\u067e \u062e\u0648\u062f \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u0626\u06d2 \u06af\u06cc \u06a9\u06c1 \u06cc\u06c1 \u06a9\u0633 \u06a9\u0645\u0679 \u067e\u0631 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>os.Getenv(\"POD_NAMESPACE\")<\/code> <strong>\u0627\u0648\u0631<\/strong> <code>os.Getenv(\"POD_NAME\")<\/code>    \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u0648 \u067e\u0691\u06be\u06cc\u06ba \u062c\u0648 Kubernetes \u06a9\u0646\u0679\u06cc\u0646\u0631 \u0645\u06cc\u06ba \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u0646\u06cc\u0686\u06d2 \u06a9\u06cc \u0637\u0631\u0641 API<\/strong>. \u06c1\u0645 \u0627\u0633\u06d2 \u0645\u0631\u062d\u0644\u06c1 8 \u0645\u06cc\u06ba \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0645\u06cc\u06ba \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>Downward API Pods \u06a9\u0648 Kubernetes API \u0627\u0633\u0646\u0627\u062f \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u067e\u0646\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627 (\u0627\u0646 \u06a9\u0627 \u0646\u0627\u0645\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u060c \u0627\u0648\u0631 \u0644\u06cc\u0628\u0644) \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u0627 \u0635\u0627\u0641 \u062a\u0631\u06cc\u0646 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u06a9\u06c1\u0627\u06ba \u0686\u0644 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u06a9\u06c1<\/strong> <code>handler<\/code> <strong>\u0641\u0646\u06a9\u0634\u0646<\/strong> \u0631\u0648\u0679 \u067e\u0627\u062a\u06be \u0645\u06cc\u06ba \u0631\u062c\u0633\u0679\u0631\u0688\u06d4 <code>\/<\/code>. \u062c\u0648\u0627\u0628 \u0645\u06cc\u06ba PR \u0646\u0645\u0628\u0631\u060c \u06a9\u0645\u0679 SHA\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u060c \u0627\u0648\u0631 Pod \u06a9\u0627 \u0646\u0627\u0645 \u0644\u06a9\u06be\u06cc\u06ba\u06d4 \u0627\u0633 \u0633\u0648\u0627\u0644 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1\u0627\u06ba \u0686\u0627\u0631 \u0646\u06a9\u0627\u062a \u06c1\u06cc\u06ba\u060c &quot;\u0645\u06cc\u06ba \u0628\u0627\u0644\u06a9\u0644 \u06a9\u06cc\u0627 \u062f\u06cc\u06a9\u06be \u0631\u06c1\u0627 \u06c1\u0648\u06ba\u061f&#8221;<\/p>\n<p><strong>\u06a9\u06c1<\/strong> <code>healthz<\/code> <strong>\u0641\u0646\u06a9\u0634\u0646<\/strong> \u0645\u06cc\u06ba \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06d2\u06d4 <code>\/healthz<\/code>\u06cc\u06c1 \u0645\u062a\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be HTTP 200 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>ok<\/code>. Kubernetes \u0627\u0633 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06a9\u0648 \u0632\u0646\u062f\u06c1 \u0631\u06c1\u0646\u06d2 \u0627\u0648\u0631 \u062a\u06cc\u0627\u0631\u06cc \u06a9\u06cc \u062a\u062d\u0642\u06cc\u0642\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0622\u067e \u06a9\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>http.ListenAndServe(\":8080\", nil)<\/code>    \u067e\u0648\u0631\u0679 8080 \u067e\u0631 \u0633\u0631\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0633\u0679\u0627\u0631\u0679 \u0627\u067e \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0631\u0631 \u067e\u0631\u0646\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0635\u0641\u0631 \u06a9\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0627\u06c1\u0631 \u0646\u06a9\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u0648\u0628\u0631\u0646\u06cc\u0679\u0633 \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u062e\u0631\u0627\u0628 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u06af\u06d2 \u0628\u0691\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">go run main.go\n<\/code><\/pre>\n<p>\u062f\u0648\u0633\u0631\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">curl http:\/\/localhost:8080\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 <code>PR number : local<\/code> \u0627\u0648\u0631 <code>Git SHA : dev<\/code>\u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0688\u0648\u06a9\u0631 \u0628\u0644\u0688 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u0686\u0644 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0645\u0642\u0627\u0645\u06cc \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u06cc \u062a\u0648\u0642\u0639 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101547_221_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u06a9\u0631\u0644 \u0633\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u067e\u0648\u0631\u0679\u0646\u06af PR \u0646\u0645\u0628\u0631 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \" style=\"display: block;\" width=\"2744\" height=\"1256\" loading=\"lazy\" and Git SHA when run outside the Docker title=\"\"><\/p>\n<h2 id=\"heading-step-3-write-the-dockerfile\">\u0645\u0631\u062d\u0644\u06c1 3: \u0627\u06cc\u06a9 \u0688\u0627\u06a9\u0631 \u0641\u0627\u0626\u0644 \u0644\u06a9\u06be\u06cc\u06ba\u06d4<\/h2>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>app\/Dockerfile<\/code>:<\/p>\n<pre><code class=\"language-dockerfile\"># -----------------------------------------------------------\n# Stage 1: Build\n# -----------------------------------------------------------\nFROM golang:1.27-alpine AS builder\n#Ensure the version matches what is in your go.mod file\n\n# These are injected by the CI pipeline at build time\nARG PR_NUMBER=local\nARG GIT_SHA=dev\n\nWORKDIR \/app\n\n# Copy go.mod first so Docker can cache the dependency layer\nCOPY go.mod .\nRUN go mod download\n\nCOPY main.go .\n\n# -w -s strips debug symbols (~30% smaller binary)\n# -X overwrites package-level string variables at link time\nRUN CGO_ENABLED=0 go build \n    -ldflags=\"-w -s -X main.prNumber=${PR_NUMBER} -X main.gitSha=${GIT_SHA}\" \n    -o server main.go\n\n# -----------------------------------------------------------\n# Stage 2: Runtime\n# -----------------------------------------------------------\nFROM alpine:latest\n\nRUN addgroup -S appgroup && adduser -S appuser -G appgroup\nUSER appuser\n\nWORKDIR \/app\nCOPY --from=builder \/app\/server .\n\nEXPOSE 8080\nCMD [\".\/server\"]\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba \u06a9\u0686\u06be \u0686\u06cc\u0632\u06cc\u06ba \u0686\u0644 \u0631\u06c1\u06cc \u06c1\u06cc\u06ba \u062c\u0648 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-1-the-ldflags-x-injection\">1\u06d4 <code>-ldflags -X<\/code> \u0627\u0646\u062c\u06a9\u0634\u0646<\/h3>\n<pre><code class=\"language-plaintext\">-X main.prNumber=${PR_NUMBER}\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>-X<\/code> \u0644\u0646\u06a9\u0631 \u0641\u0644\u06cc\u06af\u0633 \u0644\u0646\u06a9 \u06a9\u06d2 \u0648\u0642\u062a \u067e\u06cc\u06a9\u06cc\u062c \u0644\u06cc\u0648\u0644 \u0633\u0679\u0631\u0646\u06af \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u06cc \u0642\u062f\u0631\u06cc\u06ba \u0633\u06cc\u0679 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0646\u062d\u0648 \u06c1\u06d2: <code>-X importpath.name=value<\/code>. \u06c1\u0645\u0627\u0631\u0627 \u0645\u062a\u063a\u06cc\u0631 \u06c1\u06d2\u06d4 <code>package main<\/code>\u062f\u0631\u0622\u0645\u062f \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1 \u06cc\u06c1 \u06c1\u06d2: <code>main<\/code>.<\/p>\n<p>\u06cc\u06c1 \u062e\u0635\u0648\u0635\u06cc\u062a \u0635\u0631\u0641 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2: <code>string<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0630\u0631\u06cc\u0639\u06c1 \u0645\u06cc\u06ba \u0627\u0639\u0644\u0627\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u0633 \u0637\u0631\u062d \u0646\u06cc\u0627 \u0645\u062a\u063a\u06cc\u0631 \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2\u06d4 <code>int<\/code> \u06cc\u0627 <code>bool<\/code>. \u0627\u0633\u06cc \u0644\u06cc\u06d2 <code>prNumber<\/code> \u0627\u06cc\u06a9 \u062a\u0627\u0631 \u06c1\u06d2 <code>main.go<\/code> \u0627\u06af\u0631\u0686\u06c1 \u062a\u0639\u062f\u0627\u062f \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u06a9\u06cc\u0648\u06ba\u061f \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06c1\u06d2 <em>\u0648\u06cc\u0688\u06cc\u0648<\/em>\u0646\u06c1\u06cc\u06ba <em>\u062a\u0639\u06cc\u0646\u0627\u062a\u06cc<\/em>. env var \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06a9\u0633\u06cc \u06a9\u0648 \u062a\u0635\u0648\u06cc\u0631 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u0645\u0644\u062a\u06cc \u06c1\u06d2\u06d4 <code>abc123<\/code> \u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 env var \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u062f\u0639\u0648\u06cc\u0670 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0639\u06c1\u062f \u06c1\u06d2\u06d4 <code>def456<\/code>\u0627\u06cc\u067e \u0622\u067e \u0633\u06d2 \u062c\u06be\u0648\u0679 \u0628\u0648\u0644\u0646\u06d2 \u06a9\u0648 \u062a\u06cc\u0627\u0631 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0628\u0627\u0626\u0646\u0631\u06cc \u0645\u06cc\u06ba \u062c\u0644\u0627\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0645 \u0635\u0631\u0641 \u06cc\u06c1 \u0628\u062a\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u062a\u0635\u0648\u06cc\u0631 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-cgoenabled0-flag\">\u06a9\u06c1 <code>CGO_ENABLED=0<\/code> \u067e\u0631\u0686\u0645<\/h3>\n<p>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0637\u0648\u0631 \u067e\u0631\u060c Go C \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0648\u06ba \u0633\u06d2 \u0644\u0646\u06a9 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba\u060c \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u0628\u0627\u0626\u0646\u0631\u06cc \u0633\u0633\u0679\u0645 \u06a9\u06cc C \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0648\u06ba \u06a9\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4 \u0627\u0644\u067e\u0627\u0626\u0646 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 <code>musl<\/code> \u0632\u06cc\u0627\u062f\u06c1 \u0639\u0627\u0645 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>glibc<\/code>\u06cc\u06c1 \u0639\u062f\u0645 \u0645\u0637\u0627\u0628\u0642\u062a &quot;\u0628\u0644\u0688\u0631 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0631\u0646 \u0679\u0627\u0626\u0645 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u06a9\u0631\u06cc\u0634&#8221; \u06a9\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u06cc \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0648\u062c\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0627\u062d\u0648\u0644 <code>CGO_ENABLED=0<\/code> \u0627\u06cc\u06a9 \u062e\u0627\u0644\u0635 Go \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062c\u0627\u0645\u062f \u0628\u0627\u0626\u0646\u0631\u06cc \u06a9\u0648 \u0645\u062c\u0628\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0628\u06cc\u0631\u0648\u0646\u06cc \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u0644\u06cc\u0646\u06a9\u0633 \u0633\u0633\u0679\u0645\u0632 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0634\u0645\u0648\u0644: <code>scratch<\/code> \u0627\u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u062c\u0633 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-copy-gomod-before-copy-maingo\"><code>COPY go.mod .<\/code>    \u067e\u06c1\u0644\u06d2 <code>COPY main.go .<\/code><\/h3>\n<p>\u0688\u0648\u06a9\u0631 \u067e\u0631\u062a \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u062a\u0635\u0627\u0648\u06cc\u0631 \u06a9\u06cc \u067e\u0631\u062a \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u067e\u0631\u062a \u06a9\u0648 \u06a9\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0633 \u06a9\u0627\u067e\u06cc \u06a9\u0631\u06cc\u06ba\u06d4 <code>go.mod<\/code> \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba <code>go mod download<\/code> \u0633\u0648\u0631\u0633 \u06a9\u0648\u0688 \u06a9\u0648 \u06a9\u0627\u067e\u06cc \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06cc\u0634\u0688 \u0627\u0646\u062d\u0635\u0627\u0631\u06cc \u067e\u0631\u062a \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0639\u062f \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631\u0627\u062a \u0645\u06cc\u06ba (\u0627\u0648\u0631 \u06cc\u0627\u062f \u0631\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0633\u0628 \u0633\u06d2 \u0627\u0648\u067e\u0631 \u0628\u0646\u062a\u06cc \u06c1\u06d2) <em>\u062a\u0645\u0627\u0645 \u0639\u0648\u0627\u0645\u06cc PRs \u06a9\u06d2 \u0644\u06cc\u06d2 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u06c1\u06d2\u06d4<\/em>)\u060c Docker \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0635\u0648\u0631\u062a\u0648\u06ba \u0645\u06cc\u06ba \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0688\u0627\u0624\u0646 \u0644\u0648\u0688\u0646\u06af \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>go.mod<\/code> \u06cc\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0627 \u06c1\u06d2\u06d4 \u062f\u0631\u062c\u0646\u0648\u06ba \u0627\u0646\u062d\u0635\u0627\u0631\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba\u060c 20 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u0627\u0648\u0631 3 \u0645\u0646\u0679 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06a9\u0648 \u0679\u06cc\u0645 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u06a9\u06cc\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u0645\u0627\u0645 \u062f\u06be\u06a9\u06d2 \u0633\u06d2 \u0636\u0631\u0628 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-non-root-user\">\u063a\u06cc\u0631 \u062c\u0691 \u0635\u0627\u0631\u0641<\/h3>\n<pre><code class=\"language-dockerfile\">RUN addgroup -S appgroup && adduser -S appuser -G appgroup\nUSER appuser\n<\/code><\/pre>\n<p>\u06a9\u0646\u0679\u06cc\u0646\u0631\u0632 \u0628\u0637\u0648\u0631 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0631\u0648\u0679 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u06a9\u0633\u06cc \u062d\u0645\u0644\u06c1 \u0622\u0648\u0631 \u06a9\u0648 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u06a9\u0633\u06cc \u06a9\u0645\u0632\u0648\u0631\u06cc \u06a9\u0627 \u067e\u062a\u06c1 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0631\u0648\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u0627\u0646\u06c1\u06cc\u06ba \u0645\u0632\u06cc\u062f \u0628\u0691\u06be\u0646\u06d2 \u06a9\u06cc \u06af\u0646\u062c\u0627\u0626\u0634 \u0645\u0644\u062a\u06cc \u06c1\u06d2\u06d4 \u063a\u06cc\u0631 \u0645\u0631\u0627\u0639\u0627\u062a \u06cc\u0627\u0641\u062a\u06c1 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u0646\u0627 \u0627\u0648\u0631 \u0627\u0646 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u0646\u0627 \u062f\u06be\u0645\u0627\u06a9\u06d2 \u06a9\u06d2 \u0631\u062f\u0627\u0633 \u06a9\u0648 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631 \u062f\u06d2 \u06af\u0627\u06d4 \u0627\u0633 \u06a9\u06cc \u0642\u06cc\u0645\u062a \u062f\u0648 \u0644\u0627\u0626\u0646\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u06cc\u0633\u0627 \u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u0648\u062c\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0679\u06cc\u0633\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">docker build --build-arg PR_NUMBER=99 --build-arg GIT_SHA=abc1234 -t preview-app:test .\ndocker run -p 8080:8080 preview-app:test\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 <code>curl http:\/\/localhost:8080<\/code> \u062f\u0648\u0633\u0631\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba\u06d4 \u0627\u0628 \u06a9\u06cc\u0627 \u062f\u06cc\u06a9\u06be\u0646\u0627 \u06c1\u06d2\u06d4 <code>PR number : 99<\/code> \u0627\u0648\u0631 <code>Git SHA : abc1234<\/code>. \u0627\u0646\u062c\u06a9\u0634\u0646 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101548_546_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u06a9\u0631\u0644 \u0633\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u062c\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u067e\u0648\u0631\u0679\u0646\u06af PR \u0646\u0645\u0628\u0631 99 \u0627\u0648\u0631 Git SHA abc1234 \u06a9\u0648 \u0688\u0648\u06a9\u0631 \u0628\u0644\u0688 \u0622\u0631\u06af\u06cc\u0648\u0645\u06cc\u0646\u0679\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u0644\u0688 \u0679\u0627\u0626\u0645 \u067e\u0631 \u062f\u0627\u062e\u0644 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2744\" height=\"1256\" loading=\"lazy\" title=\"\"><\/p>\n<h2 id=\"heading-step-4-provision-the-infrastructure-with-terraform\">\u0645\u0631\u062d\u0644\u06c1 4: Terraform \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc<\/h2>\n<p>\u0627\u0628 \u06a9\u0644\u0627\u0624\u0688 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0645 \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0633\u06cc\u0679 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 Terraform \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>gcloud<\/code> \u06a9\u0686\u06be \u063a\u0644\u0637 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0648\u0642\u062a \u0638\u0627\u06c1\u0631 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0645\u0627\u0646\u0688: Terraform \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c <code>terraform destroy<\/code> \u06cc\u062a\u06cc\u0645 \u0648\u0633\u0627\u0626\u0644 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0622\u067e \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062f\u06c1 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u062f\u0631\u0633\u062a \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u0622\u067e \u0633\u06d2 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0648\u0635\u0648\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>terraform\/variables.tf<\/code>:<\/p>\n<pre><code class=\"language-hcl\">variable \"project_id\" {\n  description = \"GCP project ID\"\n  type        = string\n}\n\nvariable \"region\" {\n  description = \"GCP region\"\n  type        = string\n  default     = \"europe-west2\"\n}\n\nvariable \"zone\" {\n  description = \"GCP zone. A zonal cluster is cheaper than a regional one.\"\n  type        = string\n  default     = \"europe-west2-a\"\n}\n\nvariable \"cluster_name\" {\n  description = \"Name of the GKE cluster\"\n  type        = string\n  default     = \"pr-preview-cluster\"\n}\n\nvariable \"github_repo\" {\n  description = \"GitHub repository in owner\/repo format, e.g. amina\/pr-preview-envs\"\n  type        = string\n}\n\nvariable \"machine_type\" {\n  description = \"Node machine type\"\n  type        = string\n  default     = \"e2-standard-2\"\n}\n\nvariable \"node_count\" {\n  description = \"Number of nodes in the pool\"\n  type        = number\n  default     = 2\n}\n<\/code><\/pre>\n<p>\u0627\u0628\u06be\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba <code>terraform\/main.tf<\/code>:<\/p>\n<pre><code class=\"language-hcl\">terraform {\n  required_version = \">= 1.5\"\n  required_providers {\n    google = {\n      source  = \"hashicorp\/google\"\n      version = \"~> 5.0\"\n    }\n  }\n}\n\nprovider \"google\" {\n  project = var.project_id\n  region  = var.region\n}\n\n# Look up the project so we can reference its numeric project number,\n# which Workload Identity Federation requires (it doesn't accept the\n# human-readable project ID).\ndata \"google_project\" \"current\" {}\n\n# -----------------------------------------------------------\n# Enable required APIs\n# -----------------------------------------------------------\nresource \"google_project_service\" \"apis\" {\n  for_each = toset([\n    \"container.googleapis.com\",\n    \"artifactregistry.googleapis.com\",\n    \"iamcredentials.googleapis.com\",\n    \"sts.googleapis.com\",\n  ])\n\n  service            = each.value\n  disable_on_destroy = false\n}\n\n# -----------------------------------------------------------\n# Artifact Registry \u2014 where preview images live\n# -----------------------------------------------------------\nresource \"google_artifact_registry_repository\" \"preview\" {\n  location      = var.region\n  repository_id = \"pr-preview\"\n  description   = \"Container images for PR preview environments\"\n  format        = \"DOCKER\"\n\n  depends_on = [google_project_service.apis]\n}\n\n# -----------------------------------------------------------\n# GKE cluster\n# -----------------------------------------------------------\nresource \"google_container_cluster\" \"primary\" {\n  name     = var.cluster_name\n  location = var.zone\n\n  # Create the cluster with a throwaway default pool, then remove it\n  # and manage nodes through a separate node pool resource. This is the\n  # standard pattern \u2014 it lets you resize or upgrade the node pool\n  # without recreating the cluster control plane.\n  remove_default_node_pool = true\n  initial_node_count       = 1\n\n  networking_mode = \"VPC_NATIVE\"\n  ip_allocation_policy {}\n\n  # Set to true before you use this for anything real.\n  deletion_protection = false\n\n  depends_on = [google_project_service.apis]\n}\n\nresource \"google_container_node_pool\" \"primary_nodes\" {\n  name       = \"${var.cluster_name}-pool\"\n  location   = var.zone\n  cluster    = google_container_cluster.primary.name\n  node_count = var.node_count\n\n  node_config {\n    machine_type = var.machine_type\n    disk_size_gb = 50\n\n    oauth_scopes = [\n      \"https:\/\/www.googleapis.com\/auth\/cloud-platform\",\n    ]\n\n    labels = {\n      purpose = \"pr-preview-envs\"\n    }\n  }\n\n  management {\n    auto_repair  = true\n    auto_upgrade = true\n  }\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba \u0686\u0646\u062f \u0628\u0627\u062a\u06cc\u06ba \u0642\u0627\u0628\u0644 \u0630\u06a9\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>data \"google_project\" \"current\"<\/code>    \u06cc\u06c1 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u062a\u0627\u06d4 \u06cc\u06c1 \u0688\u06cc\u0679\u0627 \u06a9\u0627 \u0627\u06cc\u06a9 \u0630\u0631\u06cc\u0639\u06c1 \u06c1\u06d2 \u062c\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0648\u0631\u06a9 \u0644\u0648\u0688 \u0622\u0626\u06cc\u0688\u06cc\u0646\u0679\u06cc \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679\u0633 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <strong>\u0639\u062f\u062f\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0646\u0645\u0628\u0631<\/strong>\u06cc\u06c1 \u0648\u06c1 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 ID \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062c\u0633\u06d2 \u0622\u067e \u06a9\u0646\u0633\u0648\u0644 \u0645\u06cc\u06ba \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u06d2 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u067e\u06cc\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c Terraform \u0627\u0633\u06d2 \u0622\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06be\u06cc\u0646\u0686\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>for_each<\/code> <strong>\u06a9\u0648<\/strong> <code>google_project_service<\/code>: 4 APIs \u06a9\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 4 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0628\u0644\u0627\u06a9\u0633 \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>for_each<\/code> \u0633\u06cc\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0639\u0627\u062f\u06c1 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0641\u06cc \u0622\u0626\u0679\u0645 \u0627\u06cc\u06a9 \u0648\u0633\u06cc\u0644\u06c1 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 <code>disable_on_destroy = false<\/code> \u0637\u0631\u06cc\u0642\u06c1 <code>terraform destroy<\/code> \u06cc\u06c1 \u0627\u0646 APIs \u06a9\u0648 \u0628\u0646\u062f \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0622\u067e \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba \u062f\u06cc\u06af\u0631 \u0686\u06cc\u0632\u06cc\u06ba \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>remove_default_node_pool = true<\/code>: GKE \u06a9\u0648 \u06a9\u0644\u0633\u0679\u0631 \u0628\u0646\u0627\u062a\u06d2 \u0648\u0642\u062a \u0688\u06cc\u0641\u0627\u0644\u0679 \u0646\u0648\u0688 \u067e\u0648\u0644 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u06d2 \u0633\u06d2 \u06cc\u06c1 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062d\u0630\u0641 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0646\u0648\u0688 \u067e\u0648\u0644 \u06a9\u0648 \u0627\u06cc\u06a9 \u0639\u0644\u06cc\u062d\u062f\u06c1 \u0648\u0633\u06cc\u0644\u06c1 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0641\u0627\u0626\u062f\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0646\u0648\u0688 \u067e\u0648\u0644 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba (\u0633\u0627\u0626\u0632\u060c \u0645\u0634\u06cc\u0646 \u06a9\u06cc \u0642\u0633\u0645 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u060c \u0627\u067e \u06af\u0631\u06cc\u0688) \u062e\u0648\u062f \u06a9\u0644\u0633\u0679\u0631 \u0648\u0633\u0627\u0626\u0644 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u0645\u062c\u0628\u0648\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>node_count = 2<\/code> <strong>\u06a9\u06d2 \u0633\u0627\u062a\u06be<\/strong> <code>e2-standard-2<\/code>: 2 \u0646\u0648\u0688\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be 2 vCPUs \u0627\u0648\u0631 8 GB \u06c1\u0631 \u0627\u06cc\u06a9\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0686\u06be\u0648\u0679\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u0626\u06cc \u0686\u0644 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 GKE \u067e\u0631 \u0627\u0646 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0633\u0633\u0679\u0645 \u067e\u0648\u0688 \u0628\u06be\u06cc \u06c1\u06cc\u06ba\u06d4 \u062f\u0648 \u0646\u0648\u0688\u0633 \u0622\u0631\u0627\u0645 \u062f\u06c1 \u06c1\u06cc\u0688 \u0631\u0648\u0645 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0628\u06cc\u06a9 \u0648\u0642\u062a \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 8 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062a\u062c\u0631\u0628\u0627\u062a \u06a9\u0648 \u0641\u0639\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u0631\u0627\u062f\u06c1 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0633\u06d2 \u0628\u06c1\u062a\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p><code>deletion_protection = false<\/code>: GKE \u0646\u06d2 \u0627\u0633\u06d2 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u0644\u0633\u0679\u0631\u0632 \u06a9\u06d2 \u062d\u0627\u062f\u062b\u0627\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062d\u0630\u0641 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627\u06d4 \u06c1\u0645 \u0627\u0633\u06d2 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631 \u062f\u06cc\u06ba \u06af\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u0644\u0633\u0679\u0631 \u06c1\u06d2 \u062c\u0633\u06d2 \u0622\u062e\u0631\u06cc \u0628\u0627\u0631 \u062d\u0630\u0641 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u062d\u0642\u06cc\u0642\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06be\u0627\u0644 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0633\u06d2 \u0627\u0633 \u067e\u0631 \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba: <code>true<\/code>.<\/p>\n<h2 id=\"heading-step-5-set-up-keyless-authentication-with-workload-identity-federation\">\u0645\u0631\u062d\u0644\u06c1 5: \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u063a\u06cc\u0631 \u06a9\u0644\u06cc\u062f\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/h2>\n<p>\u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u0626\u06cc\u06d2 \u0622\u06c1\u0633\u062a\u06c1 \u0622\u06c1\u0633\u062a\u06c1 \u0627\u0633 \u0633\u06d2 \u06af\u0632\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-the-problem-with-service-account-keys\">\u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0627 \u06a9\u0644\u06cc\u062f\u06cc \u0645\u0633\u0626\u0644\u06c1<\/h3>\n<p>GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u062a\u0635\u0627\u0648\u06cc\u0631 \u06a9\u0648 \u0622\u0631\u0679\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0622\u067e \u06a9\u06d2 GKE \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u0631\u06a9\u0627\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644\u0632 \u0627\u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<ol wp_automatic_readability=\"0\">\n<li wp_automatic_readability=\"-1\">\n<p>GCP \u0645\u06cc\u06ba \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>JSON \u06a9\u0644\u06cc\u062f \u0628\u0646\u0627\u0626\u06cc\u06ba<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>\u0627\u0633 JSON \u06a9\u0648 \u0627\u06cc\u06a9 GitHub \u0631\u0627\u0632 \u0645\u06cc\u06ba \u0686\u0633\u067e\u0627\u06ba \u06a9\u0631\u06cc\u06ba \u062c\u0633 \u06a9\u0627 \u0646\u0627\u0645 \u06c1\u06d2: <code>GCP_SA_KEY<\/code><\/p>\n<\/li>\n<li>\n<p>\u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u06cc\u06c1 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1 \u0628\u06be\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 <strong>\u0686\u0627\u0628\u06cc\u0627\u06ba \u06a9\u0628\u06be\u06cc \u062e\u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc\u06ba\u06d4<\/strong> \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 JSON \u06a9\u06cc\u0632 \u0637\u0648\u06cc\u0644 \u0627\u0644\u0645\u062f\u062a \u0627\u0633\u0646\u0627\u062f \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u062f\u0631\u0633\u062a \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0627\u0633\u06d2 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u0633\u0648\u062e \u0646\u06c1 \u06a9\u0631 \u062f\u06d2\u060c \u062c\u0633 \u06a9\u0627 \u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u0633\u062a \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0627\u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627 \u06cc\u0627\u062f \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u0627 <strong>\u06a9\u0644\u06cc\u062f \u0627\u06cc\u06a9 \u0628\u06cc\u0626\u0631\u0631 \u0679\u0648\u06a9\u0646 \u06c1\u06d2\u06d4<\/strong> \u0648\u06c1 JSON \u0641\u0627\u0626\u0644 \u06a9\u0633 \u06a9\u0648 \u0645\u0644\u062a\u06cc \u06c1\u06d2\u06d4 <em>\u06c1\u06d2<\/em> \u0622\u067e \u06a9\u0627 \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679\u06d4 \u06a9\u0648\u0626\u06cc \u062f\u0648\u0633\u0631\u0627 \u0639\u0648\u0627\u0645\u0644\u060c IP \u067e\u0627\u0628\u0646\u062f\u06cc\u0627\u06ba \u06cc\u0627 \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc\u06d4 \u0627\u067e\u0646\u06cc \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u06a9\u0627\u067e\u06cc \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u062f\u0646\u06cc\u0627 \u0645\u06cc\u06ba \u06a9\u06c1\u06cc\u06ba \u0628\u06be\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u06cc\u0633\u0631\u0627 <strong>\u062f\u06be\u0645\u0627\u06a9\u06d2 \u06a9\u0627 \u0631\u062f\u0627\u0633 \u0628\u06c1\u062a \u0628\u0691\u0627 \u06c1\u06d2\u06d4<\/strong> GitHub \u06a9\u06d2 \u0631\u0627\u0632 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0648\u06c1 \u0631\u0627\u0632 \u06a9\u0633\u06cc \u0633\u0645\u062c\u06be\u0648\u062a\u06c1 \u0634\u062f\u06c1 \u0641\u0631\u06cc\u0642 \u062b\u0627\u0644\u062b \u0679\u0627\u0633\u06a9\u060c \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u0628\u062f\u0646\u06cc\u062a\u06cc \u067e\u0631 \u0645\u0628\u0646\u06cc \u0627\u0646\u062d\u0635\u0627\u0631\u060c \u06cc\u0627 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u0634\u062f\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u0627\u0641\u0634\u0627 \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0627\u0646\u06a9\u0634\u0627\u0641 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u062d\u0645\u0644\u06c1 \u0622\u0648\u0631\u0648\u06ba \u06a9\u0648 \u06a9\u0644\u0627\u0624\u0688 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u062a\u06a9 \u0645\u0633\u0644\u0633\u0644 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0646\u0638\u0631\u06cc\u0627\u062a\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u06a9\u0644\u06cc\u062f \u06a9\u0627 \u0631\u0633\u0627\u0648 \u06a9\u0644\u0627\u0624\u0688 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u06a9\u06d2 \u0648\u0627\u0642\u0639\u0627\u062a \u06a9\u06cc \u0633\u0628 \u0633\u06d2 \u0639\u0627\u0645 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0648\u062c\u0648\u06c1\u0627\u062a \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-how-workload-identity-federation-fixes-it\">\u06a9\u0627\u0645 \u06a9\u0627 \u0628\u0648\u062c\u06be \u0634\u0646\u0627\u062e\u062a\u06cc \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u062d\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/h3>\n<p><strong>\u0648\u0631\u06a9 \u0644\u0648\u0688 \u0622\u0626\u06cc\u0688\u06cc\u0646\u0679\u06cc \u0627\u0644\u0627\u0626\u0646\u0633<\/strong> \u0637\u0648\u06cc\u0644 \u0639\u0631\u0635\u06d2 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0686\u0627\u0628\u06cc\u0627\u06ba \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0679\u0627 \u062f\u06cc\u06ba\u06d4 \u0628\u06c1\u0627\u0624 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<ol wp_automatic_readability=\"7.5\">\n<li wp_automatic_readability=\"4\">\n<p>GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u0645\u062e\u062a\u0635\u0631 \u0632\u0646\u062f\u06af\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 <strong>OIDC \u0679\u0648\u06a9\u0646<\/strong> \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u0633 \u0679\u0648\u06a9\u0646 \u067e\u0631 GitHub \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0633\u062a\u062e\u0637 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u0645\u06cc\u06ba \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u062f\u0639\u0648\u06d2 \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba \u062c\u06cc\u0633\u06d2 \u0686\u0644 \u0631\u06c1\u0627 \u0630\u062e\u06cc\u0631\u06c1\u060c \u0628\u0631\u0627\u0646\u0686\u060c \u0648\u0631\u06a9 \u0641\u0644\u0648\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9\u0679\u0631\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>\u0648\u0631\u06a9 \u0641\u0644\u0648 \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u06a9\u06cc \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u0679\u0648\u06a9\u0646 \u0633\u0631\u0648\u0633 \u06a9\u0648 \u0648\u06c1 \u0679\u0648\u06a9\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"2\">\n<p>Google GitHub \u06a9\u06cc \u0639\u0648\u0627\u0645\u06cc \u06a9\u0644\u06cc\u062f\u0648\u06ba \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u0679\u0648\u06a9\u0646 \u062f\u0633\u062a\u062e\u0637\u0648\u06ba \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0642\u0648\u0627\u0639\u062f \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u062f\u0639\u0648\u0648\u06ba \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u0622\u067e<\/strong> \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631\u060c \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u0630\u062e\u06cc\u0631\u06c1 \u0633\u06d2 \u0622\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u0646\u06c1 \u06a9\u06c1 \u06a9\u0633\u06cc \u0627\u0648\u0631 \u0686\u06cc\u0632 \u0633\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"1\">\n<p>\u0627\u06af\u0631 \u062a\u0645\u0627\u0645 \u0627\u0646\u062f\u0631\u0627\u062c\u0627\u062a \u0645\u0645\u0627\u062b\u0644 \u06c1\u06cc\u06ba\u060c \u062a\u0648 Google \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0635\u0631 \u0645\u062f\u062a \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u0627 \u0679\u0648\u06a9\u0646 \u062c\u0627\u0631\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u0633\u062a \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"0\">\n<p>\u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0633 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06cc\u06c1 \u062c\u0644\u062f \u06c1\u06cc \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u06a9\u06c1\u06cc\u06ba \u0628\u06be\u06cc \u06a9\u0648\u0626\u06cc \u0631\u0627\u0632 \u0645\u062d\u0641\u0648\u0638 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0644\u06cc\u06a9\u060c \u06af\u0631\u062f\u0634 \u06cc\u0627 \u06a9\u0627\u0644\u0639\u062f\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0622\u067e \u06a9\u06d2 \u0630\u062e\u06cc\u0631\u06d2 \u06a9\u0648 \u0641\u0648\u0631\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0648\u06c1\u06cc \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 OIDC \u0679\u0648\u06a9\u0646 \u062c\u0648 \u0648\u06c1 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 <em>\u0627\u0646 \u06a9\u0627<\/em> \u0627\u06af\u0631 \u062f\u0639\u0648\u06cc \u0645\u06cc\u06ba \u0630\u062e\u06cc\u0631\u06c1 \u0646\u0627\u0645 \u06c1\u06d2\u060c \u062a\u0648 Google \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0645\u0644\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba <code>terraform\/main.tf<\/code>:<\/p>\n<pre><code class=\"language-hcl\"># -----------------------------------------------------------\n# Service account that GitHub Actions will impersonate\n# -----------------------------------------------------------\nresource \"google_service_account\" \"github_actions\" {\n  account_id   = \"github-actions-preview\"\n  display_name = \"GitHub Actions \u2014 PR Preview Environments\"\n}\n\n# Permission to push images to Artifact Registry\nresource \"google_project_iam_member\" \"artifact_writer\" {\n  project = var.project_id\n  role    = \"roles\/artifactregistry.writer\"\n  member  = \"serviceAccount:${google_service_account.github_actions.email}\"\n}\n\n# Permission to create namespaces and deploy workloads in GKE.\n# container.developer grants full access to Kubernetes API objects,\n# but NOT permission to modify the cluster itself.\nresource \"google_project_iam_member\" \"gke_developer\" {\n  project = var.project_id\n  role    = \"roles\/container.developer\"\n  member  = \"serviceAccount:${google_service_account.github_actions.email}\"\n}\n\n# -----------------------------------------------------------\n# Workload Identity Federation\n# -----------------------------------------------------------\nresource \"google_iam_workload_identity_pool\" \"github\" {\n  workload_identity_pool_id = \"github-pool\"\n  display_name              = \"GitHub Actions Pool\"\n  description               = \"Identity pool for GitHub Actions OIDC\"\n\n  depends_on = [google_project_service.apis]\n}\n\nresource \"google_iam_workload_identity_pool_provider\" \"github\" {\n  workload_identity_pool_id          = google_iam_workload_identity_pool.github.workload_identity_pool_id\n  workload_identity_pool_provider_id = \"github-provider\"\n  display_name                       = \"GitHub OIDC Provider\"\n\n  # Map claims from the GitHub OIDC token to Google attributes\n  attribute_mapping = {\n    \"google.subject\"       = \"assertion.sub\"\n    \"attribute.actor\"      = \"assertion.actor\"\n    \"attribute.repository\" = \"assertion.repository\"\n  }\n\n  # CRITICAL: without this condition, ANY GitHub repository on the\n  # internet could authenticate against your pool.\n  attribute_condition = \"assertion.repository == '${var.github_repo}'\"\n\n  oidc {\n    issuer_uri = \"https:\/\/token.actions.githubusercontent.com\"\n  }\n}\n\n# Allow tokens from your specific repo to impersonate the service account\nresource \"google_service_account_iam_member\" \"github_impersonation\" {\n  service_account_id = google_service_account.github_actions.name\n  role               = \"roles\/iam.workloadIdentityUser\"\n  member             = \"principalSet:\/\/iam.googleapis.com\/projects\/${data.google_project.current.number}\/locations\/global\/workloadIdentityPools\/${google_iam_workload_identity_pool.github.workload_identity_pool_id}\/attribute.repository\/${var.github_repo}\"\n}\n<\/code><\/pre>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0633 \u062d\u0635\u06d2 \u06a9\u0648 \u062a\u0648\u0691 \u062f\u06cc\u06ba \u062c\u0648 \u0644\u0648\u06af\u0648\u06ba \u06a9\u0648 \u0645\u062d\u0627\u0641\u0638 \u0633\u06d2 \u062f\u0648\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>attribute_mapping<\/code>: GitHub \u06a9\u06d2 OIDC \u0679\u0648\u06a9\u0646 \u0645\u06cc\u06ba \u062f\u0639\u0648\u0648\u06ba \u06a9\u0627 \u0627\u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u0644\u0627\u06a9 \u06af\u0648\u06af\u0644 \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u06d2 \u062f\u0639\u0648\u06d2 \u067e\u0691\u06be\u06d2 \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0633 \u06a9\u0648 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>assertion.sub<\/code> \u0679\u0648\u06a9\u0646 \u06a9\u0627 \u0645\u0648\u0636\u0648\u0639\u060c \u062c\u06cc\u0633\u06d2 <code>repo:owner\/name:ref:refs\/heads\/main<\/code>)\u06d4 <code>assertion.repository<\/code> \u06cc\u06c1 \u0645\u06a9\u0645\u0644 \u0630\u062e\u06cc\u0631\u06c1 \u0646\u0627\u0645 \u06c1\u06d2\u06d4 <code>google.subject<\/code> \u06cc\u06c1 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0628\u0627\u0642\u06cc \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u0642\u0648\u0627\u0639\u062f \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>attribute_condition<\/code>: \u0627\u0633 \u0633\u0637\u0648\u0631 \u06a9\u0648 \u062f\u0648 \u0628\u0627\u0631 \u067e\u0691\u06be\u06cc\u06ba\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u063a\u0644\u0637 \u067e\u0691\u06be\u0646\u0627 \u0627\u06cc\u06a9 \u0633\u0646\u06af\u06cc\u0646 \u062e\u0637\u0631\u06c1 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-hcl\">attribute_condition = \"assertion.repository == '${var.github_repo}'\"\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u06cc\u06c1 \u0634\u0631\u0637 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062a\u0648 \u0634\u0646\u0627\u062e\u062a\u06cc \u067e\u0648\u0644 \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <em>GitHub OIDC \u062c\u0627\u0631\u06cc \u06a9\u0646\u0646\u062f\u06c1<\/em>\u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0645 GitHub \u067e\u0631 \u0645\u0648\u062c\u0648\u062f \u062a\u0645\u0627\u0645 \u0630\u062e\u06cc\u0631\u0648\u06ba \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0634\u062e\u0635 \u062c\u0648 \u067e\u0648\u0644 \u06a9\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2 (\u062c\u0648 \u062e\u0641\u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba) \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u0627\u0648\u0631 \u0646\u0642\u0627\u0644\u06cc \u06a9\u0631\u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u062d\u0627\u0644\u062a \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0648 \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u0630\u062e\u06cc\u0631\u06c1 \u062a\u06a9 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4 \u0646\u0642\u0634\u06c1 \u0633\u0627\u0632\u06cc \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u06af\u0648\u06af\u0644 \u06a9\u0648 \u0627\u0628 \u0627\u0646\u062a\u0633\u0627\u0628 \u06a9\u06cc \u0634\u0631\u0627\u0626\u0637 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 <code>assertion.repository<\/code>\u0628\u0627\u0644\u06a9\u0644 \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u06c1 \u0628\u06c1\u062a \u0633\u06d2 \u0644\u0648\u06af \u0627\u0633 \u06a9\u0648 \u063a\u0644\u0637 \u0633\u0645\u062c\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>principalSet:\/\/...<\/code>: \u06cc\u06c1 \u0634\u0646\u0627\u062e\u062a \u062f\u06cc \u062c\u0627 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4 <code>workloadIdentityUser<\/code> \u06a9\u0631\u062f\u0627\u0631 \u062f\u0627\u0626\u06cc\u06ba \u0633\u06d2 \u0628\u0627\u0626\u06cc\u06ba \u067e\u0691\u06be\u06cc\u06ba\u06d4 <code>github-pool<\/code> \u062c\u0633 \u06a9\u0627 <code>attribute.repository<\/code> \u0627\u06af\u0631 \u06cc\u06c1 \u0622\u067e \u06a9\u06d2 \u0630\u062e\u06cc\u0631\u06d2 \u06a9\u06d2 \u0628\u0631\u0627\u0628\u0631 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u0627\u0633 \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u0646\u0642\u0627\u0644\u06cc \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0646\u0648\u0679 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 <code>data.google_project.current.number<\/code>\u0627\u06cc\u06a9 \u0639\u062f\u062f\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0646\u0645\u0628\u0631 \u06c1\u06d2\u060c \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 ID \u0646\u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1\u0627\u06ba \u067e\u0631\u0627\u062c\u06cc\u06a9\u0679 \u0622\u0626\u06cc \u0688\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06cc \u063a\u0644\u0637\u06cc \u06c1\u0648\u06af\u06cc \u062c\u0648 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u063a\u0644\u0637 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u06a9\u06c1 WIF \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0639\u0627\u0645 \u063a\u0644\u0637\u06cc\u0648\u06ba \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u06a9\u06cc\u0648\u06ba<\/strong> <code>roles\/container.developer<\/code> <strong>\u0627\u0648\u0631 \u067e\u06be\u0631 \u0646\u06c1\u06cc\u06ba\u06d4<\/strong> <code>roles\/container.admin<\/code><strong>?<\/strong> <code>container.developer<\/code>    \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 Kubernetes API \u0627\u0634\u06cc\u0627\u0621 \u062a\u06a9 \u0645\u06a9\u0645\u0644 \u0631\u0633\u0627\u0626\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 (\u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u06cc\u06ba \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0627\u06ba \u0644\u0627\u06af\u0648 \u06a9\u0631\u06cc\u06ba\u060c \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u06cc\u06ba)\u06d4 <code>container.admin<\/code> \u0622\u067e \u062e\u0648\u062f \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u0628\u06be\u06cc \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 \u0646\u0648\u0688 \u067e\u0648\u0644 \u06a9\u0627 \u0633\u0627\u0626\u0632 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627\u060c \u0627\u067e \u06af\u0631\u06cc\u0688 \u06a9\u0631\u0646\u0627\u060c \u06cc\u0627 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062d\u0630\u0641 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<p>\u06c1\u0645\u0627\u0631\u0627 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0633\u062a\u062d\u0642\u0627\u0642 \u0633\u06d2 \u062e\u0627\u0644\u06cc \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06d2 \u062e\u0648\u062f \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u0686\u06be\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062f\u0631\u0627\u0635\u0644 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u0627\u062c\u0627\u0632\u062a \u06c1\u06d2\u06d4 \u0627\u0646\u06c1\u06cc\u06ba \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u062f\u06cc\u06ba \u062c\u0648 \u0627\u0646\u06c1\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0628\u06be\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba <code>terraform\/outputs.tf<\/code>:<\/p>\n<pre><code class=\"language-hcl\">output \"cluster_name\" {\n  value = google_container_cluster.primary.name\n}\n\noutput \"cluster_zone\" {\n  value = var.zone\n}\n\noutput \"artifact_registry_url\" {\n  description = \"Base URL for pushing images\"\n  value       = \"${var.region}-docker.pkg.dev\/${var.project_id}\/${google_artifact_registry_repository.preview.repository_id}\"\n}\n\noutput \"workload_identity_provider\" {\n  description = \"Paste this into the GitHub Actions workflow\"\n  value       = \"projects\/${data.google_project.current.number}\/locations\/global\/workloadIdentityPools\/${google_iam_workload_identity_pool.github.workload_identity_pool_id}\/providers\/${google_iam_workload_identity_pool_provider.github.workload_identity_pool_provider_id}\"\n}\n\noutput \"service_account_email\" {\n  description = \"Paste this into the GitHub Actions workflow\"\n  value       = google_service_account.github_actions.email\n}\n\noutput \"get_credentials_command\" {\n  value = \"gcloud container clusters get-credentials ${google_container_cluster.primary.name} --zone ${var.zone} --project ${var.project_id}\"\n}\n<\/code><\/pre>\n<p>\u0622\u0624\u0679 \u067e\u0679 \u0622\u0631\u0627\u0626\u0634\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>workload_identity_provider<\/code> \u0627\u0648\u0631 <code>service_account_email<\/code> GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u067e\u06cc\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0642\u062f\u0631\u06cc\u06ba \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0646\u0641\u06cc\u06af\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06a9\u0644\u06cc\u0641 \u062f\u06c1 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-step-6-apply-the-terraform-configuration\">\u0645\u0631\u062d\u0644\u06c1 6: \u0679\u06cc\u0631\u0627\u0641\u0627\u0631\u0645 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u0646\u062f\u0631 \u0633\u06d2 <code>terraform\/<\/code> \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc:<\/p>\n<pre><code class=\"language-bash\">terraform init\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06af\u0648\u06af\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06a9\u0631\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0628\u06cc\u06a9 \u0627\u06cc\u0646\u0688 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06d2 \u06af\u0627\u06d4 \u0622\u067e \u06a9\u0648 \u067e\u06cc\u063a\u0627\u0645 \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u0627 &quot;Terraform \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627 \u06af\u06cc\u0627!&#8221;<\/p>\n<p>\u0627\u0628 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<pre><code class=\"language-bash\">terraform plan \n  -var=\"project_id=YOUR_PROJECT_ID\" \n  -var=\"github_repo=YOUR_USERNAME\/pr-preview-envs\"\n<\/code><\/pre>\n<p>\u067e\u0644\u0627\u0646 \u0622\u0624\u0679 \u067e\u0679 \u067e\u0691\u06be\u06cc\u06ba\u06d4 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 Terraform \u06a9\u0686\u06be \u0628\u06be\u06cc \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0628\u0646\u0627\u0646\u06d2 \u06a9\u0627 \u0627\u0631\u0627\u062f\u06c1 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 12 \u0648\u0633\u0627\u0626\u0644 \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba \u0627\u0648\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06cc\u0627 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0648\u0633\u0627\u0626\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u06cc\u06c1 \u062f\u0631\u0633\u062a \u06c1\u06d2:<\/p>\n<pre><code class=\"language-bash\">terraform apply \n  -var=\"project_id=YOUR_PROJECT_ID\" \n  -var=\"github_repo=YOUR_USERNAME\/pr-preview-envs\"\n<\/code><\/pre>\n<p>\u0632\u0645\u0631\u06c1 <code>yes<\/code> \u062c\u0628 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4 \u06a9\u0644\u0633\u0679\u0631 \u0628\u0646\u0627\u0646\u06d2 \u0645\u06cc\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 5 \u0645\u0646\u0679 \u0644\u06af\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u0679\u067e:<\/strong> \u0627\u0633 \u0645\u06cc\u06ba \u0679\u0627\u0626\u067e \u06a9\u0631\u06cc\u06ba <code>-var<\/code> \u0627\u06af\u0631 \u062f\u06c1\u0631\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u062c\u06be\u0646\u0688\u06d2 \u062c\u0644\u062f\u06cc \u067e\u0631\u0627\u0646\u06d2 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0646\u0627\u0645\u06cc \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba <code>terraform.tfvars<\/code> \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 <code>project_id = \"your-project-id\"<\/code> \u0627\u0648\u0631 <code>github_repo = \"you\/pr-preview-envs\"<\/code>Terraform \u0627\u0633\u06d2 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0622\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u0627\u0633\u06d2 \u0627\u06af\u0644\u06cc \u0628\u0627\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>.gitignore<\/code>.<\/p>\n<p>\u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631\u060c Terraform \u0622\u0624\u0679 \u067e\u0679 \u067e\u0631\u0646\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u0627\u0633\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba<\/strong>\u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u0645\u0631\u062d\u0644\u06c1 9 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc:<\/p>\n<pre><code class=\"language-plaintext\">artifact_registry_url = \"europe-west2-docker.pkg.dev\/your-project\/pr-preview\"\nservice_account_email = \"github-actions-preview@your-project.iam.gserviceaccount.com\"\nworkload_identity_provider = \"projects\/123456789\/locations\/global\/workloadIdentityPools\/github-pool\/providers\/github-provider\"\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u0642\u062a \u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u0631\u0646\u0679 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba: <code>terraform output<\/code>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101548_693_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u0679\u06cc\u0631\u0627\u0641\u0627\u0631\u0645 \u0644\u0627\u06af\u0648 \u0622\u0624\u0679 \u067e\u0679 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0627\u0633\u0646\u0627\u062f \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2744\" height=\"1454\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062c\u0691\u06cc\u06ba <code>kubectl<\/code> \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0646\u0626\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba: <code>get_credentials_command<\/code> \u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/p>\n<pre><code class=\"language-bash\">gcloud container clusters get-credentials pr-preview-cluster \n  --zone europe-west2-a \n  --project YOUR_PROJECT_ID\n<\/code><\/pre>\n<p>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">kubectl get nodes\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0648 \u062f\u0648 \u0646\u0648\u0688\u0633 \u062f\u06cc\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4 <code>Ready<\/code> \u0635\u0648\u0631\u062a \u062d\u0627\u0644<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101548_242_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"kubectl \u06af\u06cc\u0679 \u0646\u0648\u0688 \u06a9\u0627 \u0622\u0624\u0679 \u067e\u0679 \u062f\u0648 GKE \u0646\u0648\u0688\u0633 \u062a\u06cc\u0627\u0631 \u062d\u0627\u0644\u062a \u0645\u06cc\u06ba \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2744\" height=\"416\" loading=\"lazy\" title=\"\"><\/p>\n<h2 id=\"heading-step-7-prove-the-lifecycle-manually\">\u0645\u0631\u062d\u0644\u06c1 7: \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u0633\u06d2 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0627\u062a\u06be \u0633\u06d2 \u0622\u0632\u0645\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0645\u0635\u0631\u0648\u0641 \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0622\u0679\u0648\u0645\u06cc\u0634\u0646 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0635\u0631\u0641 \u0627\u0633\u06a9\u0631\u067e\u0679 \u06c1\u06cc\u06ba \u062c\u0648 \u06a9\u0645\u0627\u0646\u0688 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0635\u0627\u0631\u0641 \u062f\u0627\u062e\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u06d2 \u06a9\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u0679\u0648\u0645\u06cc\u0634\u0646 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0688\u06cc\u0628\u06af \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0688\u06cc\u0645\u0648 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u0627\u062a 11 \u0628\u062c\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba 10 \u0645\u0646\u0679 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u06af\u06be\u0646\u0679\u0648\u06ba \u0628\u0686\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl create namespace pr-test\n<\/code><\/pre>\n<p>\u067e\u0644\u06cc\u0633 \u06c1\u0648\u0644\u0688\u0631\u0632 \u06a9\u0648 \u06cc\u06c1\u0627\u06ba \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl create deployment hello \n  --image=nginx:1.27-alpine \n  --namespace=pr-test\n<\/code><\/pre>\n<p>\u0627\u0633\u06d2 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">kubectl get pods --namespace=pr-test\n<\/code><\/pre>\n<p>\u0627\u0628 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06a9\u0646\u0679\u06cc\u0646\u0645\u0646\u0679 \u06a9\u0648 \u062b\u0627\u0628\u062a \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl get pods --all-namespaces | grep hello\n<\/code><\/pre>\n<p>\u067e\u06be\u0644\u06cc \u0635\u0631\u0641 \u062f\u0631\u062c \u0630\u06cc\u0644 \u062c\u06af\u06c1\u0648\u06ba \u067e\u0631 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2: <code>pr-test<\/code>. \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba <code>default<\/code> \u06cc\u0627 \u0634\u0627\u06cc\u062f \u062f\u06cc\u06af\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u06cc\u06ba \u0628\u06be\u06cc \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062c\u0627\u0646\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0648\u06c1 \u067e\u0631\u0627\u067e\u0631\u0679\u06cc \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u067e\u0648\u0631\u0627 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0642\u0627\u0626\u0645 \u06c1\u06d2\u06d4 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0627\u06cc\u06a9 \u062d\u062f \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 PR \u06a9\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0645\u0648\u062c\u0648\u062f \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u062f\u0648\u0633\u0631\u06d2 PR \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0648\u0634\u06cc\u062f\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u0627\u0633\u06d2 \u0627\u0644\u06af \u06a9\u0631 \u0644\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl delete namespace pr-test\n<\/code><\/pre>\n<p>\u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-bash\">kubectl get namespace pr-test\n<\/code><\/pre>\n<p>\u0635\u0631\u0641 \u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u0627\u0648\u0631 \u0622\u067e \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4 <code>Terminating<\/code>\u062c\u0628 \u0622\u067e \u06a9\u0644\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u063a\u0627\u0626\u0628 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0627\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0645\u0648\u062c\u0648\u062f \u062a\u0645\u0627\u0645 \u0648\u0633\u0627\u0626\u0644 \u062d\u0630\u0641 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u060c \u067e\u0648\u0688\u060c \u062e\u062f\u0645\u0627\u062a\u060c \u062a\u0631\u062a\u06cc\u0628 \u06a9\u06d2 \u0646\u0642\u0634\u06d2\u060c \u0627\u0648\u0631 \u0631\u0627\u0632\u06d4 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0645\u0627\u0646\u0688 \u067e\u0648\u0631\u06cc \u0635\u0641\u0627\u0626\u06cc \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0648\u0627\u062d\u062f \u062e\u0627\u0635\u06cc\u062a PR \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u062f\u0627 \u06a9\u0631\u0646\u0627 \u0627\u062d\u062a\u06cc\u0627\u0637 \u0633\u06d2 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0633\u0644\u0633\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062c\u0633\u06d2 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u062d\u06a9\u0645 \u06c1\u06d2 \u062c\u0648 \u067e\u06cc\u0686\u06be\u06d2 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0686\u06be\u0648\u0691\u062a\u0627\u06d4<\/p>\n<h2 id=\"heading-step-8-write-the-kubernetes-manifests-with-kustomize\">\u0645\u0631\u062d\u0644\u06c1 8: Kustomize \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 Kubernetes \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0644\u06a9\u06be\u06cc\u06ba\u06d4<\/h2>\n<p>\u062a\u0645\u0627\u0645 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0641\u0631\u0642 \u0635\u0631\u0641 \u0627\u062a\u0646\u0627 \u06c1\u06d2 <code>pr-42<\/code> \u0627\u0648\u0631 <code>pr-43<\/code> \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0627\u0648\u0631 \u062a\u0635\u0648\u06cc\u0631 \u06a9\u0627 \u0679\u06cc\u06af\u06d4<\/p>\n<p>\u06cc\u06c1 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2 <strong>\u0627\u067e\u0646\u06cc \u0645\u0631\u0636\u06cc \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642<\/strong> \u0627\u0633\u06d2 \u062d\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0627\u0633 \u0637\u0631\u062d \u0644\u06a9\u06be\u06cc\u06ba: <strong>\u0628\u0646\u06cc\u0627\u062f<\/strong>\u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u06c1\u0645 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc \u0627\u0639\u0644\u0627\u0646\u06cc\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba ( <strong>\u0686\u0627\u062f\u0631<\/strong>) \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u060c \u0628\u063a\u06cc\u0631 \u0633\u0679\u0631\u0646\u06af \u0645\u062a\u0628\u0627\u062f\u0644 \u06a9\u06d2 \u06cc\u0627 <code>sed<\/code> \u0627\u0633\u06a9\u0631\u067e\u0679\u0633 \u062c\u0648 YAML \u0645\u06cc\u06ba \u06c1\u06cc\u0631\u0627 \u067e\u06be\u06cc\u0631\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0633\u0679\u0645\u0627\u0626\u0632 \u0628\u0644\u0679 \u0627\u0646 \u06c1\u06d2\u06d4 <code>kubectl<\/code> (\u0628\u0633 <code>-k<\/code> \u067e\u0631\u0686\u0645)\u060c \u0644\u06c1\u0630\u0627 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0627\u0636\u0627\u0641\u06cc \u0686\u06cc\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>k8s\/base\/deployment.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: preview-app\n  labels:\n    app: preview-app\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: preview-app\n  template:\n    metadata:\n      labels:\n        app: preview-app\n    spec:\n      containers:\n        - name: preview-app\n          # This is a placeholder. The overlay replaces it with the\n          # real registry path and PR-specific tag.\n          image: preview-app\n          ports:\n            - containerPort: 8080\n          env:\n            # Downward API: the pod learns its own identity\n            - name: POD_NAMESPACE\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.namespace\n            - name: POD_NAME\n              valueFrom:\n                fieldRef:\n                  fieldPath: metadata.name\n          livenessProbe:\n            httpGet:\n              path: \/healthz\n              port: 8080\n            initialDelaySeconds: 5\n            periodSeconds: 10\n          readinessProbe:\n            httpGet:\n              path: \/healthz\n              port: 8080\n            initialDelaySeconds: 2\n            periodSeconds: 5\n          resources:\n            requests:\n              cpu: \"50m\"\n              memory: \"64Mi\"\n            limits:\n              cpu: \"200m\"\n              memory: \"128Mi\"\n<\/code><\/pre>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>k8s\/base\/service.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: v1\nkind: Service\nmetadata:\n  name: preview-app\nspec:\n  selector:\n    app: preview-app\n  ports:\n    - protocol: TCP\n      port: 80\n      targetPort: 8080\n  type: ClusterIP\n<\/code><\/pre>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>k8s\/base\/kustomization.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: kustomize.config.k8s.io\/v1beta1\nkind: Kustomization\n\nresources:\n  - deployment.yaml\n  - service.yaml\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>replicas: 1<\/code>: \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u062f\u0633\u062a\u06cc\u0627\u0628\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062a\u0639\u062f\u062f \u0646\u0642\u0644\u06cc\u06ba \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0627\u0639\u0644\u06cc \u062f\u0633\u062a\u06cc\u0627\u0628\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0646\u0648\u0688 \u06a9\u06cc \u06af\u0646\u062a\u06cc \u0627\u0648\u0631 \u0628\u0644\u0648\u06ba \u06a9\u0648 \u0635\u062d\u062a \u0645\u0646\u062f \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0645\u0627\u0645 \u06a9\u06be\u0644\u06d2 PRs \u0645\u06cc\u06ba \u0641\u06cc \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0646\u0642\u0644 \u06a9\u0648 \u0636\u0631\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<p><code>image: preview-app<\/code>: \u06cc\u06c1 \u0627\u06cc\u06a9 \u067e\u0644\u06cc\u0633 \u06c1\u0648\u0644\u0688\u0631 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0631\u062c\u0633\u0679\u0631\u06cc \u06cc\u0627 \u0679\u06cc\u06af \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u0633\u06d2 \u0627\u0633 \u0637\u0631\u062d \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06be\u06cc\u0646\u0686\u06cc\u06ba \u06af\u06d2\u06d4 Kustomize \u06a9\u0627 \u0627\u0645\u06cc\u062c \u06a9\u0646\u0648\u0631\u0679\u0631 \u0627\u0633 \u0646\u0627\u0645 \u0633\u06d2 \u0645\u06cc\u0644 \u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0639\u0627\u0644\u0645\u06cc \u0633\u0637\u062d \u067e\u0631 \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631\u06cc \u06a9\u0627 URL \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0646\u06cc\u0686\u06d2 \u06a9\u06cc \u0637\u0631\u0641 API<\/strong> <code>env<\/code> <strong>\u0628\u0644\u0627\u06a9<\/strong>: \u06cc\u06c1 \u06cc\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>POD_NAMESPACE<\/code> \u0627\u0648\u0631 <code>POD_NAME<\/code> \u0645\u06cc\u06ba \u0633\u06d2 \u06c1\u0648\u06ba\u06d4 <code>fieldRef<\/code> \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631\u060c \u06cc\u06c1 \u067e\u0648\u0688 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u062a\u0635\u0631\u06cc\u062d \u0633\u06d2 \u0641\u06cc\u0644\u0688\u0632 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0633\u06cc API \u06a9\u0627\u0644\u060c \u0627\u0633\u0646\u0627\u062f\u060c \u06cc\u0627 \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p><code>type: ClusterIP<\/code>: \u0635\u0631\u0641 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u06c1\u0631 \u0627\u06cc\u06a9 <code>LoadBalancer<\/code> \u0633\u0631\u0648\u0633 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0641\u06cc \u06af\u06be\u0646\u0679\u06c1 \u0644\u0627\u06af\u062a \u0627\u0648\u0631 \u0639\u0648\u0627\u0645\u06cc IPs \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4 PR \u0628\u06c1 PR \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u0627\u06cc\u0633\u0627 \u06a9\u0631\u0646\u0627 \u0645\u06c1\u0646\u06af\u0627 \u0627\u0648\u0631 \u0641\u0636\u0648\u0644 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0627\u06cc\u067e \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0628\u0630\u0631\u06cc\u0639\u06c1 \u06a9\u0631\u06cc\u06ba \u06af\u06d2: <code>kubectl port-forward<\/code> \u0627\u0628 \u0645\u0631\u062d\u0644\u06c1 13 \u0645\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0646\u06af\u0631\u06cc\u0633 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0627\u06cc\u06a9 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u0648\u0631 \u062d\u062f\u0648\u062f<\/strong>: <code>requests<\/code> \u06af\u0646\u062c\u0627\u0626\u0634 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0634\u06cc\u0688\u06cc\u0648\u0644\u0631 \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648 \u06a9\u06c1 \u067e\u0648\u0688\u0632 \u06a9\u0648 \u06a9\u062a\u0646\u06cc \u062c\u06af\u06c1 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2\u06d4 <code>limits<\/code> \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u062a\u0646\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u062d\u062f \u06a9\u06d2\u060c \u0627\u06cc\u06a9 \u0628\u06be\u0627\u06af\u0627 \u06c1\u0648\u0627 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0646\u0648\u0688 \u067e\u0631 \u0645\u0648\u062c\u0648\u062f \u062f\u06cc\u06af\u0631 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0679\u0648\u0679\u0646\u06d2 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u0648\u0626\u06cc \u0622\u067e\u0634\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0628\u06c1\u062a \u0633\u06d2 \u0642\u0631\u06cc\u0628 \u0627\u0644\u0645\u062f\u062a \u0645\u0627\u062d\u0648\u0644 \u0627\u0628\u06be\u0631\u062a\u06d2 \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u067e\u0646\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0631\u06cc\u0646\u0688\u0631\u0632 \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u062c\u0627\u0646\u0686\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl kustomize k8s\/base\n<\/code><\/pre>\n<p>\u067e\u06cc\u0634 \u06a9\u0631\u062f\u06c1 YAML \u06a9\u0648 \u0644\u0627\u06af\u0648 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u067e\u0631\u0646\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0688\u06cc\u0628\u06af\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0641\u06cc\u062f \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-9-build-the-spin-up-workflow\">\u0645\u0631\u062d\u0644\u06c1 9: \u0627\u0633\u067e\u0646 \u0627\u067e \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u0627\u0628 \u06c1\u0645 \u0633\u0628 \u06a9\u0686\u06be \u062c\u0648\u0691\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>.github\/workflows\/preview-deploy.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">name: Deploy PR Preview\n\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n\n# If someone pushes three commits quickly, cancel the older runs.\n# Without this, three deploys race each other into the same namespace\n# and whichever finishes last wins \u2014 which may not be the newest commit.\nconcurrency:\n  group: preview-${{ github.event.pull_request.number }}\n  cancel-in-progress: true\n\npermissions:\n  contents: read\n  id-token: write   # REQUIRED for Workload Identity Federation\n  pull-requests: write\n\nenv:\n  PROJECT_ID: YOUR_PROJECT_ID\n  REGION: europe-west2\n  CLUSTER_NAME: pr-preview-cluster\n  CLUSTER_ZONE: europe-west2-a\n  REPOSITORY: pr-preview\n  IMAGE_NAME: preview-app\n\njobs:\n  deploy:\n    name: Build and deploy preview\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Check out code\n        uses: actions\/checkout@v4\n\n      - name: Set environment variables\n        run: |\n          PR_NUMBER=${{ github.event.pull_request.number }}\n          SHORT_SHA=$(echo \"${{ github.event.pull_request.head.sha }}\" | cut -c1-7)\n\n          echo \"PR_NUMBER=${PR_NUMBER}\"   >> $GITHUB_ENV\n          echo \"SHORT_SHA=${SHORT_SHA}\"   >> $GITHUB_ENV\n          echo \"NAMESPACE=pr-${PR_NUMBER}\" >> $GITHUB_ENV\n          echo \"IMAGE_TAG=pr-${PR_NUMBER}-${SHORT_SHA}\" >> $GITHUB_ENV\n          echo \"IMAGE_BASE=${{ env.REGION }}-docker.pkg.dev\/${{ env.PROJECT_ID }}\/${{ env.REPOSITORY }}\/${{ env.IMAGE_NAME }}\" >> $GITHUB_ENV\n\n      - name: Authenticate to Google Cloud\n        uses: google-github-actions\/auth@v2\n        with:\n          workload_identity_provider: ${{ secrets.WIF_PROVIDER }}\n          service_account: ${{ secrets.WIF_SERVICE_ACCOUNT }}\n\n      - name: Set up gcloud\n        uses: google-github-actions\/setup-gcloud@v2\n\n      - name: Configure Docker for Artifact Registry\n        run: gcloud auth configure-docker ${{ env.REGION }}-docker.pkg.dev --quiet\n\n      - name: Build and push image\n        run: |\n          docker build \n            --build-arg PR_NUMBER=\"${PR_NUMBER}\" \n            --build-arg GIT_SHA=\"${SHORT_SHA}\" \n            -t \"${IMAGE_BASE}:${IMAGE_TAG}\" \n            .\/app\n\n          docker push \"${IMAGE_BASE}:${IMAGE_TAG}\"\n\n      - name: Get GKE credentials\n        uses: google-github-actions\/get-gke-credentials@v2\n        with:\n          cluster_name: ${{ env.CLUSTER_NAME }}\n          location: ${{ env.CLUSTER_ZONE }}\n\n      - name: Create namespace\n        run: |\n          # --dry-run=client | apply makes this idempotent.\n          # Running it on an existing namespace is a no-op, not an error.\n          kubectl create namespace \"${NAMESPACE}\" \n            --dry-run=client -o yaml | kubectl apply -f -\n\n      - name: Generate Kustomize overlay\n        run: |\n          mkdir -p k8s\/overlays\/\"${NAMESPACE}\"\n          cat > k8s\/overlays\/\"${NAMESPACE}\"\/kustomization.yaml <<eof apiversion:=\"\" kustomize.config.k8s.io=\"\" kind:=\"\" kustomization=\"\" namespace:=\"\" resources:=\"\" ..=\"\" images:=\"\" name:=\"\" preview-app=\"\" newname:=\"\" newtag:=\"\" eof=\"\" echo=\"\" rendered=\"\" manifest=\"\" kubectl=\"\" kustomize=\"\" k8s=\"\" deploy=\"\" run:=\"\" apply=\"\" wait=\"\" for=\"\" rollout=\"\" status=\"\" deployment=\"\" show=\"\" details=\"\" get=\"\" pods=\"\"\/><\/code><\/pre>\n<h3 id=\"heading-add-the-two-secrets\">\u062f\u0648 \u0631\u0627\u0632 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>GitHub \u067e\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba\u06d4 <strong>\u062a\u0631\u062a\u06cc\u0628<\/strong>\u060c <strong>\u0631\u0627\u0632 \u0627\u0648\u0631 \u0645\u062a\u063a\u06cc\u0631\u0627\u062a<\/strong>\u060c <strong>\u0639\u0645\u0644<\/strong>\u0627\u0648\u0631 <strong>\u0646\u06cc\u0627 \u0630\u062e\u06cc\u0631\u06c1 \u0631\u0627\u0632<\/strong>. \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u062e\u0641\u06cc\u06c1 \u0646\u0627\u0645<\/th>\n<th>\u0642\u062f\u0631<\/th>\n<\/tr>\n<\/thead>\n<tbody wp_automatic_readability=\"2\">\n<tr wp_automatic_readability=\"2\">\n<td><code>WIF_PROVIDER<\/code><\/td>\n<td>\u06a9\u06c1 <code>workload_identity_provider<\/code> Terraform \u0633\u06d2 \u0622\u0624\u0679 \u067e\u0679<\/td>\n<\/tr>\n<tr wp_automatic_readability=\"2\">\n<td><code>WIF_SERVICE_ACCOUNT<\/code><\/td>\n<td>\u06a9\u06c1 <code>service_account_email<\/code> Terraform \u0633\u06d2 \u0622\u0624\u0679 \u067e\u0679<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101548_818_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"GitHub \u0645\u062e\u0632\u0646 \u06a9\u06d2 \u062e\u0641\u06cc\u06c1 \u0635\u0641\u062d\u06c1 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a WIF_PROVIDER \u0627\u0648\u0631 WIF_SERVICE_ACCOUNT\" style=\"display: block;\" width=\"2380\" height=\"1446\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0646\u06c1 \u06c1\u06cc \u06a9\u0648\u0626\u06cc \u0633\u0646\u062f \u06c1\u06d2\u06d4 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1 \u0627\u0648\u0631 \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0627\u06cc \u0645\u06cc\u0644 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06c1\u06cc\u06ba\u060c \u067e\u0627\u0633 \u0648\u0631\u0688 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0648\u06c1 \u062e\u0648\u062f \u0633\u06d2 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 OIDC \u0679\u0648\u06a9\u0646 \u0627\u0648\u0631 \u0627\u0646\u062a\u0633\u0627\u0628 \u06a9\u06cc \u0634\u0631\u0627\u0626\u0637 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u06d2 \u0631\u0627\u0632 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u0646\u0627 \u0628\u0627\u0644\u06a9\u0644 \u0635\u0627\u0641 \u06c1\u06d2\u06d4 \u0627\u067e \u0688\u06cc\u0679 <code>PROJECT_ID<\/code> \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u0645\u0642\u0627\u0645\u06cc \u0627\u0642\u062f\u0627\u0631 <code>env:<\/code> \u0627\u067e\u0646\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-understanding-the-workflow\">\u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0633\u0645\u062c\u06be\u06cc\u06ba\u06d4<\/h3>\n<p><code>on: pull_request: types: [opened, synchronize, reopened]<\/code>: \u06cc\u06c1 \u062a\u06cc\u0646 \u0627\u0644\u06af \u0627\u0644\u06af \u0645\u062d\u0631\u06a9\u0627\u062a \u06c1\u06cc\u06ba\u06d4<\/p>\n<ul wp_automatic_readability=\"2\">\n<li wp_automatic_readability=\"-1\">\n<p><code>opened<\/code>    \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u062c\u0628 PR \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u0628\u0646\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"1\">\n<p><code>synchronize<\/code>    \u06cc\u06c1 \u0622\u067e \u06a9\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06cc \u0634\u0627\u062e\u0648\u06ba \u0645\u06cc\u06ba \u06c1\u0631 \u062f\u06be\u06a9\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"1\">\n<p><code>reopened<\/code>    \u06c1\u06cc\u0646\u0688\u0644\u0632 \u0628\u0646\u062f \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u06be\u0648\u0644\u06d2 \u06af\u0626\u06d2 PRs\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c PR \u06a9\u0627 \u0645\u0627\u062d\u0648\u0644 \u062a\u0628\u0627\u06c1 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<\/li>\n<\/ul>\n<p><code>concurrency<\/code>: \u0627\u0635\u0644 \u0688\u06cc\u0628\u06af\u0646\u06af \u06a9\u0627 \u0648\u0642\u062a \u0628\u0686\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06a9\u06d2 \u0628\u0639\u062f \u062f\u06cc\u06af\u0631\u06d2 \u062a\u06cc\u0646 \u06a9\u0645\u0679 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0646\u06d2 \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u0646\u0634\u0627\u0646\u06c1 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062a\u06cc\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0686\u0644\u06cc\u06ba \u06af\u06d2\u06d4 \u0648\u06c1 \u062f\u0648\u0691\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u062e\u0631\u06cc \u0645\u06a9\u0645\u0644 \u0634\u062f\u06c1 \u06a9\u0648\u0688 \u062c\u06cc\u062a \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0636\u0631\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u062d\u0627\u0644\u06cc\u06c1 \u06a9\u0648\u0688 \u06c1\u0648\u06d4 \u0627\u06cc\u06a9 \u062a\u06cc\u0632 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u062a\u0639\u0645\u06cc\u0631 \u0622\u06c1\u0633\u062a\u06c1 \u0622\u06c1\u0633\u062a\u06c1 \u0628\u0639\u062f \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0648 \u067e\u06a9\u0691 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u067e\u0631\u0627\u0646\u0627 \u06a9\u0648\u0688 \u0686\u0644\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u062c\u0628 \u06a9\u06c1 PR \u0633\u0628\u0632 \u06c1\u06d2\u06d4 PR \u0646\u0645\u0628\u0631 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u06af\u0631\u0648\u067e \u06a9\u0631\u06cc\u06ba\u06d4 <code>cancel-in-progress: true<\/code> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0635\u0631\u0641 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u067e\u06be\u0627\u0646\u0633\u06cc \u0631\u06a9\u06be\u06cc \u06af\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>permissions: id-token: write<\/code>: \u0627\u0633 \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0648\u0631 \u06a9\u0686\u06be \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u06cc\u06c1 \u0622\u067e \u06a9\u06d2 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 GitHub \u0633\u06d2 OIDC \u0679\u0648\u06a9\u0646 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0686\u06be\u0648\u0691 \u062f\u0648 <code>google-github-actions\/auth<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u063a\u0644\u0637\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 ID \u0679\u0648\u06a9\u0646 \u062d\u0627\u0635\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u0627\u06d4 \u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u0639\u0627\u0645 WIF \u0633\u06cc\u0679 \u0627\u067e \u06a9\u06cc \u063a\u0644\u0637\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>$GITHUB_ENV<\/code>: \u062a\u062d\u0631\u06cc\u0631 <code>KEY=value<\/code> \u06cc\u06c1 \u0641\u0627\u0626\u0644 \u0622\u067e \u06a9\u0648 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0645\u062a\u063a\u06cc\u0631 \u0645\u06cc\u06ba \u0645\u062a\u063a\u06cc\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4 <em>\u0641\u0627\u0644\u0648 \u0627\u067e<\/em> \u0642\u062f\u0645 \u06cc\u06c1 \u0641\u06cc \u0627\u0644\u062d\u0627\u0644 \u0645\u062a\u063a\u06cc\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0642\u062f\u0645 \u0645\u06cc\u06ba \u0644\u06a9\u06be\u06d2 \u06af\u0626\u06d2 \u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u0648 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0642\u062f\u0645 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u067e\u0691\u06be\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627\u06d4 \u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0633\u06cc\u0679 \u0627\u067e \u0633\u0628 \u0633\u06d2 \u0627\u0648\u067e\u0631 \u0627\u067e\u0646\u06d2 \u0642\u062f\u0645 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>github.event.pull_request.head.sha<\/code>: \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u0633 \u067e\u0631 \u062a\u0648\u062c\u06c1 \u062f\u06cc\u06ba\u06d4 <code>github.sha<\/code>. \u06a9\u0648 <code>pull_request<\/code> \u0648\u0627\u0642\u0639\u0627\u062a\u060c GitHub \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <em>\u0639\u06c1\u062f \u06a9\u0648 \u0636\u0645 \u06a9\u0631\u06cc\u06ba\u06d4<\/em>. \u06cc\u06c1 \u0627\u06cc\u06a9 \u0639\u0627\u0631\u0636\u06cc \u0639\u06c1\u062f \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06cc \u0628\u0631\u0627\u0646\u0686 \u06a9\u0648 \u0645\u06cc\u0646 \u0628\u0631\u0627\u0646\u0686 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0648\u0627\u0626\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>github.sha<\/code> \u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u06cc \u06a9\u0645\u0679 \u06a9\u0627 \u062d\u0648\u0627\u0644\u06c1 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0633\u06cc \u06a9\u0648 \u0627\u0644\u062c\u06be\u0646 \u0645\u06cc\u06ba \u0688\u0627\u0644 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 <code>head.sha<\/code> \u06cc\u06c1 PR \u0628\u0631\u0627\u0646\u0686 \u067e\u0631 \u0627\u0635\u0644 \u0622\u062e\u0631\u06cc \u06a9\u0645\u0679 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u0648 \u062a\u0648\u0642\u0639 \u06c1\u06d2\u06d4<\/p>\n<p><code>--dry-run=client -o yaml | kubectl apply -f -<\/code>    \u06cc\u06c1 \u0686\u0648\u0631\u06cc \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc \u0633\u06cc \u0686\u0627\u0644 \u06c1\u06d2\u06d4 <code>kubectl create namespace<\/code> \u0627\u06af\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc \u0627\u0648\u0631 \u067e\u06c1\u0644\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u062a\u0645\u0627\u0645 \u062f\u06be\u06a9\u06d2 \u062e\u062a\u0645 \u06a9\u0631 \u062f\u06cc\u06d2 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u06cc\u06c1 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0627\u06cc\u06a9 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 YAML \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u0633\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u067e\u0627\u0626\u067e \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<code>apply<\/code>\u0627\u06af\u0631 \u06cc\u06c1 \u063a\u0627\u0626\u0628 \u06c1\u06d2 \u062a\u0648 \u0627\u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0648\u0631\u0646\u06c1 \u06a9\u0686\u06be \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u0633\u0627\u062e\u062a \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0628\u06d2 \u062d\u0633\u06d4<\/p>\n<p><strong>heredoc \u0627\u0648\u0648\u0631\u0644\u06d2<\/strong>: \u0627\u0648\u0648\u0631\u0644\u06d2 \u0641\u06cc PR \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 (\u062c\u0648 \u0646\u0627\u0645\u0645\u06a9\u0646 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 PR \u0646\u0645\u0628\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0639\u0644\u0648\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2)\u060c \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0627\u0648\u0648\u0631\u0644\u06d2 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0631\u0646\u0631 \u06a9\u06d2 \u062d\u0630\u0641 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0633\u06d2 \u0631\u062f \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0639\u0627\u0631\u0636\u06cc \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0639\u0627\u0631\u0636\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06c1\u06d2\u06d4<\/p>\n<p><code>kubectl rollout status<\/code>    \u06cc\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0627\u06cc\u0645\u0627\u0646\u062f\u0627\u0631 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u0633 \u0648\u0642\u062a \u06a9\u0627\u0645 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>kubectl apply<\/code> API \u0633\u0631\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u067e\u0648\u0688 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06c1\u06d2\u06d4 \u062a\u0646\u0627\u0632\u0639\u0627\u062a \u06a9\u06cc \u062f\u06c1\u0631\u0627\u0626\u06cc \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0628 \u0628\u06be\u06cc \u0633\u0628\u0632 \u0686\u06cc\u06a9 \u0645\u0627\u0631\u06a9 \u062f\u06a9\u06be\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 <code>rollout status<\/code> \u067e\u0648\u0688 \u06cc\u0627 \u062a\u0648 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0628\u0644\u0627\u06a9 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06cc\u06c1 \u062d\u0642\u06cc\u0642\u062a \u0645\u06cc\u06ba \u062a\u06cc\u0627\u0631 \u0646\u06c1 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06cc\u0627 180 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u06d2 \u0628\u0639\u062f \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2\u06d4 \u0633\u0628\u0632 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<h3 id=\"heading-a-note-on-forked-pull-requests\">\u0641\u0648\u0631\u06a9 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u067e\u0631 \u0646\u0648\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u0633\u06d2 \u0639\u0648\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06a9\u0686\u06be \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2: \u06a9\u0627\u0646\u0679\u06d2 \u0633\u06d2 \u06a9\u06be\u06cc\u0646\u0686\u0646\u06d2 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a <strong>~ \u0646\u06c1\u06cc\u06ba<\/strong> \u0648\u0635\u0648\u0644 \u06a9\u0631\u06cc\u06ba <code>id-token: write<\/code> \u0627\u062c\u0627\u0632\u062a\u060c \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631\u06d4 GitHub \u0627\u062c\u0646\u0628\u06cc\u0648\u06ba \u06a9\u0648 PRs \u06a9\u06be\u0648\u0644\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06cc \u06a9\u0644\u0627\u0624\u0688 \u0627\u0633\u0646\u0627\u062f \u0686\u0648\u0631\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0646\u062c\u06cc \u0630\u062e\u06cc\u0631\u0648\u06ba \u06cc\u0627 \u0630\u0627\u062a\u06cc \u0645\u0646\u0635\u0648\u0628\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u0633 \u06a9\u0627 \u06a9\u0648\u0626\u06cc \u0627\u062b\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0639\u0648\u0627\u0645\u06cc \u0630\u062e\u06cc\u0631\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0648 \u0628\u06cc\u0631\u0648\u0646\u06cc \u062a\u0639\u0627\u0648\u0646 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>workflow_run<\/code>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0646\u0645\u0648\u0646\u06c1 \u0648\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0645\u0631\u0627\u0639\u0627\u062a \u06cc\u0627\u0641\u062a\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u06cc\u06a9 \u0646\u0627\u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u062a\u0639\u0645\u06cc\u0631 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0628\u0646\u06cc\u0627\u062f\u06cc \u0630\u062e\u06cc\u0631\u06c1 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u06a9\u06d2 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06af\u0631 \u0622\u067e \u0627\u0648\u067e\u0646 \u0633\u0648\u0631\u0633 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0633\u06d2 \u0646\u06c1 \u0686\u06be\u0648\u0691\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-step-10-build-the-teardown-workflow\">\u0645\u0631\u062d\u0644\u06c1 10: \u0688\u06cc\u06a9\u0645\u067e\u0648\u0632\u06cc\u0634\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u0627\u0633\u067e\u0646 \u0627\u067e \u0627\u0633 \u06a9\u06cc \u0635\u0631\u0641 \u0622\u062f\u06be\u06cc \u0642\u062f\u0631 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0645\u0627\u062d\u0648\u0644 \u062c\u0648 \u06a9\u0628\u06be\u06cc \u062f\u0648\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0635\u0631\u0641 \u0622\u067e \u06a9\u06d2 \u0628\u0627\u062f\u0644 \u06a9\u06d2 \u0628\u0644\u0648\u06ba \u06a9\u0627 \u0627\u06cc\u06a9 \u0633\u0633\u062a \u0631\u0633\u0627\u0648 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>.github\/workflows\/preview-teardown.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">name: Tear Down PR Preview\n\non:\n  pull_request:\n    types: [closed]\n\npermissions:\n  contents: read\n  id-token: write\n\nenv:\n  PROJECT_ID: YOUR_PROJECT_ID\n  CLUSTER_NAME: pr-preview-cluster\n  CLUSTER_ZONE: europe-west2-a\n\njobs:\n  teardown:\n    name: Delete preview namespace\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Set namespace\n        run: echo \"NAMESPACE=pr-${{ github.event.pull_request.number }}\" >> $GITHUB_ENV\n\n      - name: Authenticate to Google Cloud\n        uses: google-github-actions\/auth@v2\n        with:\n          workload_identity_provider: ${{ secrets.WIF_PROVIDER }}\n          service_account: ${{ secrets.WIF_SERVICE_ACCOUNT }}\n\n      - name: Get GKE credentials\n        uses: google-github-actions\/get-gke-credentials@v2\n        with:\n          cluster_name: ${{ env.CLUSTER_NAME }}\n          location: ${{ env.CLUSTER_ZONE }}\n\n      - name: Delete namespace\n        run: |\n          echo \"Deleting namespace ${NAMESPACE}\"\n          kubectl delete namespace \"${NAMESPACE}\" \n            --ignore-not-found=true \n            --wait=false\n\n      - name: Confirm\n        run: |\n          echo \"Preview environment for PR #${{ github.event.pull_request.number }} torn down.\"\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba \u06a9\u0686\u06be \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0622\u067e \u06a9\u06d2 \u062e\u06cc\u0627\u0644 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 <code>types: [closed]<\/code> <strong>\u06a9\u0648\u0631 \u0628\u06be\u06cc \u0645\u0644 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/strong> GitHub \u067e\u0631 \u06a9\u0648\u0626\u06cc \u0627\u0644\u06af \u06a9\u0648\u0688 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>merged<\/code> \u0648\u0627\u0642\u0639\u06c1 \u06a9\u06cc \u0642\u0633\u0645\u06d4 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0646\u0636\u0645\u0627\u0645 \u0686\u0644\u062a\u06cc \u06c1\u06d2\u06d4 <code>closed<\/code> \u067e\u06d2 \u0644\u0648\u0688 \u0641\u06cc\u0644\u0688\u0632 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u06d4 <code>merged: true<\/code>. \u0644\u06c1\u0630\u0627 \u06cc\u06c1 \u0648\u0627\u062d\u062f \u0679\u0631\u06af\u0631 &quot;\u0645\u0631\u062c \u06a9\u0627\u0645\u06cc\u0627\u0628&#8221; \u0627\u0648\u0631 &quot;\u0688\u0633\u06a9\u0627\u0631\u0688 \u0627\u06cc\u0646\u0688 \u0679\u0631\u0645\u06cc\u0646\u06cc\u0679&#8221; \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0641\u0631\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u062a\u0628\u0627\u06c1\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0644\u0627\u060c <code>--ignore-not-found=true<\/code>: \u0627\u06af\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 (\u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u06af\u0626\u06cc \u06cc\u0627 \u06a9\u0633\u06cc \u0646\u06d2 \u0627\u0633\u06d2 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062d\u0630\u0641 \u06a9\u0631\u062f\u06cc\u0627) <code>kubectl delete<\/code> \u06cc\u06c1 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062e\u062a\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0633\u0631\u062e \u0631\u0646\u06af \u0645\u06cc\u06ba \u0646\u0634\u0627\u0646 \u0632\u062f \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u063a\u0644\u0637 \u0627\u0644\u0627\u0631\u0645 \u06c1\u06d2\u06d4 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0622\u062e\u0631\u06cc \u062d\u0627\u0644\u062a &quot;\u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2&#8221; \u06c1\u06d2\u060c \u062c\u0648 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062c\u06be\u0646\u0688\u0627 \u0627\u0633 \u0648\u0642\u062a \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u0627 \u0628\u0627\u0639\u062b \u0628\u0646\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0645 \u0646\u06c1 \u06c1\u0648\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u06a9\u0627\u0631 <code>--wait=false<\/code>: \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u0646\u0627 \u063a\u06cc\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u06c1\u06d2\u06d4 Kubernetes \u0627\u0633\u06d2 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4<code>Terminating<\/code>\u0627\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0645\u0648\u062c\u0648\u062f \u062a\u0645\u0627\u0645 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0639\u0645\u0644 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 CI \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0679\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0646\u0679 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0627\u062e\u06cc\u0631 \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06a9\u0648\u0626\u06cc \u0641\u0627\u0626\u062f\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627\u06d4 \u0688\u06cc\u0644\u06cc\u0679 \u06a9\u0648 \u0686\u0644\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0648\u0642\u062a \u0645\u06cc\u06ba \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-step-11-open-a-pull-request-and-watch-it-work\">\u0645\u0631\u062d\u0644\u06c1 11: \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06be\u0648\u0644\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0639\u0645\u0644 \u0645\u06cc\u06ba \u062f\u06cc\u06a9\u06be\u06cc\u06ba<\/h2>\n<p>\u0639\u06c1\u062f \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">git add .\ngit commit -m \"Add PR preview environment infrastructure\"\ngit push -u origin main\n<\/code><\/pre>\n<p>\u0627\u0628 \u0627\u06cc\u06a9 \u0628\u0631\u0627\u0646\u0686 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u06c1 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">git checkout -b test-preview\n<\/code><\/pre>\n<p>\u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u06cc\u06ba <code>app\/main.go<\/code>. \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u06cc \u067e\u06c1\u0644\u06cc \u0644\u0627\u0626\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-go\">fmt.Fprintf(w, \"Preview environment is live \u2014 testing the pipelinenn\")\n<\/code><\/pre>\n<p>\u06a9\u0645\u0679 \u0627\u0648\u0631 \u067e\u0634:<\/p>\n<pre><code class=\"language-bash\">git add .\ngit commit -m \"Test preview environment\"\ngit push -u origin test-preview\n<\/code><\/pre>\n<p>GitHub \u067e\u0631 \u0627\u06cc\u06a9 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06be\u0648\u0644\u06cc\u06ba \u0627\u0648\u0631 \u062c\u0627\u0626\u06cc\u06ba: <strong>\u0639\u0645\u0644<\/strong> \u0679\u06cc\u06af \u0622\u067e \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 &quot;PR \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc&#8221; \u0686\u0644 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101549_701_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1 \u06cc\u06c1 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc PR \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2380\" height=\"1446\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u0645\u0631\u0627\u062d\u0644 \u0633\u06d2 \u06af\u0632\u0631\u06cc\u06ba\u06d4 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0644\u06cc\u062f \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0645\u06cc\u062c \u06a9\u0648 \u0628\u0646\u0627\u062a\u0627 \u0627\u0648\u0631 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06a9\u0633\u0679\u0645\u0627\u0626\u0632 \u0627\u0648\u0648\u0631\u0644\u06d2 \u06a9\u0648 \u0631\u06cc\u0646\u0688\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 (\u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u067e\u0631\u0646\u0679 \u06c1\u0648\u062a\u0627 \u06c1\u06d2)\u060c \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 <code>rollout status<\/code> \u067e\u0648\u0688 \u062a\u06cc\u0627\u0631 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101549_868_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u062a\u0648\u0633\u06cc\u0639 \u0634\u062f\u06c1 GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0644\u0627\u06af \u062c\u0633 \u0645\u06cc\u06ba \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06a9\u06d2 \u0645\u0631\u0627\u062d\u0644 \u06a9\u0648 \u062f\u06a9\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0631\u0648\u0644 \u0622\u0624\u0679 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u0633\u06d2 \u0645\u06a9\u0645\u0644 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2380\" height=\"1446\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062c\u0628 \u06cc\u06c1 \u0633\u0628\u0632 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u0627\u0633\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\">kubectl get namespaces | grep pr-\n<\/code><\/pre>\n<p>\u062a\u0645 \u0627\u067e\u0646\u06d2 \u06c1\u0648 <code>pr-1<\/code> (\u06cc\u0627 \u062c\u0648 \u0628\u06be\u06cc \u0646\u0645\u0628\u0631 \u0622\u067e \u06a9\u06d2 PR \u06a9\u0648 \u0645\u0644\u0627)\u06d4<\/p>\n<pre><code class=\"language-shell\">kubectl get pods --namespace=pr-1\n<\/code><\/pre>\n<p>\u0627\u0628 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-shell\">kubectl port-forward --namespace=pr-1 service\/preview-app 8080:80\n<\/code><\/pre>\n<p>\u062f\u0648\u0633\u0631\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0645\u06cc\u06ba:<\/p>\n<pre><code class=\"language-shell\">curl http:\/\/localhost:8080\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0648 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2:<\/p>\n<pre><code class=\"language-shell\">Preview environment is live \u2014 testing the pipeline\n\nPR number  : 1\nGit SHA    : a1b2c3d\nNamespace  : pr-1\nPod name   : preview-app-7d9f8b6c4-xk2mp\n<\/code><\/pre>\n<p>\u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 PR \u0646\u0645\u0628\u0631 \u06a9\u06cc \u0627\u0637\u0644\u0627\u0639 \u062f\u06cc\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 SHA \u06a9\u0648 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0648\u0642\u062a \u0628\u0627\u0626\u0646\u0631\u06cc \u0645\u06cc\u06ba \u0628\u06cc\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633 \u0646\u06d2 \u0646\u06cc\u0686\u06d2 \u06a9\u06cc \u0637\u0631\u0641 API \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u06cc\u06ba\u06d4 \u0627\u0646 \u062a\u0645\u0627\u0645 \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u0645\u062e\u062a\u0644\u0641 \u062d\u0635\u0648\u06ba \u0646\u06d2 \u062d\u0644 \u06a9\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u0628\u06be\u06cc \u0627\u0646 \u067e\u0631 \u0645\u062a\u0641\u0642 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062b\u0628\u0648\u062a \u06c1\u06d2 \u06a9\u06c1 \u067e\u0648\u0631\u06cc \u0632\u0646\u062c\u06cc\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101549_371_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u06a9\u0631\u0644 \u0633\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u0631\u067e\u0648\u0631\u0679\u0646\u06af PR \u0646\u0645\u0628\u0631 1\u060c \u06a9\u0645\u0679 SHA\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 pr-1\u060c \u0627\u0648\u0631 Pod \u06a9\u0627 \u0646\u0627\u0645 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"1266\" height=\"1012\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0627\u0628 \u0627\u0633\u06cc \u0628\u0631\u0627\u0646\u0686 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u06a9\u0645\u0679 \u06a9\u0648 \u062f\u0628\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u0622\u067e \u06a9\u0627 \u0645\u0627\u062d\u0648\u0644 \u0679\u06be\u06cc\u06a9 \u0633\u06d2 \u0627\u067e \u0688\u06cc\u0679 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101549_196_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0644\u0627\u06af \u062c\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06cc \u06a9\u0645\u0679 \u06a9\u0648 \u0627\u0633\u06cc \u0628\u0631\u0627\u0646\u0686 \u0645\u06cc\u06ba \u062f\u06be\u06a9\u06cc\u0644\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u062a\u06d2 \u06c1\u0648\u0626\u06d2 PR \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u062f\u06a9\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2372\" height=\"1012\" loading=\"lazy\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101550_544_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u0679\u0631\u0645\u06cc\u0646\u0644 \u062c\u0633 \u0645\u06cc\u06ba kubectl \u067e\u0648\u0631\u0679 \u0641\u0627\u0631\u0648\u0631\u0688\u0646\u06af \u06a9\u0648 namespace pr-1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06cc curl \u06a9\u0645\u0627\u0646\u0688 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"1870\" height=\"554\" loading=\"lazy\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101550_108_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u062f\u0648\u0633\u0631\u06d2 \u067e\u0634 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06c1\u0645 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0627\u067e\u0646\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u06a9\u0631\u0644 \u06a9\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u06af\u0631\u06cc\u0679\u0646\u06af \u06a9\u0627 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0645\u062a\u0646 \u0627\u0648\u0631 \u0646\u06cc\u0627 \u06a9\u0645\u0679 SHA \u062f\u06a9\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"1870\" height=\"646\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u067e\u06be\u0631 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0679\u06cc\u0631 \u0688\u0627\u0624\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0686\u0644\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101550_260_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0633\u0691\u0646\u0627 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u062a\u062d\u0631\u06a9 \u0627\u0648\u0631 \u062c\u0627\u0631\u06cc \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2378\" height=\"864\" loading=\"lazy\" title=\"\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101551_25_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0633\u0691\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4\" style=\"display: block;\" width=\"2378\" height=\"1438\" loading=\"lazy\" title=\"\"><\/p>\n<pre><code class=\"language-bash\">kubectl get namespace pr-1\n<\/code><\/pre>\n<p><code>Terminating<\/code>\u0627\u0648\u0631 \u067e\u06be\u0631 \u063a\u0627\u0626\u0628 \u06c1\u0648 \u06af\u06cc\u0627\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101551_807_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2 kubectl get namespace \u0631\u06cc\u0679\u0631\u0646 \" style=\"display: block;\" width=\"2378\" height=\"158\" loading=\"lazy\" namespaces pr-1 not title=\"\"><\/p>\n<h3 id=\"heading-what-you-have-and-whats-still-missing\">\u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06a9\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u0628 \u0628\u06be\u06cc \u06a9\u06cc\u0627 \u06a9\u0645\u06cc \u06c1\u06d2\u06d4<\/h3>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0627 \u0645\u0634\u06a9\u0644 \u06a9\u0627\u0645 \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0631\u06a9\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u0679\u0627\u06a9 \u0644\u06cc\u06ba\u06d4 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u0628 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u062f\u0633\u062a\u06cc \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0648\u0627\u0642\u0639\u06cc \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0628\u0646\u062f \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u062a\u0645\u0627\u0645 \u0646\u0634\u0627\u0646\u0627\u062a \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u067e\u0648\u0631\u0627 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u06c1\u0645 \u0648\u06c1\u0627\u06ba \u06a9\u06cc\u0633\u06d2 \u067e\u06c1\u0646\u0686\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">kubectl port-forward --namespace=pr-1 service\/preview-app 8080:80\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 <code>kubectl<\/code> \u0627\u0646\u0633\u0679\u0627\u0644\u06cc\u0634\u0646\u060c \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u0646\u0627\u062f\u060c \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a\u060c \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u0639\u0644\u0645 \u06a9\u06c1 \u06a9\u0646 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u06a9\u0646 \u067e\u06cc \u0622\u0631\u0632 \u0645\u06cc\u06ba \u0645\u06cc\u067e \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u0633 \u0634\u062e\u0635 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u06be\u06cc\u06a9 \u06c1\u06d2 \u062c\u0633 \u0646\u06d2 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0628\u0646\u0627\u0626\u06cc\u060c \u0644\u06cc\u06a9\u0646 \u0688\u06cc\u0632\u0627\u0626\u0646\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0648 \u0648\u0642\u0641\u06c1 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u067e\u0631\u0648\u0688\u06a9\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u0627\u067e\u06cc \u06a9\u06cc \u062a\u0631\u0627\u0645\u06cc\u0645 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06d2 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u06cc\u0627 QA \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u0627\u0633 \u06a9\u06cc \u0645\u0646\u0638\u0648\u0631\u06cc \u062f\u06cc\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0628\u06c1\u0627\u0624 \u067e\u0631 \u06a9\u0644\u06a9 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06cc \u062c\u06be\u0644\u06a9\u06cc\u0627\u06ba \u06cc\u06c1 \u06c1\u06cc\u06ba: <em><strong>\u062c\u0648 \u0628\u06be\u06cc<\/strong><\/em>    \u0622\u067e \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0645\u0627\u062d\u0648\u0644 \u062c\u0633 \u062a\u06a9 \u0635\u0631\u0641 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u06c1\u06cc \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062d\u0642\u06cc\u0642\u062a \u0645\u06cc\u06ba \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0688\u06cc\u0628\u06af\u0646\u06af \u0679\u0648\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u0627 \u0628\u0642\u06cc\u06c1 \u062d\u0635\u06c1 \u0627\u0633 \u062e\u0644\u0627 \u06a9\u0648 \u067e\u064f\u0631 \u06a9\u0631\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0686\u0644\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0639\u0648\u0627\u0645\u06cc HTTPS URLs \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u0645 \u06af\u0627\u0631\u0688\u0631\u06cc\u0644\u0632 \u0628\u0646\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0635\u0641\u0627\u0626\u06cc \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u0633\u06d2 \u0622\u067e \u06a9\u06d2 \u06a9\u0644\u0627\u0624\u0688 \u0628\u0644 \u067e\u0631 \u0627\u06cc\u06a9 \u067e\u0631\u0633\u06a9\u0648\u0646 \u0686\u06cc\u0632 \u0628\u0646\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-12-reserve-a-static-ip-address\">\u0645\u0631\u062d\u0644\u06c1 12: \u0627\u06cc\u06a9 \u0645\u0633\u062a\u062d\u06a9\u0645 IP \u0627\u06cc\u0688\u0631\u06cc\u0633 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06a9\u0686\u06be \u0628\u06be\u06cc \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u06cc\u0631\u0648\u0646\u06cc IP \u0627\u06cc\u0688\u0631\u06cc\u0633 \u0631\u06cc\u0632\u0631\u0648 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06c1\u0645 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0648 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0642\u0633\u0645 \u06a9\u06cc Kubernetes \u0633\u0631\u0648\u0633\u0632 \u0628\u0646\u062a\u06cc \u06c1\u06cc\u06ba: <code>LoadBalancer<\/code>\u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u0639\u0648\u0627\u0645\u06cc IP \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0641\u0632\u06cc\u06a9\u0644 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0622\u0626\u06cc \u067e\u06cc \u06c1\u06d2\u06d4 <strong>\u0639\u0627\u0631\u0636\u06cc<\/strong>. \u0627\u06af\u0631 \u06a9\u0633\u06cc \u0633\u0631\u0648\u0633 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u06a9\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0633\u0631\u0648\u0633 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<p>\u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0627\u0633 IP \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u06cc\u06c1 \u0628\u062f\u0644 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u062a\u062c\u0631\u0628\u0627\u062a \u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba \u0679\u0648\u0679 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u060c \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0645\u0639\u0644\u0648\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u0646\u06c1 \u06a9\u06c1\u06d2 \u06a9\u06c1 \u0644\u0646\u06a9 \u0679\u0648\u0679 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u06d2 \u06a9\u0633\u06cc IP \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 IP \u0622\u067e \u06a9\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u06a9\u0627 \u0646\u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0622\u067e \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u062c\u0648 \u0628\u06be\u06cc \u0622\u067e\u0631\u06cc\u0634\u0646 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u0632\u0646\u062f\u06c1 \u0631\u06c1\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba <code>terraform\/main.tf<\/code>:<\/p>\n<pre><code class=\"language-hcl\"># -----------------------------------------------------------\n# Static external IP for the Ingress controller\n# -----------------------------------------------------------\nresource \"google_compute_address\" \"ingress\" {\n  name         = \"pr-preview-ingress-ip\"\n  region       = var.region\n  address_type = \"EXTERNAL\"\n\n  depends_on = [google_project_service.apis]\n}\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 \u0622\u0624\u0679 \u067e\u0679 <code>terraform\/outputs.tf<\/code>:<\/p>\n<pre><code class=\"language-hcl\">output \"ingress_ip\" {\n  description = \"Point your wildcard DNS record at this address\"\n  value       = google_compute_address.ingress.address\n}\n<\/code><\/pre>\n<p>\u0622\u067e \u0628\u06be\u06cc \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba <code>compute.googleapis.com<\/code> \u0627\u06af\u0631 \u0622\u067e \u06a9\u06cc API \u0641\u06c1\u0631\u0633\u062a \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062a\u0648 \u0627\u0633\u06d2 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 <code>for_each<\/code> \u0622\u067e \u06a9\u0627 <code>google_project_service<\/code> \u06a9\u0631\u06d2 \u06af\u0627:<\/p>\n<pre><code class=\"language-hcl\">  for_each = toset([\n    \"container.googleapis.com\",\n    \"artifactregistry.googleapis.com\",\n    \"iamcredentials.googleapis.com\",\n    \"sts.googleapis.com\",\n    \"compute.googleapis.com\",\n  ])\n<\/code><\/pre>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">cd terraform\nterraform apply \n  -var=\"project_id=YOUR_PROJECT_ID\" \n  -var=\"github_repo=YOUR_USERNAME\/pr-preview-envs\"\n<\/code><\/pre>\n<p>\u0648\u0627\u067e\u0633 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0622\u0626\u06cc \u067e\u06cc \u06a9\u0648 \u0646\u0648\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">terraform output ingress_ip\n<\/code><\/pre>\n<p>\u0627\u0633\u06d2 \u0644\u06a9\u06be \u062f\u06cc\u06ba\u06d4 \u0622\u067e \u0627\u0633\u06d2 \u0627\u06af\u0644\u06d2 \u062f\u0648 \u0645\u0631\u0627\u062d\u0644 \u0645\u06cc\u06ba \u062f\u0648 \u0628\u0627\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101551_172_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"Terraform \u0622\u0624\u0679 \u067e\u0679 ingress_ip \u0645\u062e\u0635\u0648\u0635 \u067e\u062a\u06d2 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2378\" height=\"1056\" loading=\"lazy\" title=\"\"><\/p>\n<p><strong>\u0627\u06c1\u0645:<\/strong> \u06cc\u06c1 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 <strong>\u0639\u0644\u0627\u0642\u06c1<\/strong> \u06a9\u0644\u0633\u0679\u0631 \u0648\u0627\u0644\u06d2 \u0639\u0644\u0627\u0642\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u067e\u062a\u06c1\u06d4 <code>region = var.region<\/code> \u0622\u067e \u06a9\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc. \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u0639\u0627\u0644\u0645\u06cc \u067e\u062a\u06d2 \u0628\u06be\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0639\u0627\u0644\u0645\u06cc HTTP(S) \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631\u0632 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0633\u0631\u0648\u0633 \u06a9\u06cc \u0642\u0633\u0645 <code>LoadBalancer<\/code> ingress-nginx \u062c\u0648 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0648\u06c1 \u0627\u06cc\u06a9 \u0639\u0644\u0627\u0642\u0627\u0626\u06cc \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u06c1\u06d2 \u0627\u0648\u0631 \u0639\u0627\u0644\u0645\u06cc \u067e\u062a\u0648\u06ba \u06a9\u0648 \u067e\u0627\u0628\u0646\u062f \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0633\u06a9\u062a\u0627\u06d4 \u0627\u0646 \u06a9\u0648 \u0645\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u0633\u0631\u0648\u0633 \u0645\u06cc\u06ba \u062e\u0644\u0644 \u067e\u0691\u06d2 \u06af\u0627\u06d4 <code>Pending<\/code> \u06cc\u06c1 \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646 \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc\u0648\u06ba \u0646\u06c1\u06cc\u06ba \u0628\u062a\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-step-13-install-the-ingress-controller\">\u0645\u0631\u062d\u0644\u06c1 13: Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0646\u06c1\u06cc\u06ba <strong>\u062f\u0627\u062e\u0644\u06c1<\/strong> \u0627\u06cc\u06a9 Kubernetes \u0648\u0633\u06cc\u0644\u06c1 \u062c\u0648 HTTP \u0631\u0648\u0679\u0646\u06af \u06a9\u06d2 \u0642\u0648\u0627\u0639\u062f \u06a9\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 &quot;\u0627\u0633 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u0633 \u0633\u0631\u0648\u0633 \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc\u06d4&#8221; \u062a\u0627\u06c1\u0645\u060c Ingress \u0648\u0633\u0627\u0626\u0644 \u0635\u0631\u0641 \u0648\u0636\u0627\u062d\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u06a9\u0686\u06be \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0642\u0648\u0627\u0646\u06cc\u0646 \u06a9\u0648 \u067e\u0691\u06be\u0646\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u0631\u0648\u0679 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 <strong>\u0648\u0635\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631<\/strong>.<\/p>\n<p>\u06c1\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 <strong>\u0648\u0635\u0648\u0644 \u06a9\u0631\u06cc\u06ba-nginx<\/strong>NGINX \u067e\u0631 \u0645\u0628\u0646\u06cc \u06a9\u0645\u06cc\u0648\u0646\u0679\u06cc \u06a9\u06d2 \u0632\u06cc\u0631 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u06d4 \u06cc\u06c1 \u0622\u067e \u06a9\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 Pod \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c Ingress \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 Kubernetes API \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u0628 \u0628\u06be\u06cc \u06cc\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u0627\u067e\u0646\u06cc NGINX \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u0627\u0645 \u06a9\u0648 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u06a9\u0644\u06cc\u062f\u06cc \u0646\u06a9\u0627\u062a \u06cc\u06c1 \u06c1\u06cc\u06ba: <strong>\u0627\u06cc\u06a9 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u062a\u0645\u0627\u0645 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/strong>. \u06c1\u0631 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0627\u067e\u0646\u0627 \u062f\u0627\u062e\u0644\u06cc \u0648\u0633\u06cc\u0644\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0627\u0633\u06d2 \u0627\u0679\u06be\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u0648\u0679\u0646\u06af \u06a9\u0627 \u0627\u0635\u0648\u0644 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0679\u0631\u06cc\u0641\u06a9 \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0633\u0631\u0648\u0633 \u06a9\u06cc \u0637\u0631\u0641 \u0644\u06d2 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0648 \u067e\u0631\u0648\u0627\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u06a9\u062a\u0646\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0645\u0648\u062c\u0648\u062f \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0645 \u062c\u0648 \u06a9\u0631\u0646\u06d2 \u062c\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u0627\u0633 \u0633\u06d2 \u0627\u0633 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u06c1\u0631 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba <code>LoadBalancer<\/code> \u0627\u06cc\u06a9 \u0633\u0631\u0648\u0633 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u06c1\u0631 PR \u0627\u067e\u0646\u0627 \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u0628\u0644 \u06af\u06be\u0646\u0679\u06d2 \u06a9\u06d2 \u062d\u0633\u0627\u0628 \u0633\u06d2 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u067e\u0646\u0627 IP \u067e\u062a\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0633\u06d2 DNS \u06a9\u0648 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 10 \u067e\u0628\u0644\u06a9 \u067e\u06cc \u0622\u0631 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 10 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631\u0632\u06d4 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0646\u06af\u0631\u06cc\u0633 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c 10 \u0639\u0648\u0627\u0645\u06cc PRs \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 1\u06d4<\/p>\n<p>\u06c1\u06cc\u0644\u0645 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">helm repo add ingress-nginx https:\/\/kubernetes.github.io\/ingress-nginx\nhelm repo update\n\nhelm install ingress-nginx ingress-nginx\/ingress-nginx \n  --namespace ingress-nginx \n  --create-namespace \n  --set controller.service.loadBalancerIP=\"YOUR_STATIC_IP\" \n  --set controller.service.externalTrafficPolicy=Local\n<\/code><\/pre>\n<p>\u062a\u0628\u062f\u06cc\u0644\u06cc <code>YOUR_STATIC_IP<\/code> \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0645\u0631\u062d\u0644\u06c1 12 \u0645\u06cc\u06ba \u067e\u062a\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06c1\u0645 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba\u060c \u0622\u0626\u06cc\u06d2 \u062c\u06be\u0646\u0688\u0648\u06ba \u06a9\u0627 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p><code>--namespace ingress-nginx --create-namespace<\/code>: \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06c1\u06d2\u060c \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0633\u06d2 \u0627\u0644\u06af\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06c1 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u067e\u06be\u0679\u0646\u06d2 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u067e\u06be\u0646\u0633\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p><code>controller.service.loadBalancerIP<\/code>: GKE \u06a9\u0648 \u06c1\u062f\u0627\u06cc\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u067e\u062a\u06c1 \u062a\u0641\u0648\u06cc\u0636 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0622\u067e \u06a9\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u067e\u062a\u06d2 \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u06a9\u0631\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1 \u0644\u0627\u0626\u0646 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u06d2 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688\u0632 \u06a9\u0648 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>controller.service.externalTrafficPolicy=Local<\/code>: \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0627\u0635\u0644 \u0633\u0648\u0631\u0633 \u0622\u0626\u06cc \u067e\u06cc \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c Kubernetes \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0627\u0646\u0679\u0631\u0645\u06cc\u0688\u06cc\u0679 \u0646\u0648\u0688\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0631\u0648\u0679 \u06a9\u0631\u06d2 \u06af\u0627\u060c \u0627\u0648\u0631 \u062c\u0628 \u062f\u0631\u062e\u0648\u0627\u0633\u062a NGINX \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06d2 \u06af\u06cc\u060c \u062a\u0648 \u0633\u0648\u0631\u0633 IP \u06a9\u0648 \u0646\u0648\u0688 \u06a9\u06d2 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0627\u06cc\u0688\u0631\u06cc\u0633 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0631\u0633\u0627\u0626\u06cc \u0644\u0627\u06af\u0632 \u0627\u0635\u0644 \u0648\u0632\u0679\u0631\u0632 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0622\u0626\u06cc \u067e\u06cc \u062f\u06a9\u06be\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0646\u0641\u06cc \u067e\u06c1\u0644\u0648 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0679\u0631\u06cc\u0641\u06a9 \u0635\u0631\u0641 \u0627\u0646 \u0646\u0648\u0688\u0633 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u062f\u0631\u0627\u0635\u0644 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u067e\u0648\u0688 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1\u0627\u06ba \u0679\u06be\u06cc\u06a9 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101551_695_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u06c1\u06cc\u0644\u0645 \u06a9\u06cc \u062a\u0646\u0635\u06cc\u0628 \u0633\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 ingress-nginx \u06a9\u0627 \u0627\u06cc\u06a9 \u0686\u0627\u0631\u0679 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 ingress-nginx \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2768\" height=\"1420\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u062a\u0641\u0648\u06cc\u0636 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc\u0631\u0648\u0646\u06cc IP \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl get service ingress-nginx-controller \n  --namespace ingress-nginx \n  --watch\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 <code><pending\/><\/code> \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06cc\u06c1 \u0627\u06cc\u06a9 \u06cc\u0627 \u062f\u0648 \u0645\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0679\u06cc\u06a9 \u0622\u0626\u06cc \u067e\u06cc \u06a9\u0648 \u0645\u0631\u062d\u0644\u06c1 12 \u0633\u06d2 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u06d2 \u06af\u0627 \u062c\u0628 \u06a9\u06c1 \u06af\u0648\u06af\u0644 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u06cc\u06c1 \u0638\u0627\u06c1\u0631 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648 Ctrl+C \u062f\u0628\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0646\u0627\u0631\u0645\u0644 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl get pods --namespace ingress-nginx\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101552_369_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"kubectl get service \u0627\u0648\u0631 kubectl get pod \u0633\u06d2 \u0622\u0624\u0679 \u067e\u0679 ingress-nginx \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0648 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2 \u062c\u0648 \u0645\u062e\u0635\u0648\u0635 \u0633\u0679\u06cc\u0679\u06a9 \u0628\u06cc\u0631\u0648\u0646\u06cc IP \u062a\u0641\u0648\u06cc\u0636 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2768\" height=\"1420\" loading=\"lazy\" title=\"\"><\/p>\n<h2 id=\"heading-step-14-point-wildcard-dns-at-the-load-balancer\">\u0645\u0631\u062d\u0644\u06c1 14: \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u067e\u0631 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 \u0688\u06cc \u0627\u06cc\u0646 \u0627\u06cc\u0633 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u0633 \u0642\u062f\u0645 \u0645\u06cc\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 2 \u0645\u0646\u0679 \u0644\u06af\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u06cc\u06c1 \u0645\u062c\u0645\u0648\u0639\u06cc \u067e\u06cc\u0679\u0631\u0646 \u0627\u0633\u06a9\u06cc\u0644 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u06c1\u0627\u06ba \u0628\u06be\u06cc \u0622\u067e \u06a9\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 DNS \u06a9\u0627 \u0646\u0638\u0645 \u06c1\u0648 \u0648\u06c1\u0627\u06ba \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u06a9 DNS \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 <strong>\u0631\u06cc\u06a9\u0627\u0631\u0688<\/strong>:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0645\u06cc\u062f\u0627\u0646<\/th>\n<th>\u0642\u062f\u0631<\/th>\n<\/tr>\n<\/thead>\n<tbody wp_automatic_readability=\"2\">\n<tr>\n<td>\u0632\u0645\u0631\u06c1<\/td>\n<td><code>A<\/code><\/td>\n<\/tr>\n<tr>\n<td>\u0646\u0627\u0645\/\u0645\u06cc\u0632\u0628\u0627\u0646<\/td>\n<td><code>*.preview<\/code><\/td>\n<\/tr>\n<tr wp_automatic_readability=\"2\">\n<td>\u0642\u062f\u0631<\/td>\n<td>\u0645\u0631\u062d\u0644\u06c1 1 \u0645\u06cc\u06ba \u062c\u0627\u0645\u062f IP<\/td>\n<\/tr>\n<tr wp_automatic_readability=\"2\">\n<td>\u0679\u06cc \u0679\u06cc \u0627\u06cc\u0644<\/td>\n<td>300 (\u06cc\u0627 \u0633\u067e\u0644\u0627\u0626\u0631 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0642\u0627\u0628\u0644 \u0642\u0628\u0648\u0644 \u0633\u0628 \u0633\u06d2 \u06a9\u0645 \u0642\u06cc\u0645\u062a)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0628\u0633\u06d4 \u06cc\u06c1 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062c\u0645\u0648\u0639\u06cc DNS \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101552_941_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"DNS \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0627\u06cc\u06a9 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2 *. \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u062c\u0648 \u0627\u0646\u062f\u0631\u0627\u062c \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u06a9\u06d2 \u062c\u0627\u0645\u062f IP \u0627\u06cc\u0688\u0631\u06cc\u0633 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"1892\" height=\"1172\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u06cc\u0648\u06ba \u06a9\u0627\u0641\u06cc \u06c1\u06d2\u06d4 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688\u0632 \u0645\u0645\u0627\u062b\u0644 \u06c1\u06cc\u06ba\u06d4 <strong>\u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc<\/strong> \u0627\u0633 \u0645\u0642\u0627\u0645 \u067e\u0631 \u0644\u06cc\u0628\u0644 \u0644\u06af\u0627\u0626\u06cc\u06ba\u06d4 <code>*.preview.yourdomain.com<\/code> \u062d\u0644 <code>pr-1.preview.yourdomain.com<\/code>\u060c <code>pr-42.preview.yourdomain.com<\/code>\u0627\u0648\u0631 <code>pr-99999.preview.yourdomain.com<\/code>\u0648\u06c1 \u0633\u0628 \u0627\u06cc\u06a9 \u06c1\u06cc IP \u0633\u06d2 \u062c\u0691\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0644\u0645\u062d\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0648\u0642\u0641 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06c1\u06d2 \u062c\u0648 \u0633\u0633\u0679\u0645 \u06a9\u0648 \u0633\u0627\u062f\u06c1 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u0627\u0636\u062d \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 PR \u06a9\u06be\u0648\u0644\u0646\u06d2 \u067e\u0631 \u0622\u067e \u06a9\u06cc CI \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0628\u0646\u0627\u0626\u06d2 \u0627\u0648\u0631 PR \u0628\u0646\u062f \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0633\u06d2 \u062d\u0630\u0641 \u06a9\u0631 \u062f\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0646\u0627\u06a9\u0627\u0645\u06cc\u060c \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0644\u06cc\u06a9\u060c \u0627\u0648\u0631 \u0622\u067e \u06a9\u06cc \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u06d2 DNS API \u0627\u0633\u0646\u0627\u062f \u06a9\u06d2 \u06cc\u062a\u06cc\u0645 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0630\u0631\u06cc\u0639\u06c1\u06d4<\/p>\n<p>\u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 \u06a9\u0627 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u067e\u0648\u0631\u06d2 \u06a9\u0627\u0645 \u06a9\u06d2 \u0632\u0645\u0631\u06d2 \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 DNS \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0686\u06be\u0648\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>DNS \u0645\u06cc\u06ba \u062f\u0631\u0633\u062a \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u0637\u0631\u0641 \u0631\u0648\u0679\u0646\u06af \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u0627\u06cc\u06a9 \u06c1\u06cc \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u0627\u0648\u0631 Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>Host<\/code> \u06c1\u0631 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u06c1\u06cc\u0688\u0631\u0632 \u06a9\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u06cc\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06cc \u0633\u0631\u0648\u0633 \u0627\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06d2\u06d4<\/p>\n<p>\u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u067e\u0631\u0648\u067e\u06cc\u06af\u0646\u0688\u06c1 \u06c1\u0648\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">dig +short anything-at-all.preview.yourdomain.com\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u0627 \u062c\u0627\u0645\u062f IP \u0648\u0627\u067e\u0633 \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4 \u0630\u06cc\u0644\u06cc \u0688\u0648\u0645\u06cc\u0646 \u06a9\u0648 \u0627\u0628\u06be\u06cc \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688\u0632 \u06a9\u0627 \u0646\u0642\u0637\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101552_819_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u06a9\u06be\u0648\u062f\u0646\u06d2 \u0633\u06d2 \u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679\u060c \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0630\u06cc\u0644\u06cc \u0688\u0648\u0645\u06cc\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0627\u0645\u062f IP \u0622\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0648\u0627\u067e\u0633\u06cc\u060c \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 \u0631\u06cc\u06a9\u0627\u0631\u0688\u0632 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba\u06d4\" style=\"display: block;\" width=\"1892\" height=\"152\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0627\u06af\u0631 \u06a9\u0686\u06be \u0638\u0627\u06c1\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0686\u0646\u062f \u0645\u0646\u0679 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u06cc\u06ba\u06d4 \u0688\u06cc \u0627\u06cc\u0646 \u0627\u06cc\u0633 \u06a9\u0627 \u067e\u06be\u06cc\u0644\u0627\u0624 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u062a\u06cc\u0632 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0628 TTL \u06a9\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0641\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627\u06d4<\/p>\n<h2 id=\"heading-step-15-install-cert-manager-and-create-a-clusterissuer\">\u0645\u0631\u062d\u0644\u06c1 15: cert-manager \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 ClusterIssuer \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u0627\u0628 HTTPS \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4<\/p>\n<p><strong>\u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631<\/strong> \u0627\u06cc\u06a9 Kubernetes \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u062c\u0648 \u067e\u0648\u0631\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0627\u0631\u06cc \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0634\u0631\u06cc\u062d \u06a9\u0631\u062f\u06c1 Ingress \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u060c \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0627\u062a\u06be\u0627\u0631\u0679\u06cc \u0633\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba\u060c \u0688\u0648\u0645\u06cc\u0646 \u06a9\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644 \u062b\u0627\u0628\u062a \u06a9\u0631\u06cc\u06ba\u060c \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u0648 Kubernetes \u0633\u06cc\u06a9\u0631\u0679 \u0645\u06cc\u06ba \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06cc \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633 \u06a9\u06cc \u062a\u062c\u062f\u06cc\u062f \u06a9\u0631\u06cc\u06ba\u06d4 \u0635\u0628\u062d 3 \u0628\u062c\u06d2 \u06a9\u0648\u0626\u06cc \u06a9\u0631\u0648\u0646 \u062c\u0627\u0628\u0632\u060c \u062f\u0633\u062a\u06cc \u062a\u062c\u062f\u06cc\u062f \u06cc\u0627 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06cc \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">helm repo add jetstack https:\/\/charts.jetstack.io\nhelm repo update\n\nhelm install cert-manager jetstack\/cert-manager \n  --namespace cert-manager \n  --create-namespace \n  --version v1.21.2 \n  --set crds.enabled=true\n<\/code><\/pre>\n<p><code>--set crds.enabled=true<\/code>    cert-manager \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641\u06cc\u06ba \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>Certificate<\/code>\u060c <code>Issuer<\/code>\u060c <code>ClusterIssuer<\/code>\u060c <code>CertificateRequest<\/code> \u0627\u0648\u0631 \u062f\u06cc\u06af\u0631\u06d4 \u06cc\u06c1 \u0646\u0626\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u06a9\u06d2 \u0633\u0627\u062a\u06be Kubernetes API \u06a9\u0648 \u0628\u0691\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u06d2 \u067e\u0627\u0633 \u0646\u06af\u0631\u0627\u0646\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 (\u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>installCRDs=true<\/code>\u0627\u0633 \u062c\u06be\u0646\u0688\u06d2 \u06a9\u0627 \u0646\u0627\u0645 v1.15 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062f\u06cc\u0627 \u06af\u06cc\u0627\u06d4)<\/p>\n<p>\u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl get pods --namespace cert-manager\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0648 \u062a\u06cc\u0646 \u067e\u0648\u0688 \u0646\u0638\u0631 \u0622\u0626\u06cc\u06ba \u06af\u06d2: \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u060c \u0648\u06cc\u0628 \u06c1\u06a9\u060c \u0627\u0648\u0631 \u06a9\u06cc\u0646\u062c\u06cc\u06a9\u0679\u0631\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101552_797_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u06a9\u06cc\u0648\u0628\u06cc\u06a9\u0679\u0644 \u06af\u06cc\u0679 \u067e\u0648\u0688 \u0633\u06d2 \u0622\u0624\u0679 \u067e\u0679 \u0633\u0631\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u060c \u0648\u06cc\u0628 \u06c1\u06a9\u060c \u0627\u0648\u0631 \u06a9\u06cc\u0646\u062c\u06cc\u06a9\u0679\u0631 \u067e\u0648\u0688\u0632 \u06a9\u0648 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"1892\" height=\"264\" loading=\"lazy\" title=\"\"><\/p>\n<h3 id=\"heading-create-the-clusterissuer\">ClusterIssuer \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h3>\n<p>\u0646\u06c1\u06cc\u06ba <strong>\u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627<\/strong> \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06c1\u0627\u06ba \u0633\u06d2 \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u06a9\u0644\u0633\u0679\u0631 \u062c\u0627\u0631\u06cc \u06a9\u0646\u0646\u062f\u06c1<\/strong> \u06cc\u06c1 \u06a9\u0644\u0633\u0679\u0631 \u0648\u0633\u06cc\u0639 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0628\u06be\u06cc \u062f\u0631\u0633\u062a \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u06c1\u0645\u06cc\u06ba \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0648\u0627\u0644\u06d2 \u062c\u0627\u0631\u06cc \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u0648 \u06c1\u0631 \u0627\u06cc\u06a9 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>k8s\/cluster\/letsencrypt-staging.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: cert-manager.io\/v1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-staging\nspec:\n  acme:\n    # Let's Encrypt's staging environment. Certificates from this\n    # server are NOT trusted by browsers, but the rate limits are\n    # far more generous. Use this while debugging.\n    server: https:\/\/acme-staging-v02.api.letsencrypt.org\/directory\n    email: YOUR_EMAIL@example.com\n    privateKeySecretRef:\n      name: letsencrypt-staging-account-key\n    solvers:\n      - http01:\n          ingress:\n            ingressClassName: nginx\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 <code>k8s\/cluster\/letsencrypt-prod.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: cert-manager.io\/v1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-prod\nspec:\n  acme:\n    server: https:\/\/acme-v02.api.letsencrypt.org\/directory\n    email: YOUR_EMAIL@example.com\n    privateKeySecretRef:\n      name: letsencrypt-prod-account-key\n    solvers:\n      - http01:\n          ingress:\n            ingressClassName: nginx\n<\/code><\/pre>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0633\u0628\u06be\u06cc \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">kubectl apply -f k8s\/cluster\/letsencrypt-staging.yaml\nkubectl apply -f k8s\/cluster\/letsencrypt-prod.yaml\n<\/code><\/pre>\n<p>\u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u062a\u06cc\u0627\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl get clusterissuer\n<\/code><\/pre>\n<p>\u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0646\u0638\u0631 \u0622\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 <code>READY: True<\/code>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101553_733_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"kubectl get Clusterissuer \u06a9\u0627 \u0622\u0624\u0679 \u067e\u0679 READY status True \u06a9\u06d2 \u0633\u0627\u062a\u06be letsencrypt-staging \u0627\u0648\u0631 letsencrypt-prod \u062f\u0648\u0646\u0648\u06ba \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"1892\" height=\"342\" loading=\"lazy\" title=\"\"><\/p>\n<h3 id=\"heading-why-two-issuers\">\u06a9\u06cc\u0648\u06ba \u062f\u0648 \u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2\u061f<\/h3>\n<p>\u06cc\u06c1 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u0637\u0631\u062d \u0622\u067e \u0645\u0627\u06cc\u0648\u0633 \u06a9\u0646 \u062f\u0648\u067e\u06c1\u0631 \u0633\u06d2 \u0628\u0686\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0646\u06a9\u0631\u067e\u0679 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u0634\u0631\u062d \u06a9\u06cc \u0633\u062e\u062a \u062d\u062f\u0648\u062f \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2\u06d4 <strong>50 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679\u0633 \u0641\u06cc \u0631\u062c\u0633\u0679\u0631\u0688 \u0688\u0648\u0645\u06cc\u0646 \u0641\u06cc \u06c1\u0641\u062a\u06c1<\/strong>. \u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u0633\u06cc\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u06cc \u06c1\u0641\u062a\u06c1 5 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679\u0633 \u06a9\u06cc \u0627\u06cc\u06a9 \u062d\u062f \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0627\u0686\u06be\u0627 \u0645\u0648\u0642\u0639 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u06d2 \u0648\u0642\u062a \u06a9\u0686\u06be \u063a\u0644\u0637 \u06a9\u0646\u0641\u06cc\u06af\u0631 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u0646\u062f\u0631\u0627\u062c \u06a9\u06cc \u062a\u0634\u0631\u06cc\u062d\u0627\u062a \u063a\u0644\u0637 \u06c1\u06cc\u06ba\u060c HTTP-01 \u0686\u06cc\u0644\u0646\u062c\u0632 \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0631\u0648\u0679 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u06cc\u0627 DNS \u06a9\u0627 \u067e\u0631\u0648\u067e\u06cc\u06af\u0646\u0688\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0646\u0627\u06a9\u0627\u0645 \u06a9\u0648\u0634\u0634 \u0633\u06d2 \u0622\u067e \u06a9\u0627 \u06a9\u0648\u0679\u06c1 \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u062d\u062f \u067e\u0648\u0631\u06cc \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc \u062a\u0648 \u0622\u067e \u06a9\u0627 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0627\u06cc\u06a9 \u06c1\u0641\u062a\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u067e\u06cc\u0644 \u06a9\u06d2 \u0628\u0644\u0627\u06a9 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0648\u06ba \u06a9\u06cc \u067e\u0627\u0628\u0646\u062f\u06cc\u0627\u06ba \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0646\u0631\u0645 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0627 \u0628\u0631\u0627\u0624\u0632\u0631 \u0627\u06cc\u06a9 \u0627\u0646\u062a\u0628\u0627\u06c1 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u06d2 \u06af\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u067e\u0631 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u0645\u0646\u062f \u062c\u0691 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0633\u062a\u062e\u0637 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u0646\u062a\u0628\u0627\u06c1 \u06c1\u06d2\u06d4 <em>\u06cc\u06c1 \u0627\u067e\u0646\u06d2 \u0622\u067e \u0645\u06cc\u06ba \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062b\u0628\u0648\u062a \u06c1\u06d2 \u06a9\u06c1 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4<\/em>. \u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0627\u0646\u062a\u0628\u0627\u06c1 \u0646\u0638\u0631 \u0622\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u06a9\u06c1\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u06a9\u06c1 &quot;\u0686\u0644\u0648 \u0627\u0646\u06a9\u0631\u067e\u0679 \u0633\u0679\u06cc\u062c\u0646\u06af&#8221;\u060c \u0633\u0628 \u06a9\u0686\u06be \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06c1\u06cc \u0642\u062f\u0645 \u0628\u0627\u0642\u06cc \u0631\u06c1 \u06af\u06cc\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062c\u0627\u0631\u06cc \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba <code>letsencrypt-staging<\/code> \u0627\u06af\u0644\u06d2 \u067e\u0631 \u0633\u0648\u0626\u0686 \u06a9\u0631\u06cc\u06ba \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u0628\u06c1\u0627\u0624 \u067e\u0648\u0631\u06cc \u0637\u0631\u062d \u06a9\u0627\u0645 \u0646\u06c1 \u06a9\u0631\u06d2\u06d4 <code>letsencrypt-prod<\/code>.<\/p>\n<h3 id=\"heading-how-the-http-01-challenge-works\">HTTP-01 \u0686\u06cc\u0644\u0646\u062c\u0632 \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h3>\n<p>\u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0686\u06cc\u0632\u06cc\u06ba \u063a\u0644\u0637 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0679\u0648\u0679 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062c\u0628 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>pr-42.preview.yourdomain.com<\/code>\u0622\u0626\u06cc\u06d2 \u0627\u0646\u06a9\u0631\u067e\u0679 \u06a9\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062b\u0628\u0648\u062a \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 HTTP-01 \u0633\u0648\u0644\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u062d\u0633\u0628 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<ol wp_automatic_readability=\"4\">\n<li wp_automatic_readability=\"-1\">\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0646\u06a9\u0631\u067e\u0679 \u0633\u0631\u0679\u06cc\u0641 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u0679\u0648\u06a9\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"2\">\n<p>cert-manager \u0627\u06cc\u06a9 \u0639\u0627\u0631\u0636\u06cc \u067e\u0648\u0688\u060c \u0633\u0631\u0648\u0633\u060c \u0627\u0648\u0631 \u062f\u0627\u062e\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0635\u0648\u0644 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u06c1 \u0679\u0648\u06a9\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>http:\/\/pr-42.preview.yourdomain.com\/.well-known\/acme-challenge\/<token\/><\/code>.<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>\u0622\u0626\u06cc\u06d2 Encrypt \u0639\u0648\u0627\u0645\u06cc \u0627\u0646\u0679\u0631\u0646\u06cc\u0679 \u067e\u0631 \u0627\u0633 URL \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"0\">\n<p>\u0627\u06af\u0631 \u0679\u0648\u06a9\u0646\u0632 \u0645\u0645\u0627\u062b\u0644 \u06c1\u0648\u06ba \u062a\u0648 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644 \u062b\u0627\u0628\u062a \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"-1\">\n<p>\u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u0639\u0627\u0631\u0636\u06cc \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u0648 \u062e\u0641\u06cc\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0627\u0633 \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u062a\u06cc\u0646 \u0686\u06cc\u0632\u0648\u06ba \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1\u0627\u06ba \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0646 \u0686\u06cc\u0632\u06cc\u06ba \u06c1\u06cc\u06ba: DNS \u06a9\u0648 \u0644\u0627\u0632\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0648\u0633\u0679 \u0646\u0627\u0645\u0648\u06ba \u06a9\u0648 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u067e\u0631 \u062d\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u067e\u0648\u0631\u0679 80 \u06a9\u0648 \u0627\u0646\u0679\u0631\u0646\u06cc\u0679 \u0633\u06d2 \u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 (\u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u0633\u0637\u062d \u067e\u0631 HTTPS \u067e\u0631 \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba &#8211; \u06cc\u06c1 \u0633\u0627\u062f\u06c1 HTTP \u06c1\u06d2 \u062c\u0648 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2)\u060c \u0627\u0648\u0631 Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0631\u0648\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h3 id=\"heading-a-note-on-scale\">\u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0646\u0648\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>HTTP-01 \u0641\u06cc \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u0627\u06cc\u06a9 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06c1\u0631 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0627 \u0627\u06cc\u06a9 \u0645\u0646\u0641\u0631\u062f \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0641\u06cc \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06c1\u06d2\u06d4<\/p>\n<p>Let&#8217;s Encrypt \u06a9\u06cc 50 \u0641\u06cc \u06c1\u0641\u062a\u06c1 \u06a9\u06cc \u062d\u062f \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2\u060c \u06cc\u06c1 \u0633\u0648\u0644\u0648 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679\u0633 \u06cc\u0627 \u0686\u06be\u0648\u0679\u06cc \u0679\u06cc\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u06c1\u0641\u062a\u06d2 \u0645\u06cc\u06ba 50 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 PR \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0641\u0639\u0627\u0644 \u0679\u06cc\u0645\u06cc\u06ba \u0627\u067e\u0646\u06cc \u062d\u062f \u06a9\u0648 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc\u06d4<\/p>\n<p>\u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u06c1\u06d2\u06d4 <strong>\u0633\u0646\u06af\u0644 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679<\/strong> \u06a9\u06d2 \u0644\u06cc\u06d2 <code>*.preview.yourdomain.com<\/code> \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688\u0632 HTTP-01 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062c\u0627\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u06d2 \u062c\u0627 \u0633\u06a9\u062a\u06d2\u06d4 \u0648\u06c1 <strong>DNS-01<\/strong> cert-manager \u0641\u0627\u0626\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 TXT \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0628\u0646\u0627 \u06a9\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0648 \u062b\u0627\u0628\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0644\u0627\u0624\u0688 DNS \u0633\u0631\u0679\u06cc\u0641\u06a9 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u0648 \u0622\u067e \u06a9\u06d2 Google \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u0633\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06be\u0631\u060c \u06c1\u0631 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u0631\u0627\u0632 \u06a9\u0648 \u0646\u0642\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u06cc\u0641\u0644\u06cc\u06a9\u0679\u0631 \u062c\u06cc\u0633\u06d2 \u0679\u0648\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u0627\u0633 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u0645\u06cc\u06ba \u0636\u0631\u0648\u0631\u062a \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u062a\u062d\u0631\u06a9 \u062d\u0635\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06af\u0631 PR \u0648\u0627\u0644\u06cc\u0648\u0645 \u0627\u0633 \u06a9\u0627 \u062c\u0648\u0627\u0632 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0635\u062d\u06cc\u062d \u062c\u0648\u0627\u0628 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2 \u06a9\u06c1 \u062d\u062f \u0622\u067e \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-16-add-an-ingress-to-the-base-manifests\">\u0645\u0631\u062d\u0644\u06c1 16: \u0688\u06cc\u0641\u0627\u0644\u0679 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0642\u0628\u0627\u0644\u06cc\u06c1 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u0628 \u06c1\u0645 \u0627\u067e\u0646\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>k8s\/base\/ingress.yaml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: preview-app\n  annotations:\n    # Tells cert-manager to request a certificate for the hosts\n    # listed under spec.tls, using this ClusterIssuer.\n    cert-manager.io\/cluster-issuer: letsencrypt-staging\n    # Redirect HTTP to HTTPS once the certificate exists.\n    nginx.ingress.kubernetes.io\/ssl-redirect: \"true\"\nspec:\n  ingressClassName: nginx\n  tls:\n    - hosts:\n        - preview-host-placeholder\n      secretName: preview-app-tls\n  rules:\n    - host: preview-host-placeholder\n      http:\n        paths:\n          - path: \/\n            pathType: Prefix\n            backend:\n              service:\n                name: preview-app\n                port:\n                  number: 80\n<\/code><\/pre>\n<p>\u0627\u0633\u06d2 \u0627\u06af\u0644\u06cc \u0628\u0627\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>k8s\/base\/kustomization.yaml<\/code>:<\/p>\n<p>\u0622\u067e \u0646\u06d2 \u0627\u0633 \u0641\u0627\u0626\u0644 \u06a9\u0648 \u0645\u0631\u062d\u0644\u06c1 8 \u0645\u06cc\u06ba \u062f\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u0646\u0627\u06cc\u0627\u06d4 Ingress \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\">apiVersion: kustomize.config.k8s.io\/v1beta1\nkind: Kustomization\n\nresources:\n  - deployment.yaml\n  - service.yaml\n  - ingress.yaml\n<\/code><\/pre>\n<p>\u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<p><code>cert-manager.io\/cluster-issuer<\/code>: \u06cc\u06c1 \u0627\u06cc\u06a9 \u062a\u0628\u0635\u0631\u06c1 \u067e\u0648\u0631\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 cert-manager \u0627\u0633\u06d2 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4 <code>spec.tls<\/code>\u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u06a9\u0631\u0648\u06d4 \u06cc\u06c1 \u062d\u0648\u0627\u0644\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0642\u0631\u0631 \u06c1\u06d2\u06d4 <code>letsencrypt-staging<\/code> \u0627\u0628 \u0628\u06c1\u0627\u0624 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06c1\u0645 \u0627\u0633\u06d2 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u062f\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p><code>ingressClassName: nginx<\/code>: \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0633 \u062f\u0627\u062e\u0644\u06d2 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06d2\u06d4 \u0627\u06cc\u06a9 \u06a9\u0644\u0633\u0679\u0631 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0645\u062a\u0639\u062f\u062f \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u0686\u0644\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0641\u06cc\u0644\u0688 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u0691\u0646\u06d2 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u067e\u0686\u06be\u0644\u06d2 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644: <code>kubernetes.io\/ingress.class<\/code> \u06cc\u06c1 \u062a\u0628\u0635\u0631\u06c1 \u0627\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>secretName: preview-app-tls<\/code>: \u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u062c\u0627\u0631\u06cc \u06a9\u0631\u062f\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u0633\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u0628\u0646 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0645\u06cc\u06ba Ingress \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06c1\u0631 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>preview-host-placeholder<\/code>: \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u062f\u0631\u0633\u062a \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062f\u0648 \u0628\u0627\u0631 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2: \u0627\u06cc\u06a9 \u0628\u0627\u0631 <code>spec.tls.hosts<\/code> \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0628\u0627\u0631 <code>spec.rules.host<\/code>\u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0627\u06af\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba PR \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0638\u0627\u06c1\u0631 \u06c1\u06d2\u060c \u06a9\u0648\u0626\u06cc \u0627\u06cc\u0633\u06cc \u0686\u06cc\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u062c\u0648 \u062d\u0642\u06cc\u0642\u06cc \u0688\u0648\u0645\u06cc\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06af\u0631 \u067e\u06cc\u0686 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0679\u06be\u06cc\u06a9 \u0679\u06be\u06cc\u06a9 \u063a\u0644\u0637 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0646\u0638\u0631 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06cc \u063a\u0644\u0637\u06cc \u0645\u0644\u06d2 \u06af\u06cc\u06d4<\/p>\n<p><code>pathType: Prefix<\/code> <strong>\u06a9\u06d2 \u0633\u0627\u062a\u06be<\/strong> <code>path: \/<\/code>: \u0645\u06cc\u0632\u0628\u0627\u0646 \u067e\u0631 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0631\u0627\u0633\u062a\u06d2 \u0633\u06d2 \u0645\u06cc\u0644 \u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0630\u06cc\u0644\u06cc \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u067e\u0648\u0631\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-17-patch-the-hostname-per-pull-request\">\u0645\u0631\u062d\u0644\u06c1 17: \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06a9\u0648 \u067e\u06cc\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06c1\u0631 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u062c\u0633\u06d2 Ingress \u0645\u06cc\u06ba \u062f\u0648\u0646\u0648\u06ba \u0645\u0642\u0627\u0645\u0627\u062a \u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0633\u0679\u0645\u0627\u0626\u0632 \u0627\u0633\u06d2 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2: <strong>JSON 6902 \u067e\u06cc\u0686<\/strong>. \u0639\u06cc\u0646 \u0645\u0637\u0627\u0628\u0642 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0627\u06ba \u062c\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u062f\u0631\u0633\u062a \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0646\u0634\u0627\u0646\u06c1 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0631\u062d\u0644\u06c1 9 \u0645\u06cc\u06ba\u060c \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0646\u06d2 \u0627\u06cc\u06a9 \u0627\u0648\u0648\u0631\u0644\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0648 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0627\u0648\u0631 \u062a\u0635\u0648\u06cc\u0631\u06cc \u0679\u06cc\u06af\u0632 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u062e\u0644\u06cc\u0642 \u0634\u062f\u06c1 \u0627\u0648\u0648\u0631\u0644\u06d2 \u06a9\u0648 \u067e\u06cc\u0686 \u0628\u0644\u0627\u06a9 \u0645\u06cc\u06ba \u067e\u06be\u06cc\u0644\u0627\u0626\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06c1\u06d2 \u062c\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627: <code>kustomization.yaml<\/code> PR 42 \u06a9\u06d2 \u0644\u06cc\u06d2:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: kustomize.config.k8s.io\/v1beta1\nkind: Kustomization\n\nnamespace: pr-42\n\nresources:\n  - ..\/..\/base\n\nimages:\n  - name: preview-app\n    newName: europe-west2-docker.pkg.dev\/your-project\/pr-preview\/preview-app\n    newTag: pr-42-a1b2c3d\n\npatches:\n  - target:\n      kind: Ingress\n      name: preview-app\n    patch: |-\n      - op: replace\n        path: \/spec\/rules\/0\/host\n        value: pr-42.preview.yourdomain.com\n      - op: replace\n        path: \/spec\/tls\/0\/hosts\/0\n        value: pr-42.preview.yourdomain.com\n<\/code><\/pre>\n<p>\u067e\u06cc\u0686 \u0646\u062d\u0648 \u0644\u0641\u0638\u06cc \u0637\u0648\u0631 \u067e\u0631 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2: \u0631\u06cc\u0633\u0648\u0631\u0633 \u0645\u06cc\u0686 \u0645\u06cc\u06ba <code>kind: Ingress, name: preview-app<\/code>\u062f\u0631\u062c \u0630\u06cc\u0644 \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba: <code>\/spec\/rules\/0\/host<\/code>\u0627\u0648\u0631 \u0642\u062f\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>\/spec\/tls\/0\/hosts\/0<\/code>.<\/p>\n<p>\u06a9\u06c1 <code>0<\/code> \u0627\u0646\u0688\u06cc\u06a9\u0633 \u0635\u0641 \u06a9\u06cc \u067e\u0648\u0632\u06cc\u0634\u0646 \u06c1\u06d2\u06d4 <code>\/spec\/rules\/0<\/code> \u06cc\u06c1 \u067e\u06c1\u0644\u0627 (\u0627\u0648\u0631 \u0648\u0627\u062d\u062f) \u0627\u0635\u0648\u0644 \u06c1\u06d2\u06d4 <code>\/spec\/tls\/0\/hosts\/0<\/code> \u067e\u06c1\u0644\u06d2 TLS \u0628\u0644\u0627\u06a9 \u0645\u06cc\u06ba \u067e\u06c1\u0644\u0627 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0628\u0639\u062f \u0645\u06cc\u06ba \u0641\u06cc \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u062f\u0648\u0633\u0631\u0627 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u0627\u0646\u0688\u06cc\u06a9\u0633 \u06a9\u0648 \u0646\u0634\u0627\u0646\u06c1 \u0628\u0646\u0627\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u06a9\u0627\u0645 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 <code>1<\/code>.<\/p>\n<p>JSON 6902 \u067e\u06cc\u0686 \u06a9\u06cc\u0648\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0627\u0646\u0636\u0645\u0627\u0645 \u067e\u06cc\u0686 \u06a9\u06cc\u0648\u06ba \u0646\u06c1\u06cc\u06ba\u061f \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0634\u06cc\u0627\u0621 \u06a9\u06cc \u0635\u0641\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u0679\u0631\u06cc\u0679\u062c\u06a9 \u0627\u0646\u0636\u0645\u0627\u0645 \u0645\u0628\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 Kubernetes \u06a9\u0648 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u0646\u0627 \u06c1\u0648\u06af\u0627 \u06a9\u06c1 \u0622\u06cc\u0627 \u0622\u067e \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 &quot;\u0627\u0633 \u0641\u06c1\u0631\u0633\u062a \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba&#8221; \u06cc\u0627 &quot;\u0645\u0648\u062c\u0648\u062f\u06c1 \u0627\u06cc\u06a9 \u0645\u06cc\u06ba \u0636\u0645 \u06a9\u0631\u06cc\u06ba&#8221; \u0627\u0648\u0631 \u062c\u0648\u0627\u0628 \u06a9\u0627 \u0627\u0646\u062d\u0635\u0627\u0631 \u0641\u06cc \u0641\u06cc\u0644\u0688 \u0636\u0645 \u06a9\u0644\u06cc\u062f \u067e\u0631 \u06c1\u06d2\u06d4 \u06a9\u0633\u06cc \u0627\u06cc\u06a9 \u0642\u062f\u0631 \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u067e\u0648\u0632\u06cc\u0634\u0646 \u067e\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u06cc\u06a9 \u0648\u0627\u0636\u062d \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>op: replace<\/code> \u0622\u067e \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0622\u067e \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0631\u0627\u0633\u062a\u06c1 \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062a\u0648 \u0627\u0648\u0646\u0686\u06cc \u0622\u0648\u0627\u0632 \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0633 \u0641\u0627\u0626\u0644 \u06a9\u0648 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06cc\u06c1 PR \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0627\u0648\u0648\u0631\u0644\u06cc\u0632 \u06a9\u0627 \u0627\u0631\u062a\u06a9\u0627\u0628 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u06cc\u06ba \u0627\u0646 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0645\u0631\u062d\u0644\u06c1 19 \u0645\u06cc\u06ba \u0644\u06a9\u06be\u0648\u06ba \u06af\u0627\u06d4<\/p>\n<h2 id=\"heading-step-18-add-guardrails-with-resourcequota-and-limitrange\">\u0645\u0631\u062d\u0644\u06c1 18: ResourceQuota \u0627\u0648\u0631 LimitRange \u06a9\u06d2 \u0633\u0627\u062a\u06be Guardrail \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u0626\u06cc\u06d2 \u067e\u06cc\u0634 \u0645\u0646\u0638\u0631 \u06a9\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u0648 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u0641\u06cc \u0627\u0644\u062d\u0627\u0644\u060c 32 \u0633\u06cc \u067e\u06cc \u06cc\u0648\u0632 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u06d2\u060c 200 \u0631\u06cc\u067e\u0644\u06cc\u06a9\u0627\u0632 \u062a\u06a9 \u0633\u06a9\u06cc\u0644 \u06a9\u0631\u0646\u06d2\u060c \u06cc\u0627 12 \u0646\u0642\u0644\u06cc\u06ba \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0631\u0648\u06a9\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06a9\u0648\u0626\u06cc \u0686\u06cc\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>LoadBalancer<\/code> \u0633\u0631\u0648\u0633 \u0627\u06cc\u0633\u0627 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0633\u06cc \u06a9\u06d2 \u0628\u0631\u06d2 \u0627\u0631\u0627\u062f\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0646\u0642\u0644 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u0645\u06cc\u06ba \u063a\u0644\u0637 \u0627\u0646\u0636\u0645\u0627\u0645\u060c \u06a9\u0627\u067e\u06cc \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679\u060c \u06cc\u0627 \u0679\u0627\u0626\u067e \u06a9\u06cc \u063a\u0644\u0637\u06cc\u0627\u06ba \u0628\u06be\u06cc \u0627\u062a\u0646\u06cc \u06c1\u06cc \u0645\u0624\u062b\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648 Kubernetes \u0648\u0633\u0627\u0626\u0644 \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0644 \u06a9\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>k8s\/cluster\/namespace-guardrails.yaml<\/code> \u0627\u06cc\u06a9 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: v1\nkind: ResourceQuota\nmetadata:\n  name: preview-quota\nspec:\n  hard:\n    requests.cpu: \"1\"\n    requests.memory: 1Gi\n    limits.cpu: \"2\"\n    limits.memory: 2Gi\n    pods: \"10\"\n    services: \"5\"\n    services.loadbalancers: \"0\"\n    persistentvolumeclaims: \"2\"\n---\napiVersion: v1\nkind: LimitRange\nmetadata:\n  name: preview-limits\nspec:\n  limits:\n    - type: Container\n      # Applied to containers that don't specify their own\n      defaultRequest:\n        cpu: 50m\n        memory: 64Mi\n      default:\n        cpu: 200m\n        memory: 128Mi\n      # Hard ceiling \u2014 a container asking for more is rejected\n      max:\n        cpu: \"1\"\n        memory: 512Mi\n<\/code><\/pre>\n<h3 id=\"heading-what-each-one-does\">\u06c1\u0631 \u0634\u062e\u0635 \u06a9\u06cc\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2<\/h3>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0648\u0633\u0627\u0626\u0644 \u06a9\u0627 \u06a9\u0648\u0679\u06c1<\/strong> \u067e\u0648\u0631\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06d2 \u06a9\u0644 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0648 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u067e\u0648\u0688\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u0648\u0631 \u062d\u062f\u0648\u062f \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u0644 \u0627\u0633 \u062a\u0639\u062f\u0627\u062f \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u0648 \u0633\u06a9\u062a\u0627\u06d4 \u0648\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u062c\u0648 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u06a9\u0648\u0679\u06c1 \u0633\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0645\u0646\u0638\u0648\u0631\u06cc \u06a9\u06d2 \u0648\u0642\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0642\u0631\u0631 \u06a9\u06cc\u06d2 \u062c\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 API \u0633\u0631\u0648\u0631 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631 \u062f\u06d2 \u06af\u06cc\u06d4<\/p>\n<p>\u06a9\u06c1 <code>services.loadbalancers: \"0\"<\/code> \u0644\u0627\u0626\u0646 \u0646\u0645\u0627\u06cc\u0627\u06ba \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u0627 \u0627\u0631\u062a\u06a9\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u0633\u0627\u062e\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0646\u0627\u0645\u0645\u06a9\u0646 \u06c1\u06d2\u06d4 <code>type: LoadBalancer<\/code>. \u06cc\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0645\u0627\u0644\u06cc \u0688\u06be\u0627\u0644 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0646\u0638\u0627\u0645 \u062c\u0648 \u0633\u0628 \u0633\u06d2 \u0645\u06c1\u0646\u06af\u06cc \u063a\u0644\u0637\u06cc \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0648\u06c1 \u0627\u0628 \u0646\u0627\u0642\u0627\u0628\u0644 \u062a\u0644\u0627\u0641\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0645\u062d\u062f\u0648\u062f \u0631\u06cc\u0646\u062c<\/strong> \u06cc\u06c1 \u067e\u0648\u0631\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0646\u0641\u0631\u0627\u062f\u06cc \u06a9\u0646\u0679\u06cc\u0646\u0631\u0632 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0646\u0679\u06cc\u0646\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0642\u062f\u0631\u06cc\u06ba \u0645\u062a\u0639\u06cc\u0646 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u0627\u0648\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0642\u062f\u0631 \u062c\u0633 \u0633\u06d2 \u0627\u06cc\u06a9 \u06a9\u0646\u0679\u06cc\u0646\u0631 \u062a\u062c\u0627\u0648\u0632 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0633\u06a9\u062a\u0627\u06d4<\/p>\n<h3 id=\"heading-why-they-must-be-deployed-together\">\u06a9\u06cc\u0648\u06ba \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u062a\u0639\u06cc\u0646\u0627\u062a\u061f<\/h3>\n<p>\u0648\u0633\u0627\u0626\u0644 \u06a9\u0648\u0679\u0627 \u06a9\u0648 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u0646\u0627 <code>requests.cpu<\/code> \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u060c <strong>\u0627\u0633 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u062a\u0645\u0627\u0645 \u06a9\u0646\u0679\u06cc\u0646\u0631\u0632 \u06a9\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/strong>. \u0627\u06af\u0631 Kubernetes \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u0645\u0639\u0644\u0648\u0645 \u06a9\u06c1 \u0622\u067e \u06a9\u06cc\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06cc\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u06d2 \u06af\u0627 \u06a9\u06c1 \u0622\u06cc\u0627 \u06cc\u06c1 \u06a9\u0648\u0679\u06c1 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0641\u0679 \u0628\u06cc\u0679\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u067e\u0648\u0688 \u06cc\u06a9\u0633\u0631 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 ResourceQuota \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0679\u0648\u0679 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u062c\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0627\u0633\u06d2 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>LimitRange \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06a9\u06d2 \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0646\u0679\u06cc\u0646\u0631\u0632 <code>defaultRequest<\/code> \u0627\u0648\u0631 <code>default<\/code> \u06a9\u0648\u0679\u06c1 \u06a9\u06cc \u0636\u0631\u0648\u0631\u06cc\u0627\u062a \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0627\u0628\u0644 \u0627\u062c\u0627\u0632\u062a \u0627\u0648\u0642\u0627\u062a \u0645\u06cc\u06ba \u0642\u062f\u0631\u0648\u06ba \u06a9\u0648 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06a9\u0648 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u0627 \u0645\u0628\u06c1\u0645 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0648\u06ba \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u06d2 \u06af\u0627\u06d4 \u0627\u06af\u0631 \u0622\u067e \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0645\u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0633\u0633\u0679\u0645 \u067e\u06be\u0631 \u0628\u06be\u06cc \u0646\u0627\u0645\u06a9\u0645\u0644 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06d2 \u06af\u0627\u060c \u062d\u0627\u0644\u0627\u0646\u06a9\u06c1 \u0627\u0646 \u067e\u0631 \u0633\u062e\u062a \u067e\u0627\u0628\u0646\u062f\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-sizing-the-numbers\">\u0646\u0645\u0628\u0631 \u06a9\u0627 \u0633\u0627\u0626\u0632 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627<\/h3>\n<p>\u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u0627\u0642\u062f\u0627\u0631 \u06c1\u0645\u0627\u0631\u06cc \u0637\u0631\u062d \u0686\u06be\u0648\u0679\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u06be\u06cc\u06a9 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u0648 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0646\u0648\u0688 \u06a9\u06cc \u06af\u0646\u062c\u0627\u0626\u0634 \u0633\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u06a9\u0627\u0645 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648 <code>e2-standard-2<\/code> \u0646\u0648\u0688 4 vCPUs \u0627\u0648\u0631 \u06a9\u0644 16 GB \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba\u060c GKE \u0633\u0633\u0679\u0645 \u06a9\u06d2 \u0627\u062c\u0632\u0627\u0621 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u0627 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 15% \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u0626\u06cc\u06d2 \u0627\u0633\u06d2 3.4 \u062f\u0633\u062a\u06cc\u0627\u0628 vCPUs \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u06d2 \u0633\u0627\u062a\u06be <code>requests.cpu: \"1\"<\/code> \u062a\u06cc\u0646 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0641\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0646\u0638\u0631\u06cc\u0627\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u0622\u0628\u0627\u062f \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0645\u0627\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0635\u0631\u0641 50m CPUs \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 3 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0628\u06c1\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0646\u0627\u0633\u0628 \u06c1\u0648\u06af\u0627\u06d4 \u062a\u0627\u06c1\u0645\u060c \u06a9\u0648\u0679\u06c1 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062d\u062f \u06c1\u06d2\u06d4 <em>\u0645\u0626\u06cc<\/em> \u0622\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u067e\u0648\u0686\u06be\u0646\u0627 \u06c1\u0648\u06af\u0627 \u0627\u0648\u0631 \u0627\u0633\u06d2 &quot;\u0627\u06cc\u06a9 PR \u0627\u0646 \u0633\u0628 \u06a9\u0648 \u06a9\u06be\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2&#8221; \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e 10 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u062a\u0648\u0642\u0639 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0641\u06cc \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648\u0679\u06c1 \u06a9\u0648 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u062f\u0633\u0648\u06cc\u06ba \u062d\u0635\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u06cc\u06ba \u06cc\u0627 \u0645\u0632\u06cc\u062f \u0646\u0648\u0688\u0633 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-step-19-update-the-deploy-workflow\">\u0645\u0631\u062d\u0644\u06c1 19: \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06cc\u06c1\u0627\u06ba \u0645\u06a9\u0645\u0644 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 <code>.github\/workflows\/preview-deploy.yml<\/code>\u0627\u0633 \u0633\u06cc\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u062c\u0648 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u0648\u06c1 \u0627\u0633 \u0637\u0631\u062d \u0638\u0627\u06c1\u0631 \u06c1\u0648\u06af\u0627: <code># NEW<\/code>. \u0627\u0633 \u0648\u0631\u0698\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0631\u062d\u0644\u06c1 9 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\">name: Deploy PR Preview\n\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n\nconcurrency:\n  group: preview-${{ github.event.pull_request.number }}\n  cancel-in-progress: true\n\npermissions:\n  contents: read\n  id-token: write\n  pull-requests: write\n\nenv:\n  PROJECT_ID: YOUR_PROJECT_ID\n  REGION: europe-west2\n  CLUSTER_NAME: pr-preview-cluster\n  CLUSTER_ZONE: europe-west2-a\n  REPOSITORY: pr-preview\n  IMAGE_NAME: preview-app\n  # NEW: the base domain for all preview environments\n  PREVIEW_DOMAIN: preview.yourdomain.com\n  # NEW: switch to letsencrypt-prod once the flow is proven\n  CLUSTER_ISSUER: letsencrypt-staging\n\njobs:\n  deploy:\n    name: Build and deploy preview\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Check out code\n        uses: actions\/checkout@v4\n\n      - name: Set environment variables\n        run: |\n          PR_NUMBER=${{ github.event.pull_request.number }}\n          SHORT_SHA=$(echo \"${{ github.event.pull_request.head.sha }}\" | cut -c1-7)\n\n          echo \"PR_NUMBER=${PR_NUMBER}\"    >> $GITHUB_ENV\n          echo \"SHORT_SHA=${SHORT_SHA}\"    >> $GITHUB_ENV\n          echo \"NAMESPACE=pr-${PR_NUMBER}\" >> $GITHUB_ENV\n          echo \"IMAGE_TAG=pr-${PR_NUMBER}-${SHORT_SHA}\" >> $GITHUB_ENV\n          echo \"IMAGE_BASE=${{ env.REGION }}-docker.pkg.dev\/${{ env.PROJECT_ID }}\/${{ env.REPOSITORY }}\/${{ env.IMAGE_NAME }}\" >> $GITHUB_ENV\n          # NEW: the hostname this environment will be reachable at\n          echo \"PREVIEW_HOST=pr-${PR_NUMBER}.${{ env.PREVIEW_DOMAIN }}\" >> $GITHUB_ENV\n\n      - name: Authenticate to Google Cloud\n        uses: google-github-actions\/auth@v2\n        with:\n          workload_identity_provider: ${{ secrets.WIF_PROVIDER }}\n          service_account: ${{ secrets.WIF_SERVICE_ACCOUNT }}\n\n      - name: Set up gcloud\n        uses: google-github-actions\/setup-gcloud@v2\n\n      - name: Configure Docker for Artifact Registry\n        run: gcloud auth configure-docker ${{ env.REGION }}-docker.pkg.dev --quiet\n\n      - name: Build and push image\n        run: |\n          docker build \n            --build-arg PR_NUMBER=\"${PR_NUMBER}\" \n            --build-arg GIT_SHA=\"${SHORT_SHA}\" \n            -t \"${IMAGE_BASE}:${IMAGE_TAG}\" \n            .\/app\n\n          docker push \"${IMAGE_BASE}:${IMAGE_TAG}\"\n\n      - name: Get GKE credentials\n        uses: google-github-actions\/get-gke-credentials@v2\n        with:\n          cluster_name: ${{ env.CLUSTER_NAME }}\n          location: ${{ env.CLUSTER_ZONE }}\n\n      - name: Create namespace\n        run: |\n          kubectl create namespace \"${NAMESPACE}\" \n            --dry-run=client -o yaml | kubectl apply -f -\n\n          # NEW: label it so the reaper knows this namespace is ours\n          kubectl label namespace \"${NAMESPACE}\" \n            app.kubernetes.io\/managed-by=pr-preview \n            preview.pr=\"${PR_NUMBER}\" \n            --overwrite\n\n      # NEW: apply the quota and limits before anything deploys\n      - name: Apply namespace guardrails\n        run: |\n          kubectl apply -f k8s\/cluster\/namespace-guardrails.yaml \n            --namespace=\"${NAMESPACE}\"\n\n      - name: Generate Kustomize overlay\n        run: |\n          mkdir -p k8s\/overlays\/\"${NAMESPACE}\"\n          cat > k8s\/overlays\/\"${NAMESPACE}\"\/kustomization.yaml <<eof apiversion:=\"\" kustomize.config.k8s.io=\"\" kind:=\"\" kustomization=\"\" namespace:=\"\" resources:=\"\" ..=\"\" images:=\"\" name:=\"\" preview-app=\"\" newname:=\"\" newtag:=\"\" patches:=\"\" target:=\"\" ingress=\"\" patch:=\"\" op:=\"\" replace=\"\" path:=\"\" value:=\"\" eof=\"\" echo=\"\" rendered=\"\" manifest=\"\" kubectl=\"\" kustomize=\"\" k8s=\"\" deploy=\"\" run:=\"\" apply=\"\" wait=\"\" for=\"\" rollout=\"\" status=\"\" deployment=\"\" new:=\"\" the=\"\" tls=\"\" certificate=\"\" to=\"\" be=\"\" issued=\"\" continue-on-error:=\"\" true=\"\" show=\"\" details=\"\" url:=\"\" https:=\"\" get=\"\" pods=\"\"\/><\/code><\/pre>\n<p>\u0646\u0626\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u06a9\u0686\u06be \u0686\u06cc\u0632\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u06a9\u06c1<\/strong> <code>~1<\/code> <strong>\u062a\u0628\u0635\u0631\u06c1 \u06a9\u0631\u062f\u06c1 \u067e\u06cc\u0686 \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u0645\u06cc\u06ba:<\/strong> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0679\u0627\u0626\u067e\u0648 \u06a9\u06cc \u0637\u0631\u062d \u0644\u06af \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2.<\/p>\n<pre><code class=\"language-plaintext\">path: \/metadata\/annotations\/cert-manager.io~1cluster-issuer\n<\/code><\/pre>\n<p>JSON \u067e\u0648\u0627\u0626\u0646\u0679\u0631 \u067e\u0627\u062a\u06be \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>\/<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u0644\u06af \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0644\u0641\u0638\u06cc \u0637\u0648\u0631 \u067e\u0631 <code>\/<\/code> \u0622\u067e \u06a9\u0648 \u0686\u0627\u0628\u06cc \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0633\u06d2 \u0641\u0631\u0627\u0631 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0641\u0631\u0627\u0631 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06cc\u06c1 \u06c1\u06d2: <code>~1<\/code>. (\u0627\u0648\u0631 <code>~<\/code> \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0641\u0631\u0627\u0631 <code>~0<\/code>.) \u062a\u0628\u0635\u0631\u06c1 \u06a9\u0644\u06cc\u062f \u06c1\u06d2<code>cert-manager.io\/cluster-issuer<\/code>\u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06c1\u06d2\u06d4 <code>cert-manager.io~1cluster-issuer<\/code>. \u0627\u06af\u0631 \u06cc\u06c1 \u063a\u0644\u0637 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u067e\u06cc\u0686 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0645\u0648\u062c\u0648\u062f \u0631\u0627\u0633\u062a\u06d2 \u06a9\u0648 \u0646\u0634\u0627\u0646\u06c1 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p><strong>\u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0627 \u0644\u06cc\u0628\u0644:<\/strong> \u06a9\u06c1 <code>app.kubernetes.io\/managed-by=pr-preview<\/code> \u0644\u06cc\u0628\u0644\u0632 \u0648\u06c1 \u06c1\u06cc\u06ba \u062c\u0648 \u0631\u06cc\u067e\u0631 \u0644\u06cc\u0648\u0644 21 \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u06a9\u0644\u06cc\u0646 \u0627\u067e \u0622\u067e\u0631\u06cc\u0634\u0646 \u062c\u0648 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0646\u0627\u0645 \u06a9\u06d2 \u067e\u06cc\u0679\u0631\u0646 \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u06d2 \u0627\u06cc\u06a9 \u062e\u0631\u0627\u0628 \u0631\u06cc\u06af\u0648\u0644\u0631 \u0627\u06cc\u06a9\u0633\u067e\u0631\u06cc\u0634\u0646 \u06c1\u06d2 \u062c\u0648 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0627\u06c1\u0645 \u0686\u06cc\u0632 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u06d2 \u0644\u06af\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0644\u06cc\u0628\u0644\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0635\u0631\u0641 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0628\u062f\u062a\u0631\u06cc\u0646 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0628\u06c1\u062a \u06a9\u0645 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06cc \u067e\u0679\u06cc:<\/strong> ResourceQuota \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0628\u0639\u062f \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u067e\u06c1\u0644\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u067e\u0631 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0628\u0686 \u062c\u0627\u0626\u06d2 \u06af\u0627\u060c \u0627\u0648\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u062c\u0628 \u0622\u067e \u063a\u06cc\u0631 \u0646\u0627\u0641\u0630 \u0634\u062f\u06c1 \u062d\u062f \u0633\u06d2 \u062a\u062c\u0627\u0648\u0632 \u06a9\u0631 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p><code>continue-on-error: true<\/code> <strong>\u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/strong> \u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u06d2\u06d4 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u0646\u062d\u0635\u0627\u0631 Let&#8217;s Encrypt \u067e\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u06a9 \u0628\u06cc\u0631\u0648\u0646\u06cc \u0633\u0631\u0648\u0633 \u062c\u0633 \u06a9\u06cc \u0631\u0641\u062a\u0627\u0631 \u06a9\u06cc \u062d\u062f \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u0639\u0636 \u0627\u0648\u0642\u0627\u062a \u0633\u0633\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u062a\u0627\u062e\u06cc\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u0645\u0627\u062d\u0648\u0644 \u0627\u0628 \u0628\u06be\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a \u0631\u06c1\u06d2 \u06af\u0627 \u0627\u0648\u0631 HTTP \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u0631\u06c1\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0644\u06c1\u0630\u0627\u060c \u067e\u0648\u0631\u06d2 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0646\u0627\u06a9\u0627\u0645 \u06a9\u0631\u0646\u0627 \u063a\u0644\u0637 \u06c1\u0648\u06af\u0627\u06d4 \u0645\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba\u06d4 \u0627\u06af\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba PR \u06a9\u06d2 \u062a\u0628\u0635\u0631\u06d2 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0639\u06a9\u0627\u0633\u06cc \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0648\u0627\u0642\u0639\u06cc \u062a\u06cc\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0627\u062d\u0648\u0644 \u0632\u0646\u062f\u06c1 \u06c1\u06d2\u06d4 \u0627\u0628 \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0644\u0648\u06af\u0648\u06ba \u06a9\u0648 \u0628\u062a\u0627\u0646\u06d2 \u06a9\u0627 \u0648\u0642\u062a \u0622\u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u0631\u062d\u0644\u06c1 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0627\u0645 \u06a9\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645 \u067e\u0631 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\">      - name: Comment preview URL on PR\n        uses: actions\/github-script@v7\n        with:\n          script: |\n            const host = process.env.PREVIEW_HOST;\n            const sha = process.env.SHORT_SHA;\n            const ns = process.env.NAMESPACE;\n\n            \/\/ A hidden marker so we can find our own comment later\n            const marker=\"<!-- pr-preview-environment -->\";\n\n            const body = [\n              marker,\n              '### Preview environment is ready',\n              '',\n              `**https:\/\/${host}**`,\n              '',\n              `Commit `${sha}` \u00b7 Namespace `${ns}``,\n              '',\n              '<sub>This environment updates on every push and is deleted when the PR closes.<\/sub>',\n            ].join('n');\n\n            const { data: comments } = await github.rest.issues.listComments({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              issue_number: context.issue.number,\n            });\n\n            const existing = comments.find(c => c.body.includes(marker));\n\n            if (existing) {\n              await github.rest.issues.updateComment({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                comment_id: existing.id,\n                body,\n              });\n            } else {\n              await github.rest.issues.createComment({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                issue_number: context.issue.number,\n                body,\n              });\n            }\n<\/code><\/pre>\n<p>\u062a\u0648 \u06cc\u06c1 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u06cc\u0648\u06ba \u0627\u062e\u062a\u06cc\u0627\u0631 \u06a9\u06cc\u0627\u061f<\/p>\n<p><code>actions\/github-script<\/code>    \u0627\u0633 \u06a9\u06cc \u062f\u06cc\u06a9\u06be \u0628\u06be\u0627\u0644 \u062e\u0648\u062f GitHub \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 Octokit \u06a9\u0644\u0627\u0626\u0646\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u0633\u06cc\u0679 \u0627\u067e \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0641\u0631\u06cc\u0642 \u062b\u0627\u0644\u062b \u06a9\u06d2 \u0627\u0639\u0645\u0627\u0644 \u06c1\u06cc\u06ba \u062c\u0648 \u06a9\u0645 \u0633\u0637\u0631\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be PR \u062a\u0628\u0635\u0631\u06d2 \u067e\u0648\u0633\u0679 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u0641\u0631\u06cc\u0642 \u062b\u0627\u0644\u062b \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0627\u06ba \u062c\u0646 \u0645\u06cc\u06ba \u062a\u062d\u0631\u06cc\u0631\u06cc \u0631\u0633\u0627\u0626\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u0648\u06c1 \u0633\u067e\u0644\u0627\u0626\u06cc \u0686\u06cc\u0646 \u0627\u0646\u062d\u0635\u0627\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0631\u062d\u0644\u06c1 5 \u0645\u06cc\u06ba \u0637\u0648\u06cc\u0644 \u0627\u0644\u0645\u062f\u062a \u0627\u0633\u0646\u0627\u062f \u06a9\u0648 \u06c1\u0679\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06a9\u0648\u0634\u0634\u0648\u06ba \u06a9\u0648 \u0645\u062f\u0646\u0638\u0631 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u0648\u0626\u06d2\u060c \u063a\u06cc\u0631 \u0622\u0688\u06cc\u0679 \u0634\u062f\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627 \u062c\u0648 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0644\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u06cc\u06a9 \u0639\u062c\u06cc\u0628 \u0633\u0648\u062f\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p><strong>\u067e\u0648\u0634\u06cc\u062f\u06c1 \u0645\u0627\u0631\u06a9\u0631 \u062a\u0628\u0635\u0631\u06c1<\/strong> \u06cc\u06c1 \u0648\u06c1 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627\u0631 \u06c1\u06d2 \u062c\u0648 \u0627\u0633\u06d2 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <em>\u0645\u0634\u06a9\u0644<\/em> \u062a\u0628\u0635\u0631\u06c1 <code><!-- pr-preview-environment --><\/code> \u0627\u0633\u06d2 GitHub \u06a9\u06d2 \u0645\u0627\u0631\u06a9 \u0688\u0627\u0648\u0646 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u06cc\u0634 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u06a9\u0645\u0646\u0679 \u0628\u0627\u0688\u06cc \u0645\u06cc\u06ba \u06c1\u06d2\u06d4 \u06c1\u0631 \u062f\u0648\u0691 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06c1\u0645 PR \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644 \u062f\u0631\u062c \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0645\u0627\u0631\u06a9\u0631 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u0622\u0626\u0679\u0645\u0632 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062c\u0628 \u06c1\u0645 \u0627\u0646\u06c1\u06cc\u06ba \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u0646 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c 15 \u06a9\u0645\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 PR \u06a9\u0648 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 15 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0628\u0648\u0679 \u062a\u0628\u0635\u0631\u06d2 \u0645\u0644\u06cc\u06ba \u06af\u06d2 \u0627\u0648\u0631 \u062f\u06be\u0627\u06af\u06c1 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0645\u0628\u0635\u0631\u06cc\u0646 \u0628\u0648\u0679 \u06a9\u06d2 \u062a\u0628\u0635\u0631\u0648\u06ba \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062c\u0633 \u0633\u06d2 \u0645\u0642\u0635\u062f \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u067e \u0679\u0648 \u0688\u06cc\u0679 \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u062a\u0628\u0635\u0631\u06c1 \u0645\u0641\u06cc\u062f \u0679\u0648\u0644 \u0627\u0648\u0631 \u0634\u0648\u0631 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06c1\u06d2\u06d4<\/p>\n<p><code>process.env.PREVIEW_HOST<\/code>: \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0634\u062f\u06c1 \u0642\u06cc\u0645\u062a <code>$GITHUB_ENV<\/code> \u067e\u0686\u06be\u0644\u06d2 \u0645\u0631\u0627\u062d\u0644 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0627\u0633\u06d2 \u0627\u067e\u0646\u06cc \u0627\u0633\u06a9\u0631\u067e\u0679 \u0645\u06cc\u06ba \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u0646\u0679\u0631\u067e\u0648\u0644\u0679\u0646\u06af \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0635\u0627\u0641 \u06c1\u06d2\u06d4 <code>${{ }}<\/code> \u0627\u06af\u0631 \u0642\u062f\u0631 \u0645\u06cc\u06ba \u0627\u0642\u062a\u0628\u0627\u0633\u0627\u062a \u06cc\u0627 \u0628\u06cc\u06a9 \u0679\u0650\u06a9\u0633 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06cc\u06c1 \u062d\u06cc\u0631\u0627\u0646 \u06a9\u0646 \u0637\u0631\u06cc\u0642\u0648\u06ba \u0633\u06d2 \u0679\u0648\u0679 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><code>context.issue.number<\/code>    \u06a9\u0627\u0645 <code>pull_request<\/code> \u0648\u0627\u0642\u0639\u06c1 \u0627\u0633 \u0644\u06cc\u06d2 \u067e\u06cc\u0634 \u0622\u06cc\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 GitHub \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u062e\u0627\u0635 \u0642\u0633\u0645 \u06a9\u06d2 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06c1\u0645 \u06a9\u06cc\u0627 \u06c1\u06d2 <code>issues<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 API \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u0648 PR \u067e\u0631 \u062a\u0628\u0635\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0642\u062f\u0645 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 <code>pull-requests: write<\/code>\u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0627\u0639\u0644\u0627\u0646 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-21-build-the-reaper\">\u0645\u0631\u062d\u0644\u06c1 21: \u0631\u06cc\u067e\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u062d\u0635\u06c1 1 \u0645\u06cc\u06ba \u0633\u0691\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062a\u06a9\u0644\u06cc\u0641 \u062f\u06c1 \u062d\u0642\u06cc\u0642\u062a \u06cc\u06c1 \u06c1\u06d2: \u0628\u0627\u0644\u0622\u062e\u0631\u060c \u0639\u0645\u0644\u062f\u0631\u0622\u0645\u062f \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u0637\u0631\u06cc\u0642\u06d2 \u062f\u0646\u06cc\u0627\u0648\u06cc \u06c1\u06cc\u06ba\u06d4 \u06a9\u0648\u0626\u06cc PR \u06a9\u0648 \u0645\u0627\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u06a9\u06c1 GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u06a9\u0648 \u067e\u0631\u06cc\u0634\u0627\u0646\u06cc \u06c1\u0648 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u0628\u0631\u0627\u0646\u0686 \u0645\u06cc\u06ba \u0627\u0633 \u0637\u0631\u062d \u0627\u06cc\u0688\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0633\u06d2 \u0679\u06cc\u0631 \u0688\u0627\u0624\u0646 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0679\u0648\u0679 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc PR \u0628\u0646\u062f \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0628\u0631\u0627\u0646\u0686 \u06a9\u0648 \u0688\u06cc\u0644\u06cc\u0679 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0630\u062e\u06cc\u0631\u06c1 PR \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u062d\u0641\u0648\u0638 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u06a9\u06be\u0644\u0627 \u06c1\u06d2\u06d4 GitHub \u067e\u0631 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06cc \u062a\u0631\u0633\u06cc\u0644 \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1\u06d4<\/p>\n<p>\u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0639\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0633\u0628 \u0622\u067e \u06a9\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u063a\u06cc\u0631 \u0645\u0639\u06cc\u0646\u06c1 \u0645\u062f\u062a \u062a\u06a9 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u060c \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06cc \u06af\u0646\u062c\u0627\u0626\u0634 \u0627\u0648\u0631 (\u0627\u06af\u0631 \u06a9\u0627\u0641\u06cc \u06c1\u06d2) \u062d\u0642\u06cc\u0642\u06cc \u0631\u0642\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4 \u0627\u06cc\u06a9 \u0635\u0641\u0627\u0626\u06cc \u062c\u0648 95% \u0648\u0642\u062a \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0628 \u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0644\u06cc\u06a9 \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u06be\u06cc\u06a9 \u06c1\u06d2 <strong>\u06a9\u0627\u0679\u0646\u06d2 \u0648\u0627\u0644\u0627<\/strong>: \u0627\u06cc\u06a9 \u0637\u06d2 \u0634\u062f\u06c1 \u06a9\u0627\u0645 \u062c\u0648 \u0648\u0642\u062a\u0627\u064b \u0641\u0648\u0642\u062a\u0627\u064b \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u0627 \u0627\u0646 \u06a9\u0627\u0645\u0648\u06ba \u0633\u06d2 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u0627\u0648\u0631 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0641\u0631\u0642 \u06a9\u0648 \u0631\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>.github\/workflows\/preview-reaper.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">name: Reap Orphaned Preview Environments\n\non:\n  schedule:\n    # 03:00 UTC daily\n    - cron: '0 3 * * *'\n  # Allow manual runs from the Actions tab\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  id-token: write\n  pull-requests: read\n\nenv:\n  PROJECT_ID: YOUR_PROJECT_ID\n  CLUSTER_NAME: pr-preview-cluster\n  CLUSTER_ZONE: europe-west2-a\n  # Delete environments older than this even if the PR is still open\n  MAX_AGE_DAYS: 7\n\njobs:\n  reap:\n    name: Delete orphaned namespaces\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Authenticate to Google Cloud\n        uses: google-github-actions\/auth@v2\n        with:\n          workload_identity_provider: ${{ secrets.WIF_PROVIDER }}\n          service_account: ${{ secrets.WIF_SERVICE_ACCOUNT }}\n\n      - name: Get GKE credentials\n        uses: google-github-actions\/get-gke-credentials@v2\n        with:\n          cluster_name: ${{ env.CLUSTER_NAME }}\n          location: ${{ env.CLUSTER_ZONE }}\n\n      - name: Reap\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          set -euo pipefail\n\n          echo \"Fetching open pull requests...\"\n          OPEN_PRS=$(gh pr list \n            --repo \"${{ github.repository }}\" \n            --state open \n            --limit 500 \n            --json number \n            --jq '.[].number')\n\n          echo \"Open PRs: ${OPEN_PRS:-none}\"\n          echo \"\"\n\n          # Only consider namespaces we created ourselves.\n          NAMESPACES=$(kubectl get namespaces \n            -l app.kubernetes.io\/managed-by=pr-preview \n            -o jsonpath=\"{range .items[*]}{.metadata.name}{\"t\"}{.metadata.labels.preview.pr}{\"t\"}{.metadata.creationTimestamp}{\"n\"}{end}\")\n\n          if [ -z \"${NAMESPACES}\" ]; then\n            echo \"No preview namespaces found. Nothing to do.\"\n            exit 0\n          fi\n\n          NOW=$(date -u +%s)\n          MAX_AGE_SECONDS=$(( MAX_AGE_DAYS * 86400 ))\n          DELETED=0\n\n          while IFS=$'t' read -r NS PR_NUM CREATED; do\n            [ -z \"${NS}\" ] && continue\n\n            CREATED_EPOCH=$(date -u -d \"${CREATED}\" +%s)\n            AGE=$(( NOW - CREATED_EPOCH ))\n            AGE_DAYS=$(( AGE \/ 86400 ))\n\n            REASON=\"\"\n\n            # Rule 1: the PR is no longer open\n            if ! echo \"${OPEN_PRS}\" | grep -qx \"${PR_NUM}\"; then\n              REASON=\"PR #${PR_NUM} is not open\"\n            # Rule 2: the environment has outlived MAX_AGE_DAYS\n            elif [ \"${AGE}\" -gt \"${MAX_AGE_SECONDS}\" ]; then\n              REASON=\"environment is ${AGE_DAYS} days old (max ${MAX_AGE_DAYS})\"\n            fi\n\n            if [ -n \"${REASON}\" ]; then\n              echo \"DELETING ${NS} \u2014 ${REASON}\"\n              kubectl delete namespace \"${NS}\" \n                --ignore-not-found=true \n                --wait=false\n              DELETED=$(( DELETED + 1 ))\n            else\n              echo \"KEEPING  ${NS} \u2014 PR #${PR_NUM} open, ${AGE_DAYS}d old\"\n            fi\n          done <<< \"${NAMESPACES}\"\n\n          echo \"\"\n          echo \"Reaped ${DELETED} namespace(s).\"\n<\/code><\/pre>\n<h3 id=\"heading-where-does-githubtoken-come-from\">\u06a9\u06c1\u0627\u06ba <code>GITHUB_TOKEN<\/code> \u0622\u067e \u0633\u06d2 \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u063a\u06cc\u0631 \u0645\u0633\u0627\u0648\u06cc <code>WIF_PROVIDER<\/code> \u0627\u0648\u0631 <code>WIF_SERVICE_ACCOUNT<\/code>\u0645\u0631\u062d\u0644\u06c1 6 \u0645\u06cc\u06ba \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <code>GITHUB_TOKEN<\/code> <strong>\u06cc\u06c1 \u0648\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0646\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u06c1\u06d2\u06d4<\/strong>. \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u062e\u0641\u06cc\u06c1 \u0635\u0641\u062d\u06c1 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u0645\u0644\u06d2 \u06af\u0627\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u0648 \u0627\u0633\u06d2 \u0648\u06c1\u0627\u06ba \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>GitHub \u06c1\u0631 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u06d2 \u0622\u063a\u0627\u0632 \u067e\u0631 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0627\u0646\u0633\u0679\u0627\u0644\u06cc\u0634\u0646 \u0679\u0648\u06a9\u0646 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>secrets.GITHUB_TOKEN<\/code>\u06a9\u0627\u0645 \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0633\u06d2 \u0645\u0646\u0633\u0648\u062e \u06a9\u0631\u06cc\u06ba\u06d4 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u0648 \u0645\u062e\u0632\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06cc\u0627\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0648 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-understanding-the-reaper\">\u0631\u06cc\u067e\u0631 \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627<\/h3>\n<p>\u0631\u06cc\u067e\u0631 \u06af\u0679 \u06c1\u0628 \u0627\u06cc\u06a9\u0634\u0646\u0632 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0646\u06c1\u06cc\u06ba\u06d4 Kubernetes \u0645\u06cc\u06ba CronJob \u06a9\u0648 \u0639\u0648\u0627\u0645\u06cc PR \u0633\u06d2 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0631\u0627\u0632 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u062f\u06c1 GitHub \u0679\u0648\u06a9\u0646 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0637\u0648\u06cc\u0644 \u0627\u0644\u0645\u062f\u062a \u0627\u0633\u0646\u0627\u062f \u06c1\u06cc\u06ba \u062c\u0648 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u0631\u06c1\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0633 \u0633\u06d2 \u06c1\u0645 \u0646\u06d2 \u0645\u0631\u062d\u0644\u06c1 5 \u0645\u06cc\u06ba \u06af\u0631\u06cc\u0632 \u06a9\u06cc\u0627\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba <code>GITHUB_TOKEN<\/code> (\u0627\u0633\u06a9\u0648\u067e\u0688\u060c \u062e\u0648\u062f\u06a9\u0627\u0631\u060c \u0642\u0644\u06cc\u0644 \u0645\u062f\u062a\u06cc) \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0648\u0631\u06a9 \u0644\u0648\u0688 \u0622\u0626\u06cc\u0688\u06cc\u0646\u0679\u06cc \u0627\u0644\u0627\u0626\u0646\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 GCP \u0633\u06d2 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1\u06d4 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u0631\u0627\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u0628\u0644 \u0633\u0644\u06cc\u06a9\u0679\u0631 \u0627\u06cc\u06a9 \u062d\u0641\u0627\u0638\u062a\u06cc \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627\u0631 \u06c1\u06d2\u06d4 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06cc\u06c1 \u06c1\u06d2\u06d4 <code>-l app.kubernetes.io\/managed-by=pr-preview<\/code>\u06cc\u06c1 \u0627\u0633 \u0637\u0631\u062d \u06a9\u0627 \u0646\u0627\u0645 \u06a9\u0627 \u0646\u0645\u0648\u0646\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2: <code>pr-*<\/code>. \u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0646\u0627\u0645 \u06a9\u0627 \u067e\u06cc\u0679\u0631\u0646 \u0645\u0645\u0627\u062b\u0644 \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0633\u06cc \u06a9\u06d2 \u0646\u0627\u0645 \u0633\u06d2 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0646\u06cc\u0645 \u0627\u0633\u067e\u06cc\u0633 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 <code>pr-routing-service<\/code>. \u0631\u06cc\u067e\u0631 \u0635\u0631\u0641 \u0627\u0646 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0646 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0645\u06cc\u06ba \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0644\u06cc\u0628\u0644 \u0644\u06af\u0627 \u06c1\u0648\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u0626\u0679\u0645\u0632 \u06a9\u0627 \u0648\u06c1 \u0633\u06cc\u0679 \u062c\u0633\u06d2 \u062d\u0630\u0641 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0648\u06c1 \u0622\u0626\u0679\u0645\u0632 \u06a9\u0627 \u0633\u06cc\u0679 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0646\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u0648 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0645\u062d\u062a\u0627\u0637 \u0631\u06c1\u06cc\u06ba\u06d4 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0635\u0641\u0627\u0626\u06cc \u0622\u0679\u0648\u0645\u06cc\u0634\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u062b\u0628\u062a \u0648\u0627\u0626\u0679 \u0644\u0633\u0679 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0633\u06d2 \u0622\u067e \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0628\u06be\u06cc \u0628\u06be\u06cc \u0627\u06cc\u0633\u06d2 \u067e\u06cc\u0679\u0631\u0646 \u067e\u0631 \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0648 \u06a9\u0633\u06cc \u0627\u06cc\u0633\u06cc \u0686\u06cc\u0632 \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u0648 \u062c\u0648 \u0622\u067e \u0646\u06d2 \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0645\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u062f\u0648 \u0627\u0635\u0648\u0644 \u06c1\u06cc\u06ba\u06d4 \u0627\u0635\u0648\u0644 1 \u0627\u0635\u0644 \u06cc\u062a\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u062c\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 PR \u0628\u0646\u062f \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u06a9\u0648\u0626\u06cc \u0633\u0691\u0646\u0627 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u0635\u0648\u0644 2 \u067e\u0631\u0627\u0646\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2\u06d4 PR 3 \u06c1\u0641\u062a\u0648\u06ba \u0633\u06d2 \u06a9\u06be\u0644\u0627 \u06c1\u06d2\u060c 2 \u06c1\u0641\u062a\u0648\u06ba \u0633\u06d2 \u0627\u0686\u06be\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06cc \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u0648 \u062a\u06be\u0627\u0645\u06d2 \u06c1\u0648\u0626\u06d2 \u06c1\u06d2\u06d4 7 \u062f\u0646 \u0627\u06cc\u06a9 \u0645\u0639\u0642\u0648\u0644 \u0688\u06cc\u0641\u0627\u0644\u0679 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0633\u06cc \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u067e\u0646\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u062a\u0648 \u0648\u06c1 \u0635\u0631\u0641 \u06a9\u0645\u0679 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0645\u0646\u0679\u0648\u06ba \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p><code>set -euo pipefail<\/code>: <code>-e<\/code> \u06a9\u0645\u0627\u0646\u0688 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>-u<\/code> \u063a\u06cc\u0631 \u0645\u062a\u0639\u06cc\u0646\u06c1 \u0645\u062a\u063a\u06cc\u0631 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u062e\u0631\u0627\u0628\u06cc \u0627\u0648\u0631 <code>-o pipefail<\/code> \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc \u0627\u06af\u0631: <em>\u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc<\/em> \u0642\u062f\u0645 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0622\u062e\u0631\u06cc \u0642\u062f\u0645 \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u06a9\u0631\u067e\u0679 \u0645\u06cc\u06ba \u062c\u0648 \u06a9\u0633\u06cc \u06a9\u0627\u0645 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062e\u0627\u0645\u0648\u0634 \u0646\u0627\u06a9\u0627\u0645\u06cc \u0628\u062f\u062a\u0631\u06cc\u0646 \u0645\u0645\u06a9\u0646\u06c1 \u0646\u062a\u06cc\u062c\u06c1 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06a9\u0686\u06be \u063a\u0644\u0637 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u0641\u0648\u0631\u0627\u064b \u0631\u06a9 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p><code>grep -qx<\/code>: <code>-x<\/code> \u062c\u06be\u0646\u0688\u0627 \u067e\u0648\u0631\u06cc \u0642\u0637\u0627\u0631 \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 PR <code>4<\/code> \u0639\u0648\u0627\u0645\u06cc PR \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642\u06d4 <code>42<\/code> \u0627\u0648\u0631 \u0631\u06cc\u067e\u0631 \u0627\u067e\u0646\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u06cc\u062a\u06cc\u0645 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u06cc\u06ba \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u06be\u0648\u0691 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u062c\u06be\u0646\u0688\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0628\u06af \u06c1\u06d2\u06d4<\/p>\n<p><code>workflow_dispatch<\/code>    \u0622\u067e \u0679\u0627\u0633\u06a9\u0633 \u0679\u06cc\u0628 \u0633\u06d2 Ripper \u06a9\u0648 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0686\u0646\u062f \u0628\u0627\u0631 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0634\u06cc\u0688\u0648\u0644 \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0622\u0624\u0679 \u067e\u0679 \u067e\u0691\u06be\u06cc\u06ba\u06d4 \u0644\u0627\u06af \u067e\u0631\u0646\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 <code>KEEPING<\/code> \u06cc\u0627 <code>DELETING<\/code> \u0686\u0648\u0646\u06a9\u06c1 \u06c1\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06cc \u0627\u06cc\u06a9 \u0648\u062c\u06c1 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u0645\u0646\u0637\u0642 \u0622\u067e \u06a9\u06cc \u062a\u0648\u0642\u0639\u0627\u062a \u0633\u06d2 \u0645\u06cc\u0644 \u06a9\u06be\u0627\u062a\u06cc \u06c1\u06d2 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0628\u063a\u06cc\u0631 \u062a\u0648\u062c\u06c1 \u06a9\u06d2 \u0686\u0644 \u0633\u06a9\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-22-test-the-whole-thing\">\u0645\u0631\u062d\u0644\u06c1 22: \u0645\u06a9\u0645\u0644 \u062c\u0627\u0646\u0686<\/h2>\n<p>\u0639\u06c1\u062f \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">git add .\ngit commit -m \"Add Ingress, TLS, PR comments, guardrails, and reaper\"\ngit push\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0628\u0631\u0627\u0646\u0686 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0642\u0627\u0628\u0644 \u0630\u06a9\u0631 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06be\u0648\u0644\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">git checkout -b test-preview-urls\n# edit app\/main.go \u2014 change the greeting text\ngit add .\ngit commit -m \"Test preview URLs\"\ngit push -u origin test-preview-urls\n<\/code><\/pre>\n<p>PR \u06a9\u06be\u0648\u0644\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u06a9\u0634\u0646 \u0679\u06cc\u0628 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101553_511_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0646\u0626\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0627\u0648\u0631 \u062a\u0641\u0635\u06cc\u0644 \u06a9\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2366\" height=\"1434\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0622\u067e \u06a9\u0627 \u0628\u0648\u0679 \u062a\u0628\u0635\u0631\u06c1 URL \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0638\u0627\u06c1\u0631 \u06c1\u0648\u06af\u0627\u06d4 \u0627\u0633\u06d2 \u06a9\u06be\u0648\u0644\u0648\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101553_80_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u0628\u0648\u0679 \u062a\u0628\u0635\u0631\u06c1 \u0646\u06cc\u0627 URL \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2366\" height=\"1434\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u0628 \u0628\u06be\u06cc \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u062c\u0627\u0631\u06cc \u06a9\u0646\u0646\u062f\u06c1 \u067e\u0631 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06cc \u0648\u0627\u0631\u0646\u0646\u06af \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u06cc\u06d4 \"\u0622\u0626\u06cc\u06d2 \u0627\u0646\u06a9\u0631\u067e\u0679 \u0633\u0679\u06cc\u062c\u0646\u06af\" \u06a9\u0686\u06be \u0627\u06cc\u0633\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u06d2 \"\u0622\u067e \u06a9\u0627 \u06a9\u0646\u06a9\u0634\u0646 \u0646\u062c\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\" \u067e\u0628\u0644\u0634\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u06d4<\/p>\n<p><strong>\u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u0634\u0631\u0637 \u06c1\u06d2\u06d4<\/strong> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 DNS \u062d\u0644 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u0648 \u0631\u0648\u0679 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c Ingress \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u06d2\u060c HTTP-01 \u0686\u06cc\u0644\u0646\u062c \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0633\u0628 \u06a9\u0686\u06be \u06a9\u0627\u0645 \u06a9\u0631 \u06af\u06cc\u0627\u06d4 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u0645\u0646\u062f \u062c\u0627\u0646\u0686 \u0627\u06cc\u062c\u0646\u0633\u06cc \u0633\u06d2 \u0622\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101553_351_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06d2 URL \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u0648\u0627\u0631\u0646\u0646\u06af \u06cc\u06c1 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 Let&#039;s Encrypt Staging \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062c\u0627\u0631\u06cc \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u060c \u062c\u0648 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0627\u062a\u06be\u0627\u0631\u0679\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2366\" height=\"1434\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0627\u06cc\u0688\u0648\u0627\u0646\u0633\u0688 \u067e\u0631 \u06a9\u0644\u06a9 \u06a9\u0631\u06cc\u06ba\u060c \u0648\u0627\u0631\u0646\u0646\u06af \u067e\u0627\u0633 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062f\u0631\u0633\u062a PR \u0646\u0645\u0628\u0631 \u0627\u0648\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101554_692_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u062c\u0648 \u0622\u067e \u06a9\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u0644\u0648\u0688 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0622\u0624\u0679 \u067e\u0679 \u0635\u062d\u06cc\u062d PR \u0646\u0645\u0628\u0631\u060c \u06a9\u0645\u0679 SHA\u060c \u0627\u0648\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2366\" height=\"954\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0633\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl get certificate --namespace=pr-2 \n#Ensure you use your own pr-number\n<\/code><\/pre>\n<p>\u0622\u067e \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba <code>READY: True<\/code>. \u067e\u06be\u0631 <code>False<\/code>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl describe certificate preview-app-tls --namespace=pr-2\nkubectl get challenges --all-namespaces\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101554_55_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0633\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4\" style=\"display: block;\" width=\"2366\" height=\"1208\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0632\u06cc\u0631 \u0627\u0644\u062a\u0648\u0627 \u0645\u0633\u0627\u0626\u0644 \u062c\u0648 \u062d\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0646 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u0645\u06cc\u0634\u06c1 \u0645\u0645\u06a9\u0646\u06c1 DNS \u06cc\u0627 \u067e\u0648\u0631\u0679 80 \u06a9\u0646\u06cc\u06a9\u0679\u0648\u0679\u06cc \u06c1\u06d2\u06d4 \u0627\u06af\u0644\u0627 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">curl -I http:\/\/pr-2.preview.yourdomain.com\/.well-known\/acme-challenge\/test\n<\/code><\/pre>\n<p>\u0645\u06cc\u06ba NGINX \u0633\u06d2 HTTP \u062c\u0648\u0627\u0628 \u0686\u0627\u06c1\u062a\u0627 \u06c1\u0648\u06ba\u06d4 404 \u0679\u06be\u06cc\u06a9 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u062b\u0627\u0628\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0631\u0648\u0679\u0646\u06af \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u0646\u06a9\u0634\u0646 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0644\u0633\u0679\u0631 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0646\u0686\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101554_720_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"DNS \u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4\" style=\"display: block;\" width=\"2366\" height=\"358\" loading=\"lazy\" title=\"\"><\/p>\n<h3 id=\"heading-switch-to-production-certificates\">\u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u067e\u0631 \u0633\u0648\u0626\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u06a9\u06cc \u062a\u06cc\u0627\u0631\u06cc \u06a9\u0627 \u0628\u06c1\u0627\u0624 \u0634\u0631\u0648\u0639 \u0633\u06d2 \u062e\u062a\u0645 \u062a\u06a9 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u06cc \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>env:<\/code> \u0628\u0644\u0627\u06a9:<\/p>\n<pre><code class=\"language-yaml\">  CLUSTER_ISSUER: letsencrypt-prod\n<\/code><\/pre>\n<p>\u0627\u0633\u06d2 \u0627\u0633 \u0637\u0631\u062d \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba: <strong>\u0645\u0648\u062c\u0648\u062f\u06c1 PR \u0628\u0631\u0627\u0646\u0686 \u0645\u06cc\u06ba<\/strong> \u0627\u0648\u0631 \u0627\u0633\u06d2 \u062f\u06be\u06a9\u0627 \u062f\u06cc\u06ba\u06d4 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u0646\u06d2 \u06cc\u0627 \u0636\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>main<\/code> \u067e\u06c1\u0644\u06d2 \u0622\u067e \u06cc\u06c1 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 main.go \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u067e\u06cc\u063a\u0627\u0645 \u06a9\u0648 \u0628\u06be\u06cc \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u0633\u0628 \u06a9\u0686\u06be \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>PR \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0639\u06c1\u062f \u06a9\u0631\u06cc\u06ba\u06d4 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u0627\u0635\u0644 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06d2 \u06af\u0627\u060c \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u0631 \u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062a\u0627\u0644\u0627 \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0633\u06d2 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u06be\u0648\u0644\u06cc\u06ba: <strong>\u0646\u062c\u06cc \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646 \u067e\u06cc\u0646<\/strong> \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0646\u06d2 \u0627\u0633 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u06a9\u06cc\u0634 \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0622\u067e \u06a9\u0627 \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0679\u06cc\u0628 \u0628\u0638\u0627\u06c1\u0631 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0635\u0641\u062d\u06c1 \u062f\u06a9\u06be\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062d\u0642\u06cc\u0642\u062a \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06cc\u0627\u062f \u06a9\u0631\u062f\u06c1 \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0688 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0628 \u0628\u06be\u06cc \u0638\u0627\u06c1\u0631 \u06c1\u06d2\u06d4 <code>not secure<\/code>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101555_492_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062a\u062c\u0631\u0628\u06c1 HTTPS \u067e\u0631 \u0627\u06cc\u06a9 \u062f\u0631\u0633\u062a \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u06be\u0631\u0627 \u06c1\u0648\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"1046\" height=\"758\" loading=\"lazy\" title=\"\"><\/p>\n<h3 id=\"heading-verify-the-guardrails\">\u0686\u0648\u06a9\u06cc\u0648\u06ba \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u06a9\u0648\u0679\u06c1 \u0641\u0639\u0627\u0644 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl describe resourcequota preview-quota --namespace=pr-2\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101555_133_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"kubectl \u06a9\u0627 \u0622\u0624\u0679 \u067e\u0679 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u06a9\u0648\u0679\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 pr-1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u0648\u0679\u06c1 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0634\u062f\u06c1 \u0641\u06c1\u0631\u0633\u062a \u0627\u0648\u0631 CPU\u060c \u0645\u06cc\u0645\u0648\u0631\u06cc\u060c \u067e\u0648\u0688\u0632\u060c \u0633\u0631\u0648\u0633\u0632\u060c \u0627\u0648\u0631 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u062e\u062a \u062d\u062f\u0648\u062f\u06d4\" style=\"display: block;\" width=\"1820\" height=\"532\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u06c1\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc \u062d\u062f\u06cc\u06ba \u0627\u0648\u0631 \u0633\u062e\u062a \u062d\u062f\u0648\u062f \u0638\u0627\u06c1\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u0627\u0633\u06d2 \u062a\u0648\u0691\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl scale deployment\/preview-app --replicas=50 --namespace=pr-2\nkubectl get events --namespace=pr-2 | grep -i quota\n<\/code><\/pre>\n<p>\u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u062f\u0631\u0645\u06cc\u0627\u0646\u06cc \u0631\u0627\u0633\u062a\u06d2 \u067e\u0631 \u0628\u0691\u06be \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u06cc\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0631\u06a9 \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u06cc\u06c1 \u0648\u0636\u0627\u062d\u062a \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0679\u06c1 \u062e\u062a\u0645 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0686\u0648\u06a9\u06cc\u062f\u0627\u0631 \u06c1\u06d2 \u062c\u0648 \u0627\u067e\u0646\u0627 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u062d\u062f\u0648\u062f \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u0627\u0642\u06cc \u06a9\u0644\u0633\u0679\u0631 \u0645\u062a\u0627\u062b\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101555_149_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u0679\u0631\u0645\u06cc\u0646\u0644 \u0622\u0624\u0679 \u067e\u0679 \u0635\u0631\u0641 \u062c\u0632\u0648\u06cc \u0637\u0648\u0631 \u067e\u0631 50 replicas \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u06a9 Kubernetes \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06cc\u06c1 \u0627\u0637\u0644\u0627\u0639 \u062f\u06cc \u06af\u0626\u06cc \u06c1\u06d2 \u06a9\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648\u0679\u06c1 \u0633\u06d2 \u062a\u062c\u0627\u0648\u0632 \u06a9\u0631 \u06af\u0626\u06cc \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2728\" height=\"854\" loading=\"lazy\" title=\"\"><\/p>\n<h3 id=\"heading-verify-teardown-and-the-reaper\">\u0679\u06cc\u0626\u0631 \u0688\u0627\u0624\u0646 \u0627\u0648\u0631 \u0631\u06cc\u067e\u0631 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba\u06d4 \u06af\u0644\u0646\u06d2 \u06a9\u0627 \u06a9\u0627\u0645 \u06a9\u0627 \u0628\u06c1\u0627\u0624 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u0646\u062a\u0642\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06d2: <code>Terminating<\/code>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101555_398_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"Github \u0627\u06cc\u06a9\u0634\u0646\u0632 \u0679\u06cc\u0631 \u0688\u0627\u0648\u0646 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0679\u0627\u0633\u06a9 \u0645\u06a9\u0645\u0644 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2342\" height=\"1434\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u067e\u06be\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u0631\u06cc\u067e\u0631 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u06cc\u06ba\u06d4 <em>\u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2<\/em> \u0627\u0646\u06c1\u06cc\u06ba \u0628\u063a\u06cc\u0631 \u0644\u06cc\u0628\u0644 \u06a9\u06d2 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u0648 \u0679\u0686 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl create namespace pr-9999\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101556_499_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"kubectl \u0679\u0631\u0645\u06cc\u0646\u0644 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 pr-9999 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2 (\u067e\u06cc \u0622\u0631-\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u0644\u06cc\u0628\u0644 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0628\u0646\u0627\u0646\u0627)\" style=\"display: block;\" width=\"2342\" height=\"140\" loading=\"lazy\" title=\"\"><\/p>\n<p>Tasks \u06a9\u06d2 \u0679\u06cc\u0628 \u0633\u06d2 Ripper \u06a9\u0648 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101556_665_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0627\u06cc\u06a9 Reap Orphaned Preview Environments \u06a9\u0627 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u06cc\u06af\u0632\u06cc\u06a9\u06cc\u0648\u0634\u0646 \u0628\u0679\u0646 \u06c1\u06d2 \u062c\u0648 workflow_dispatch \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4\" style=\"display: block;\" width=\"2402\" height=\"1196\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 <code>pr-9999<\/code> \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>app.kubernetes.io\/managed-by=pr-preview<\/code> \u0628\u0631\u0627\u0646\u0688 \u0644\u0627\u06af \u0645\u06cc\u06ba \u0628\u06be\u06cc \u0627\u0633 \u06a9\u0627 \u0630\u06a9\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/10\/1792101556_18_GitHub-\u0627\u06cc\u06a9\u0634\u0646\u0632\u060c-\u0627\u0646\u06af\u0631\u06cc\u0633\u060c-\u0627\u0648\u0631-\u062e\u0648\u062f\u06a9\u0627\u0631-TLS-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2.png\" alt=\"\u0631\u06cc\u067e\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 GitHub \u0627\u06cc\u06a9\u0634\u0646 \u0644\u0627\u06af \u06cc\u06c1 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u0646\u06c1\u06cc\u06ba \u0645\u0644\u062a\u06cc \u06c1\u06d2\u060c \u0628\u063a\u06cc\u0631 \u0644\u06cc\u0628\u0644 \u0648\u0627\u0644\u06d2 pr-9999 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2\" style=\"display: block;\" width=\"2402\" height=\"1196\" loading=\"lazy\" title=\"\"><\/p>\n<p>\u0627\u0633\u06d2 \u062e\u0648\u062f \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">kubectl delete namespace pr-9999\n<\/code><\/pre>\n<p>\u0679\u06cc\u0633\u0679 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u06c1\u06d2 \u062c\u062a\u0646\u0627 \u06a9\u06c1 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u06cc\u06ba \u0646\u06d2 \u0627\u0628\u06be\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0622\u0679\u0648 \u0688\u06cc\u0644\u06cc\u0679 \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u06a9\u0648 \u0686\u06be\u0648 \u0646\u06c1\u06cc\u06ba \u0633\u06a9\u062a\u0627 \u062c\u0648 \u0627\u0633 \u0646\u06d2 \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-what-this-costs\">\u0627\u0633 \u06a9\u06cc \u0642\u06cc\u0645\u062a \u06a9\u062a\u0646\u06cc \u06c1\u06d2\u061f<\/h2>\n<p>\u0644\u0627\u06af\u062a \u06a9\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0627\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06d2 \u0644\u0626\u06d2 \u0646\u0635\u0641 \u062f\u0644\u06cc\u0644 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0645\u062e\u0635\u0648\u0635 \u0631\u06c1\u06cc\u06ba.<\/p>\n<p>\u0645\u0633\u0644\u0633\u0644 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 <code>europe-west2<\/code>\u06cc\u06c1\u0627\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0645\u0627\u06c1\u0627\u0646\u06c1 \u0627\u0639\u062f\u0627\u062f \u0648 \u0634\u0645\u0627\u0631 \u06c1\u06cc\u06ba:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0639\u0646\u0635\u0631<\/th>\n<th>\u062a\u062e\u0645\u06cc\u0646\u06c1 \u0644\u0627\u06af\u062a<\/th>\n<\/tr>\n<\/thead>\n<tbody wp_automatic_readability=\"5.5\">\n<tr wp_automatic_readability=\"3\">\n<td>GKE \u06a9\u0646\u0679\u0631\u0648\u0644 \u06c1\u0648\u0627\u0626\u06cc \u062c\u06c1\u0627\u0632<\/td>\n<td>~$74\/\u0645\u06c1\u06cc\u0646\u06c1 (\u0627\u06cc\u06a9 \u0632\u0648\u0646 \u06a9\u0644\u0633\u0679\u0631\u060c \u06a9\u0686\u06be \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u067e\u0631 \u0627\u06cc\u06a9 \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u0645\u0641\u062a \u062f\u0631\u062c\u06d2 \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06c1\u0648\u062a\u0627 \u06c1\u06d2)<\/td>\n<\/tr>\n<tr>\n<td>2 \u00d7 <code>e2-standard-2<\/code> \u0646\u0648\u0688<\/td>\n<td>~$97\/\u0645\u06c1\u06cc\u0646\u06c1<\/td>\n<\/tr>\n<tr wp_automatic_readability=\"2\">\n<td>\u0639\u0644\u0627\u0642\u0627\u0626\u06cc \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631<\/td>\n<td>~$18\/\u0645\u0627\u06c1 + \u0688\u06cc\u0679\u0627 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af<\/td>\n<\/tr>\n<tr>\n<td>\u062c\u0627\u0645\u062f IP (\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0645\u06cc\u06ba)<\/td>\n<td>\u0645\u0646\u0633\u0644\u06a9 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0645\u0641\u062a<\/td>\n<\/tr>\n<tr wp_automatic_readability=\"2\">\n<td>\u0622\u0631\u0679\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u0630\u062e\u06cc\u0631\u06c1<\/td>\n<td>~$0.10\/GB\/\u0645\u06c1\u06cc\u0646\u06c1<\/td>\n<\/tr>\n<tr wp_automatic_readability=\"2\">\n<td>\u0622\u0626\u06cc\u06d2 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u0648 \u062e\u0641\u06cc\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/td>\n<td>\u0645\u0641\u062a<\/td>\n<\/tr>\n<tr wp_automatic_readability=\"2\">\n<td>GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 (\u0639\u0648\u0627\u0645\u06cc \u0630\u062e\u06cc\u0631\u06c1)<\/td>\n<td>\u0645\u0641\u062a<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0645\u06cc\u06ba \u06cc\u06c1 \u06a9\u06c1\u0648\u06ba \u06af\u0627 \u06a9\u06c1 \u06c1\u0631 \u0645\u0627\u06c1 \u062c\u0627\u0631\u06cc \u0631\u06c1\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b $190 \u0641\u06cc \u0645\u06c1\u06cc\u0646\u06c1 \u06c1\u06d2\u060c \u0642\u0637\u0639 \u0646\u0638\u0631 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u062a\u0646\u06d2 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0686\u0644\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0648\u0646 \u0633\u06d2 \u0646\u0645\u0628\u0631 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u061f <em>\u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba<\/em> \u067e\u06cc \u0622\u0631 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u067e\u0631 \u0645\u0628\u0646\u06cc \u062a\u0631\u0627\u0632\u0648\u06d4 \u0627\u06cc\u06a9 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u0646\u062f \u0645\u0641\u062a \u06c1\u06d2\u06d4 11 \u0648\u06cc\u06ba \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc \u0642\u06cc\u0645\u062a \u067e\u0648\u0688 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0646\u0648\u0688 \u06a9\u06cc \u06af\u0646\u062c\u0627\u0626\u0634 \u06c1\u06d2 (\u0627\u0633 \u0633\u0627\u0626\u0632 \u06a9\u06d2 \u0627\u0637\u0644\u0627\u0642 \u06a9\u06d2 \u0644\u0626\u06d2 \u0631\u0648\u0632\u0627\u0646\u06c1 \u0686\u0646\u062f \u067e\u06cc\u0646\u0633)\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0628\u0648\u0644\u06cc \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0633\u06d2 \u0627\u0633 \u06a9\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 <code>LoadBalancer<\/code> \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u062e\u062f\u0645\u0627\u062a: \u0627\u06af\u0631 \u0622\u067e 10 \u067e\u0628\u0644\u06a9 \u067e\u06cc \u0622\u0631\u0632 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0635\u0631\u0641 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u06c1\u0631 \u0645\u0627\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b $180 \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0631\u06d2 \u06af\u0627\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0627\u0633\u06d2 \u0635\u0627\u0641 \u06a9\u0631\u0646\u0627 \u0628\u06be\u0648\u0644 \u062c\u0627\u0626\u06d2\u06d4 \u06a9\u06c1 <code>services.loadbalancers: \"0\"<\/code> ResourceQuota \u0645\u06cc\u06ba \u0644\u0627\u0626\u0646 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u0633\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0648 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e \u06a9\u06d2 \u0630\u0627\u062a\u06cc \u0645\u0646\u0635\u0648\u0628\u0648\u06ba \u067e\u0631 \u067e\u06cc\u0633\u06c1 \u0628\u0686\u0627\u0646\u06d2 \u06a9\u06d2 \u062f\u0648 \u0637\u0631\u06cc\u0642\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba <strong>\u0633\u067e\u0627\u0679 \u0646\u0648\u0688<\/strong>\u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba <code>spot = true<\/code> \u06a9\u0648 <code>node_config<\/code> \u0679\u06cc\u0631\u0627\u0641\u0627\u0631\u0645 \u0645\u06cc\u06ba \u0646\u0648\u0688 \u0679\u0627\u0626\u0645 \u06a9\u0648 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 60-70% \u06a9\u06cc \u0686\u06be\u0648\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0627\u06cc\u06a9 \u0645\u062b\u0627\u0644\u06cc \u062c\u06af\u06c1 \u06a9\u0627\u0645 \u06a9\u0627 \u0628\u0648\u062c\u06be \u06c1\u06d2\u06d4 \u062c\u0628 \u0627\u06cc\u06a9 \u0646\u0648\u0688 \u06a9\u0627 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062f\u0639\u0648\u06cc \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u067e\u0648\u0688 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u0627\u0648\u0631\u060c \u0628\u062f\u062a\u0631\u06cc\u0646 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba\u060c \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0645\u062e\u062a\u0635\u0631 \u0637\u0648\u0631 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u06cc\u0627\u060c \u0686\u0648\u0646\u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0635\u0628\u062d 3 \u0628\u062c\u06d2 PRs \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06d2 \u0631\u06c1\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u0646\u0648\u0688 \u067e\u0648\u0644 \u06a9\u0648 \u0631\u0627\u062a\u0648\u06ba \u0631\u0627\u062a \u0635\u0641\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0637\u06d2 \u0634\u062f\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-cleanup\">\u0635\u0641\u0627\u0626\u06cc<\/h2>\n<p>\u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f:<\/p>\n<pre><code class=\"language-bash\"># Delete every preview namespace\nkubectl delete namespaces -l app.kubernetes.io\/managed-by=pr-preview\n\n# Remove the shared infrastructure\nhelm uninstall cert-manager --namespace cert-manager\nhelm uninstall ingress-nginx --namespace ingress-nginx\nkubectl delete namespace cert-manager ingress-nginx\n<\/code><\/pre>\n<p>\u06c1\u06cc\u0644\u0645 \u0631\u06cc\u0644\u06cc\u0632 \u06a9\u0648 \u06c1\u0679\u0627 \u062f\u06cc\u06ba\u06d4 <em>\u067e\u06c1\u0644\u06d2<\/em> \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 <code>terraform destroy<\/code>. Ingress \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u06a9\u06cc \u0633\u0631\u0648\u0633 \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u06a9\u06cc \u0645\u0627\u0644\u06a9 \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba Terraform \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627\u06d4 \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 Kubernetes \u0646\u06d2 \u0627\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627\u060c Terraform \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u062a\u0628\u0627\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0633 \u06a9\u0627 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633 \u0627\u0644\u06af \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0622\u067e \u06a9\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0633\u06d2 \u06a9\u0633\u06cc \u0627\u0648\u0631 \u0686\u06cc\u0632 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0686\u0627\u0631\u062c \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-if-you-plan-to-rebuild-this-later\">\u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u0627 \u0627\u0631\u0627\u062f\u06c1 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h3>\n<p><strong>\u067e\u0648\u0631\u06cc \u0646\u06c1 \u0628\u06be\u0627\u06af\u0648<\/strong> <code>terraform destroy<\/code><strong>.<\/strong> \u0635\u0631\u0641 \u0645\u06c1\u0646\u06af\u06d2 \u062d\u0635\u0648\u06ba \u06a9\u0648 \u0627\u0644\u06af \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">cd terraform \nterraform destroy \n-var=\"project_id=YOUR_PROJECT_ID\" \n-var=\"github_repo=YOUR_USERNAME\/pr-preview-envs\"\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2: \u062c\u0628 \u0622\u067e \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u0648\u0627\u0644\u06d2 \u0634\u0646\u0627\u062e\u062a\u06cc \u067e\u0648\u0644 \u06a9\u0648 \u062d\u0630\u0641 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 Google \u0627\u0633\u06d2 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062f\u06a9\u06be\u0627 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 <code>DELETED<\/code> \u06c1\u0645 \u0622\u067e \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a 30 \u062f\u0646\u0648\u06ba \u062a\u06a9 \u0627\u067e\u0646\u06d2 \u067e\u0627\u0633 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0679\u06cc\u0631\u0627\u0641\u0627\u0631\u0645 \u0627\u0633\u06d2 \u0628\u06be\u0648\u0644 \u06af\u06cc\u0627\u060c \u0644\u06cc\u06a9\u0646 \u06af\u0648\u06af\u0644 \u0646\u06d2 \u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627\u06d4 \u0627\u0633 \u0648\u0646\u0688\u0648 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u0633\u0679\u06cc\u06a9 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0645\u0633\u0627\u0626\u0644 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-plaintext\">Error: Error creating WorkloadIdentityPool: googleapi: Error 409: Requested entity already exists\n<\/code><\/pre>\n<p>\u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u062a\u0645\u0627\u0645 \u0642\u06cc\u0645\u062a \u06a9\u0644\u0633\u0679\u0631 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0646\u0648\u0688\u0633 \u06a9\u06cc \u06c1\u06d2\u06d4 \u0634\u0646\u0627\u062e\u062a\u06cc \u067e\u0648\u0644\u0632\u060c \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646\u060c \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633\u060c \u0622\u0626\u06cc \u0627\u06d2 \u0627\u06cc\u0645 \u0628\u0627\u0626\u0646\u0688\u0646\u06af\u0632\u060c \u062c\u0627\u0645\u062f IPs\u060c \u0627\u0648\u0631 \u0622\u0631\u0679\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc\u0632 \u06a9\u0648 \u062c\u06af\u06c1 \u067e\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u0642\u06cc\u0645\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0628\u0639\u062f \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u0646\u0627 \u0628\u0633 \u06c1\u06d2\u06d4 <code>terraform apply<\/code>\u0627\u0648\u0631 \u0622\u067e \u06a9\u0627 <code>WIF_PROVIDER<\/code> \u0627\u0648\u0631 <code>WIF_SERVICE_ACCOUNT<\/code> GitHub \u067e\u0631 \u0631\u0627\u0632 \u062f\u0631\u0633\u062a \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u067e\u0646\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0628\u06cc\u06a9\u0627\u0631 \u0646\u0648\u0688\u0633 \u06a9\u06cc \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u0628\u0646\u062f \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0646\u0648\u0688 \u067e\u0648\u0644 \u06a9\u0648 \u0635\u0641\u0631 \u067e\u0631 \u067e\u06cc\u0645\u0627\u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">gcloud container clusters resize pr-preview-cluster\n--node-pool pr-preview-cluster-pool\n--num-nodes 0\n--zone europe-west2-a\n<\/code><\/pre>\n<p>\u0686\u0648\u0646\u06a9\u06c1 \u0622\u067e \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc GKE \u06a9\u0646\u0679\u0631\u0648\u0644 \u0637\u06cc\u0627\u0631\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u062f\u0627\u0626\u06cc\u06af\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u0627\u0633\u06d2 \u06c1\u0679\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0631\u0642\u0645 \u0628\u0686\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0633\u0628 \u06a9\u0686\u06be \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648\u060c \u0627\u0646 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">cd terraform\nterraform destroy\n-var=\"project_id=YOUR_PROJECT_ID\"\n-var=\"github_repo=YOUR_USERNAME\/pr-preview-envs\" \n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0628\u0627\u0642\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">gcloud compute forwarding-rules list\ngcloud compute addresses list\n<\/code><\/pre>\n<p>\u062f\u0648\u0646\u0648\u06ba \u062e\u0627\u0644\u06cc \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba \u06cc\u0627 \u0627\u0646 \u0645\u06cc\u06ba \u0635\u0631\u0641 \u062f\u0648\u0633\u0631\u06d2 \u067e\u0631\u0627\u062c\u06cc\u06a9\u0679\u0633 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0648\u0633\u0627\u0626\u0644 \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688\u0632 \u06a9\u0648 \u0628\u06be\u06cc \u06c1\u0679\u0627\u0646\u0627 \u0646\u06c1 \u0628\u06be\u0648\u0644\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u0622\u067e \u0646\u06d2 \u06a9\u0686\u06be \u0627\u06cc\u0633\u0627 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0679\u06cc\u0645\u0648\u06ba \u06a9\u06d2 \u067e\u0627\u0633 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06cc\u0627 \u0648\u06c1 \u06a9\u0633\u06cc \u0648\u06cc\u0646\u0688\u0631 \u06a9\u0648 \u0627\u062f\u0627 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u06cc\u06ba \u0646\u06d2 \u0627\u06cc\u06a9 \u06af\u0648 \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u0644\u06a9\u06be\u06cc \u06c1\u06d2 \u062c\u0648 \u0644\u0646\u06a9\u0631 \u062c\u06be\u0646\u0688\u0648\u06ba \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0645\u0631\u062a\u0628 \u0648\u0642\u062a \u067e\u0631 \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0628\u0644\u0688 \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0627\u0637\u0644\u0627\u0639 \u062f\u06cc\u062a\u06cc \u06c1\u06d2 \u060c \u0644\u06c1\u0630\u0627 \u0686\u0644\u0627\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0645\u0627\u062d\u0648\u0644 \u06c1\u0645\u06cc\u0634\u06c1 \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u0633 \u06a9\u0645\u0679 \u0633\u06d2 \u0622\u06cc\u0627 \u06c1\u06d2\u06d4 \u0645\u06cc\u06ba \u0646\u06d2 \u0627\u0633\u06d2 \u0645\u0644\u0679\u06cc \u0627\u0633\u0679\u06cc\u062c \u0688\u0648\u06a9\u0631 \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0644\u067e\u06cc\u0679 \u062f\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc \u0633\u06cc \u0645\u0633\u062a\u062d\u06a9\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0646\u0633\u0644\u06a9 \u063a\u06cc\u0631 \u062c\u0691 \u0627\u0645\u06cc\u062c \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>Terraform \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 GKE \u06a9\u0644\u0633\u0679\u0631 \u0627\u0648\u0631 \u0622\u0631\u0679\u0641\u06cc\u06a9\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u0630\u062e\u06cc\u0631\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc\u0627\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0645\u0627\u0646\u0688 \u0633\u06d2 \u067e\u0648\u0631\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627 \u0627\u0648\u0631 \u062d\u0630\u0641 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0627 \u0641\u06cc\u0688\u0631\u06cc\u0634\u0646 \u0642\u0627\u0626\u0645 \u06a9\u0631\u06cc\u06ba \u062a\u0627\u06a9\u06c1 GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u0627\u06cc\u06a9 \u0637\u0648\u06cc\u0644 \u0645\u062f\u062a\u06cc \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0644\u06cc\u062f \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u062e\u062a\u0635\u0631 \u0645\u062f\u062a \u06a9\u06d2 OIDC \u0679\u0648\u06a9\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06af\u0648\u06af\u0644 \u06a9\u0644\u0627\u0624\u0688 \u0633\u06d2 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631 \u0633\u06a9\u06d2 \u062c\u0648 \u067e\u0631\u0627\u067e\u0631\u0679\u06cc \u06a9\u06cc \u0634\u0631\u0627\u0626\u0637 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u062a\u06a9 \u0645\u062d\u062f\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0646\u06d2 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0627\u06cc\u06a9 \u0628\u0646\u06cc\u0627\u062f\u06cc Kubernetes \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0644\u06a9\u06be\u0627 \u0627\u0648\u0631 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 Kustomize \u0627\u0648\u0648\u0631\u0644\u06d2 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062a\u0627\u06a9\u06c1 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0648 \u0645\u062e\u062a\u0644\u0641 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u067e\u0631 \u0645\u062e\u062a\u0644\u0641 \u0627\u0645\u06cc\u062c \u0679\u06cc\u06af\u0632 \u0627\u0648\u0631 \u06c1\u0631 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0646\u0627\u0645\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u06d2\u06d4 \u0627\u067e\u0646\u06d2 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0646\u06af\u0631\u06cc\u0633 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0631\u06a9\u06be \u06a9\u0631 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0645\u0633\u062a\u062d\u06a9\u0645\u060c \u062c\u0627\u0645\u062f IP \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2\u060c \u0627\u06cc\u06a9 \u0644\u0648\u0688 \u0628\u06cc\u0644\u0646\u0633\u0631 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u062a\u0639\u062f\u0627\u062f \u0645\u06cc\u06ba \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u0646\u06d2 \u0627\u06cc\u06a9 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 DNS \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0645\u062a\u0639\u06cc\u0646 \u06a9\u06cc\u0627\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u0646\u0626\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0648 \u06a9\u0633\u06cc \u0628\u06be\u06cc DNS \u06a9\u0627\u0645 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u06cc\u06d4 \u0631\u0648\u0679\u0646\u06af \u06c1\u06d2\u06d4 <code>Host<\/code> \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06c1\u06cc\u0688\u0631\u06d4 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06c1 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u062f\u0631\u0633\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u062a\u062c\u062f\u06cc\u062f TLS \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06c1\u0645 \u0646\u06d2 \u0627\u06cc\u06a9 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u06cc\u0627 \u06a9\u06c1 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u062e\u0648\u062f \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 PR \u062a\u0641\u0635\u06cc\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0634\u06c1\u06cc\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0645 \u0646\u06d2 \u06c1\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 ResourceQuota \u0627\u0648\u0631 LimitRange \u062a\u06a9 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631 \u062f\u06cc\u0627\u060c \u062c\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u0628\u06be\u06cc \u0634\u0627\u0645\u0644 \u06c1\u06d2 \u062c\u0648 \u0633\u0627\u062e\u062a\u06cc \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0633\u0628 \u0633\u06d2 \u0645\u06c1\u0646\u06af\u06cc \u063a\u0644\u0637\u06cc \u06a9\u0648 \u0646\u0627\u0645\u0645\u06a9\u0646 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u06c1\u0645 \u0646\u06d2 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0631\u06cc\u067e\u0631 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u062e\u0648\u0634\u06cc \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u0633\u06d2 \u0686\u06be\u0648\u0679 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0686\u06cc\u0632\u0648\u06ba \u06a9\u0648 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0635\u0631\u0641 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u06c1\u0645 \u06cc\u06c1 \u062b\u0627\u0628\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<p>\u0646\u062a\u06cc\u062c\u06c1 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba \u0639\u0648\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u0645\u0627\u062d\u0648\u0644 \u06c1\u06d2\u06d4 <strong>\u0628\u0646\u06cc\u0627\u062f\u06cc<\/strong> \u06c1\u0631 \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06a9\u06c1 \u0648\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06d2\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06d2\u060c \u06cc\u0627 \u0633\u0644\u06cc\u06a9 \u0686\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0645\u0646\u0638\u0645 \u06a9\u0631\u0646\u0627 \u06cc\u0627\u062f \u0631\u06a9\u06be\u06d2\u06d4<\/p>\n<h3 id=\"heading-where-to-go-from-here\">\u0645\u06cc\u06ba \u06cc\u06c1\u0627\u06ba \u0633\u06d2 \u06a9\u06c1\u0627\u06ba \u062c\u0627\u0624\u06ba\u061f<\/h3>\n<p>\u0627\u06cc\u0633\u06cc \u06a9\u0626\u06cc \u0633\u0645\u062a\u06cc\u06ba \u06c1\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba \u0622\u067e \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0622\u067e \u0627\u067e\u0646\u06cc \u0679\u06cc\u0645 \u06a9\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u0648 \u06a9\u0633 \u062d\u062f \u062a\u06a9 \u0628\u06c1\u062a\u0631 \u0628\u0646\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0633 \u06a9\u0627 \u0627\u06cc\u06a9 \u0645\u0648\u0679\u0627 \u062d\u06a9\u0645 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<ol wp_automatic_readability=\"10\">\n<li wp_automatic_readability=\"3\">\n<p><strong>\u06c1\u0631 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc\u062c \u06a9\u0627 \u0688\u06cc\u0679\u0627\u06d4<\/strong> \u06c1\u0645 \u0646\u06d2 \u062c\u0648 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u0633\u0628 \u0633\u06d2 \u0628\u0691\u06cc \u062d\u062f \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u06d2 \u0648\u0637\u0646 \u06c1\u06d2\u06d4 \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0639\u0627\u0645 \u067e\u06cc\u0679\u0631\u0646 \u0639\u0627\u0631\u0636\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0641\u06cc \u0646\u06cc\u0645 \u0627\u0633\u067e\u06cc\u0633 \u06c1\u06cc\u06ba \u062c\u0648 \u062d\u0630\u0641 \u0634\u062f\u06c1 \u0633\u0646\u06cc\u067e \u0634\u0627\u0679\u0633 \u0633\u06d2 \u0633\u06cc\u0688 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06cc\u0627 \u0641\u06cc \u0645\u0627\u062d\u0648\u0644 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0622\u0626\u0633\u0648\u0644\u06cc\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u0645\u0634\u06a9\u0644 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u06c1\u0627\u06ba \u0628\u0627\u0642\u06cc \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u06a9\u06cc \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u06a9\u0648\u0634\u0634\u06cc\u06ba \u06c1\u0648\u06ba \u06af\u06cc\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"2\">\n<p><strong>\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u0679\u06cc\u0633\u0679 \u0633\u0648\u06cc\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/strong> \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u067e\u0646\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u062d\u0642\u06cc\u0642\u06cc URL \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u062a\u0648\u060c \u0622\u067e CI \u0645\u06cc\u06ba \u0627\u0633 \u067e\u0631 \u0627\u06cc\u0646\u0688 \u0679\u0648 \u0627\u06cc\u0646\u0688 \u0679\u06cc\u0633\u0679 \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0641\u0631\u0636\u06cc URLs \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u062c\u0627\u0646\u0686 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0636\u0628\u0648\u0637 \u0633\u06af\u0646\u0644 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"1\">\n<p><strong>DNS-01 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0648\u0627\u0626\u0644\u0688 \u06a9\u0627\u0631\u0688 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679\u06d4<\/strong> \u062c\u0628 PR \u0648\u0627\u0644\u06cc\u0648\u0645 \u062d\u062f \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062a\u0648 Let's Encrypt \u0634\u0631\u062d \u06a9\u0648 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0679\u0648\u067e\u06cc \u06c1\u0679\u0627 \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0645\u0631\u062d\u0644\u06c1 15 \u0645\u06cc\u06ba \u0628\u06cc\u0627\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"3\">\n<p><strong>GitOps \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/strong> \u06a9\u0627\u0645 \u06a9\u0627 \u0628\u06c1\u0627\u0624 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba <code>kubectl apply<\/code> \u0622\u067e \u06a9\u0648 \u067e\u06cc\u0634 \u06a9\u0631\u062f\u06c1 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06a9\u0633\u06cc \u0627\u06cc\u0633\u06d2 \u0630\u062e\u06cc\u0631\u06c1 \u0645\u06cc\u06ba \u0628\u06be\u06cc\u062c\u0646\u06d2 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0648 Argo CD \u06cc\u0627 Flux \u06a9\u0648\u0622\u0631\u0688\u06cc\u0646\u06cc\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0644\u0633\u0679\u0631 \u0627\u0633\u0679\u06cc\u0679 \u067e\u06be\u0631 \u06af\u0679 \u06c1\u0633\u0679\u0631\u06cc \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u0648\u06af\u06cc\u060c \u0627\u0648\u0631 \u0622\u067e \u06a9\u06cc CI \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u0648 \u06a9\u0644\u0633\u0679\u0631 \u0631\u0627\u0626\u0679 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<\/li>\n<li wp_automatic_readability=\"2\">\n<p><strong>\u0627\u067e\u0646\u06d2 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u06cc\u0679\u0631\u06a9\u0633 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u06ba\u06d4<\/strong> \u0627\u067e\u0646\u06d2 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u0648 \u0644\u0627\u06af\u062a \u06a9\u06cc \u0646\u0645\u0627\u0626\u0634 \u0648\u0627\u0644\u06d2 \u0679\u0648\u0644 \u0633\u06d2 \u062c\u0648\u0691 \u06a9\u0631 \u0622\u067e \u06a9\u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u060c \u0622\u067e \u06a9\u0646\u062f\u06be\u06d2 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0646\u0645\u0628\u0631\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \"\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u0645\u06cc\u0631\u06cc \u0645\u0627\u06c1\u0627\u0646\u06c1 \u0644\u0627\u06af\u062a \u06a9\u06cc \u0627\u0635\u0644 \u0642\u06cc\u0645\u062a \u06a9\u06cc\u0627 \u06c1\u06d2\" \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06d2 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"heading-project-file-structure\">\u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0641\u0627\u0626\u0644 \u06a9\u0627 \u0688\u06be\u0627\u0646\u0686\u06c1<\/h2>\n<pre><code class=\"language-plaintext\">pr-preview-envs\/\n\u251c\u2500\u2500 app\/\n\u2502   \u251c\u2500\u2500 main.go                      \u2014 Go HTTP server reporting build metadata\n\u2502   \u251c\u2500\u2500 go.mod                       \u2014 Go module definition\n\u2502   \u2514\u2500\u2500 Dockerfile                   \u2014 Multi-stage build with ldflags injection\n\u251c\u2500\u2500 terraform\/\n\u2502   \u251c\u2500\u2500 main.tf                      \u2014 GKE, Artifact Registry, WIF, static IP\n\u2502   \u251c\u2500\u2500 variables.tf                 \u2014 Input variables\n\u2502   \u2514\u2500\u2500 outputs.tf                   \u2014 Cluster, WIF, and ingress IP values\n\u251c\u2500\u2500 k8s\/\n\u2502   \u251c\u2500\u2500 base\/\n\u2502   \u2502   \u251c\u2500\u2500 deployment.yaml          \u2014 Deployment with probes and Downward API\n\u2502   \u2502   \u251c\u2500\u2500 service.yaml             \u2014 ClusterIP Service\n\u2502   \u2502   \u251c\u2500\u2500 ingress.yaml             \u2014 Ingress with cert-manager annotation\n\u2502   \u2502   \u2514\u2500\u2500 kustomization.yaml       \u2014 Base Kustomize config\n\u2502   \u2514\u2500\u2500 cluster\/\n\u2502       \u251c\u2500\u2500 letsencrypt-staging.yaml \u2014 Staging ClusterIssuer\n\u2502       \u251c\u2500\u2500 letsencrypt-prod.yaml    \u2014 Production ClusterIssuer\n\u2502       \u2514\u2500\u2500 namespace-guardrails.yaml \u2014 ResourceQuota and LimitRange\n\u2514\u2500\u2500 .github\/\n    \u2514\u2500\u2500 workflows\/\n        \u251c\u2500\u2500 preview-deploy.yml       \u2014 Build, deploy, certificate, PR comment\n        \u251c\u2500\u2500 preview-teardown.yml     \u2014 Delete namespace on PR close\n        \u2514\u2500\u2500 preview-reaper.yml       \u2014 Scheduled orphan cleanup\n<\/code><\/pre>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0645\u0627\u0645 \u0633\u0648\u0631\u0633 \u0641\u0627\u0626\u0644\u06cc\u06ba \u0633\u0627\u062a\u06be \u0648\u0627\u0644\u06d2 GitHub \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u0645\u06cc\u06ba \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06cc\u06ba\u06d4 <code>https:\/\/github.com\/Amiynarh\/pr-preview-envs<\/code>.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u06c1\u0631 \u0648\u06c1 \u0679\u06cc\u0645 \u062c\u0648 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0622\u062e\u0631 \u06a9\u0627\u0631 \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06c1\u0631 \u0679\u06cc\u0645 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0634\u062a\u0631\u06a9\u06c1 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0645\u0627\u062d\u0648\u0644\u060c \u06a9\u0626\u06cc \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0633\u06cc \u06a9\u0648 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0622\u062f\u06be\u06cc \u0645\u06a9\u0645\u0644 \u062e\u0635\u0648\u0635\u06cc\u062a \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u06d2 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":30912,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-30911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/30911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=30911"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/30911\/revisions"}],"predecessor-version":[{"id":30913,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/30911\/revisions\/30913"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media\/30912"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=30911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=30911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=30911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}