Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

ہیلو! حال ہی میں، ڈوکر امیجز بنانے اور کبرنیٹس میں تعیناتی کے لیے بہت سے ٹھنڈے آٹومیشن ٹولز جاری کیے گئے ہیں۔ اس سلسلے میں، میں نے گٹ لیب کے ساتھ کھیلنے کا فیصلہ کیا، اس کی صلاحیتوں کا بخوبی مطالعہ کیا اور یقیناً پائپ لائن قائم کی۔

یہ کام ویب سائٹ سے متاثر ہوا۔ kubernetes.io، جس سے پیدا ہوتا ہے۔ سورس کوڈز خود بخود، اور بھیجی گئی ہر پول درخواست کے لیے، روبوٹ خود بخود آپ کی تبدیلیوں کے ساتھ سائٹ کا ایک پیش نظارہ ورژن تیار کرتا ہے اور دیکھنے کے لیے ایک لنک فراہم کرتا ہے۔

میں نے شروع سے اسی طرح کے عمل کو بنانے کی کوشش کی، لیکن مکمل طور پر Gitlab CI اور مفت ٹولز پر بنایا گیا ہے جسے میں Kubernetes پر ایپلیکیشنز تعینات کرنے کے لیے استعمال کرتا ہوں۔ آج میں آخر میں آپ کو ان کے بارے میں مزید بتاؤں گا۔

مضمون میں ٹولز پر تبادلہ خیال کیا جائے گا جیسے:
ہیوگو, qbec, کانیکو, git-crypt и گٹ لیب سی آئی متحرک ماحول کی تخلیق کے ساتھ۔

مشمولات

  1. ہیوگو سے ملو
  2. ڈاکر فائل کی تیاری
  3. کنیکو کو جاننا
  4. qbec کو جاننا
  5. Kubernetes-executor کے ساتھ Gitlab-runner کو آزمانا
  6. qbec کے ساتھ ہیلم چارٹس کو تعینات کرنا
  7. git-crypt کا تعارف
  8. ٹول باکس کی تصویر بنانا
  9. ہماری پہلی پائپ لائن اور ٹیگز کے ذریعے تصاویر کی اسمبلی
  10. تعیناتی آٹومیشن
  11. آرٹفیکٹس اور اسمبلی جب ماسٹر کو آگے بڑھاتے ہیں
  12. متحرک ماحول
  13. ایپس کا جائزہ لیں۔

1. ہیوگو کو جاننا

اپنے پروجیکٹ کی مثال کے طور پر، ہم ہیوگو پر بنائی گئی ایک دستاویزی اشاعت کی سائٹ بنانے کی کوشش کریں گے۔ ہیوگو ایک جامد مواد بنانے والا ہے۔

ان لوگوں کے لیے جو جامد جنریٹرز سے واقف نہیں ہیں، میں آپ کو ان کے بارے میں کچھ اور بتاؤں گا۔ ڈیٹا بیس اور کچھ پی ایچ پی کے ساتھ روایتی ویب سائٹ انجنوں کے برعکس، جو صارف کی طرف سے درخواست کرنے پر، فلائی پر صفحات تیار کرتے ہیں، جامد جنریٹرز کو تھوڑا مختلف طریقے سے ڈیزائن کیا جاتا ہے۔ وہ آپ کو ذرائع لینے کی اجازت دیتے ہیں، عام طور پر مارک ڈاؤن مارک اپ اور تھیم ٹیمپلیٹس میں فائلوں کا ایک سیٹ، پھر انہیں مکمل طور پر تیار شدہ ویب سائٹ میں مرتب کریں۔

یعنی، نتیجے کے طور پر، آپ کو ایک ڈائرکٹری کا ڈھانچہ اور تیار کردہ HTML فائلوں کا ایک سیٹ ملے گا، جسے آپ آسانی سے کسی بھی سستی ہوسٹنگ پر اپ لوڈ کر کے کام کرنے والی ویب سائٹ حاصل کر سکتے ہیں۔

آپ مقامی طور پر ہیوگو انسٹال کر سکتے ہیں اور اسے آزما سکتے ہیں:

ایک نئی سائٹ شروع کرنا:

hugo new site docs.example.org

اور ایک ہی وقت میں گٹ ذخیرہ:

cd docs.example.org
git init

اب تک، ہماری سائٹ قدیم ہے اور اس پر کچھ ظاہر ہونے کے لیے، ہمیں سب سے پہلے ایک تھیم کو جوڑنے کی ضرورت ہے؛ ایک تھیم صرف ٹیمپلیٹس اور مخصوص قواعد کا ایک مجموعہ ہے جس کے ذریعے ہماری سائٹ تیار کی جاتی ہے۔

تھیم کے لیے ہم استعمال کریں گے۔ جانیں، جو، میری رائے میں، ایک دستاویزی سائٹ کے لیے بالکل موزوں ہے۔

میں اس حقیقت پر خصوصی توجہ دینا چاہوں گا کہ ہمیں اپنے پراجیکٹ ریپوزٹری میں تھیم فائلز کو محفوظ کرنے کی ضرورت نہیں ہے؛ اس کے بجائے، ہم اسے آسانی سے جوڑ سکتے ہیں۔ گٹ سب موڈیول:

git submodule add https://github.com/matcornic/hugo-theme-learn themes/learn

اس طرح، ہماری ریپوزٹری صرف ہمارے پروجیکٹ سے براہ راست متعلق فائلوں پر مشتمل ہوگی، اور منسلک تھیم ایک مخصوص ریپوزٹری کے لنک اور اس میں ایک عہد کے طور پر رہے گی، یعنی اسے ہمیشہ اصل ماخذ سے نکالا جا سکتا ہے اور اس سے ڈرنا نہیں چاہیے۔ غیر مطابقت پذیر تبدیلیاں.

آئیے تشکیل کو درست کریں۔ config.toml:

baseURL = "http://docs.example.org/"
languageCode = "en-us"
title = "My Docs Site"
theme = "learn"

پہلے ہی اس مرحلے پر آپ چلا سکتے ہیں:

hugo server

اور پتے پر http://localhost:1313/ ہماری نئی بنائی گئی ویب سائٹ چیک کریں، ڈائرکٹری میں کی گئی تمام تبدیلیاں خود بخود براؤزر میں کھلے صفحہ کو اپ ڈیٹ کر دیتی ہیں، بہت آسان!

آئیے میں ایک کور پیج بنانے کی کوشش کرتے ہیں۔ content/_index.md:

# My docs site

## Welcome to the docs!

You will be very smart :-)

نئے بنائے گئے صفحہ کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

سائٹ بنانے کے لیے، بس چلائیں:

hugo

ڈائرکٹری کے مواد عوام/ اور آپ کی ویب سائٹ ہوگی۔
ہاں، ویسے، آئیے اسے فوری طور پر شامل کرتے ہیں۔ .gitignore:

echo /public > .gitignore

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add .
git commit -m "New site created"

2. ڈاکر فائل کی تیاری

یہ ہمارے ذخیرہ کی ساخت کی وضاحت کرنے کا وقت ہے. میں عام طور پر کچھ استعمال کرتا ہوں جیسے:

.
├── deploy
│   ├── app1
│   └── app2
└── dockerfiles
    ├── image1
    └── image2

  • ڈاکر فائلز/ - Dockerfiles کے ساتھ ڈائریکٹریز اور ہماری Docker امیجز بنانے کے لیے ضروری ہر چیز پر مشتمل ہے۔
  • تعینات/ - ہماری ایپلیکیشنز کوبرنیٹس پر تعینات کرنے کے لیے ڈائریکٹریز پر مشتمل ہے۔

اس طرح، ہم راستے میں اپنی پہلی Dockerfile بنائیں گے۔ ڈاکر فائلز/ویب سائٹ/ڈوکر فائل

FROM alpine:3.11 as builder
ARG HUGO_VERSION=0.62.0
RUN wget -O- https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C /usr/local/bin
ADD . /src
RUN hugo -s /src

FROM alpine:3.11
RUN apk add --no-cache darkhttpd
COPY --from=builder /src/public /var/www
ENTRYPOINT [ "/usr/bin/darkhttpd" ]
CMD [ "/var/www" ]

جیسا کہ آپ دیکھ سکتے ہیں، Dockerfile دو پر مشتمل ہے۔ FROM، اس خصوصیت کو کہا جاتا ہے۔ کثیر مرحلے کی تعمیر اور آپ کو حتمی ڈوکر امیج سے غیر ضروری ہر چیز کو خارج کرنے کی اجازت دیتا ہے۔
اس طرح، حتمی تصویر صرف پر مشتمل ہوگی گہراhttpd (ہلکا پھلکا HTTP سرور) اور عوام/ - ہماری جامد طور پر تیار کردہ ویب سائٹ کا مواد۔

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add dockerfiles/website
git commit -m "Add Dockerfile for website"

3. کانیکو کو جاننا

ایک ڈاکر امیج بلڈر کے طور پر، میں نے استعمال کرنے کا فیصلہ کیا۔ کانیکو، چونکہ اس کے آپریشن کے لیے ڈوکر ڈیمون کی ضرورت نہیں ہوتی ہے، اور اس کی تعمیر خود کسی بھی مشین پر کی جا سکتی ہے اور کیشے کو براہ راست رجسٹری میں محفوظ کیا جا سکتا ہے، اس طرح ایک مکمل مستقل اسٹوریج کی ضرورت ختم ہو جاتی ہے۔

تصویر بنانے کے لیے، صرف اس کے ساتھ کنٹینر چلائیں۔ کانیکو ایگزیکیوٹر اور اسے موجودہ تعمیراتی سیاق و سباق سے گزریں؛ یہ ڈوکر کے ذریعے مقامی طور پر بھی کیا جا سکتا ہے:

docker run -ti --rm 
  -v $PWD:/workspace 
  -v ~/.docker/config.json:/kaniko/.docker/config.json:ro 
  gcr.io/kaniko-project/executor:v0.15.0 
  --cache 
  --dockerfile=dockerfiles/website/Dockerfile 
  --destination=registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1

Где registry.gitlab.com/kvaps/docs.example.org/website - آپ کی ڈاکر امیج کا نام؛ تعمیر کرنے کے بعد، یہ خود بخود ڈاکر رجسٹری میں لانچ ہو جائے گا۔

پیرامیٹر --کیشے آپ کو ڈوکر رجسٹری میں تہوں کو کیش کرنے کی اجازت دیتا ہے؛ مثال کے طور پر، وہ محفوظ ہو جائیں گے registry.gitlab.com/kvaps/docs.example.org/website/cache، لیکن آپ پیرامیٹر کا استعمال کرتے ہوئے دوسرا راستہ بتا سکتے ہیں۔ --cache-repo.

ڈاکر رجسٹری کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

4. qbec کو جاننا

Qbec ایک تعیناتی ٹول ہے جو آپ کو اپنی ایپلیکیشن مینی فیسٹ کو واضح طور پر بیان کرنے اور انہیں Kubernetes پر تعینات کرنے کی اجازت دیتا ہے۔ Jsonnet کو مرکزی نحو کے طور پر استعمال کرنا آپ کو متعدد ماحول میں فرق کی وضاحت کو بہت آسان بنانے کی اجازت دیتا ہے، اور کوڈ کی تکرار کو بھی تقریباً مکمل طور پر ختم کر دیتا ہے۔

یہ خاص طور پر ان صورتوں میں درست ہو سکتا ہے جہاں آپ کو مختلف پیرامیٹرز والے کئی کلسٹرز میں ایک ایپلیکیشن تعینات کرنے کی ضرورت ہو اور گٹ میں ان کی وضاحتی وضاحت کرنا چاہتے ہوں۔

Qbec آپ کو ہیلم چارٹس کو ضروری پیرامیٹرز پاس کر کے رینڈر کرنے کی بھی اجازت دیتا ہے اور پھر انہیں باقاعدہ مینی فیسٹس کی طرح آپریٹ کرنے کی بھی اجازت دیتا ہے، بشمول آپ ان پر مختلف تبدیلیاں لاگو کر سکتے ہیں، اور اس کے نتیجے میں، آپ کو ضرورت سے چھٹکارا حاصل کرنے کی اجازت دیتا ہے۔ چارٹ میوزیم استعمال کریں۔ یعنی آپ چارٹس کو براہ راست گٹ سے اسٹور اور رینڈر کرسکتے ہیں، جہاں سے وہ تعلق رکھتے ہیں۔

جیسا کہ میں نے پہلے کہا، ہم تمام تعیناتیوں کو ڈائریکٹری میں محفوظ کریں گے۔ تعینات/:

mkdir deploy
cd deploy

آئیے اپنی پہلی درخواست شروع کریں:

qbec init website
cd website

اب ہماری درخواست کا ڈھانچہ اس طرح نظر آتا ہے:

.
├── components
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
└── qbec.yaml

آئیے فائل کو دیکھتے ہیں۔ qbec.yaml:

apiVersion: qbec.io/v1alpha1
kind: App
metadata:
  name: website
spec:
  environments:
    default:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443
  vars: {}

یہاں ہم بنیادی طور پر دلچسپی رکھتے ہیں۔ spec.environments, qbec ہمارے لیے پہلے سے طے شدہ ماحول بنا چکا ہے اور ہمارے موجودہ kubeconfig سے سرور ایڈریس کے ساتھ ساتھ نام کی جگہ بھی لے چکا ہے۔
اب جب تعینات کر رہے ہیں۔ پہلے سے طے شدہ ماحول میں، qbec ہمیشہ صرف مخصوص Kubernetes کلسٹر اور مخصوص نام کی جگہ پر تعینات کرے گا، یعنی، آپ کو اب تعیناتی انجام دینے کے لیے سیاق و سباق اور نام کی جگہوں کے درمیان سوئچ کرنے کی ضرورت نہیں ہے۔
اگر ضروری ہو تو، آپ ہمیشہ اس فائل میں ترتیبات کو اپ ڈیٹ کر سکتے ہیں۔

آپ کے تمام ماحول میں بیان کیا گیا ہے۔ qbec.yaml، اور فائل میں params.libsonnet، جہاں یہ کہتا ہے کہ ان کے لیے پیرامیٹرز کہاں سے حاصل کیے جائیں۔

اگلا ہم دو ڈائریکٹریاں دیکھتے ہیں:

  • اجزاء / - ہماری درخواست کے تمام منشور یہاں محفوظ کیے جائیں گے؛ انہیں jsonnet اور باقاعدہ yaml فائلوں میں بیان کیا جا سکتا ہے۔
  • ماحول/ - یہاں ہم اپنے ماحول کے لیے تمام متغیرات (پیرامیٹر) کو بیان کریں گے۔

پہلے سے طے شدہ طور پر ہمارے پاس دو فائلیں ہیں:

  • ماحول/base.libsonnet - اس میں تمام ماحول کے لیے مشترکہ پیرامیٹرز ہوں گے۔
  • ماحول/default.libsonnet - ماحول کے لیے اوور رائیڈ کردہ پیرامیٹرز پر مشتمل ہے۔ پہلے سے طے شدہ

چلو کھولتے ہیں ماحول/base.libsonnet اور وہاں ہمارے پہلے جزو کے پیرامیٹرز شامل کریں:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website:v0.0.1',
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

آئیے اپنا پہلا جزو بھی بنائیں اجزاء/website.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.website;

[
  {
    apiVersion: 'apps/v1',
    kind: 'Deployment',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      replicas: params.replicas,
      selector: {
        matchLabels: {
          app: params.name,
        },
      },
      template: {
        metadata: {
          labels: { app: params.name },
        },
        spec: {
          containers: [
            {
              name: 'darkhttpd',
              image: params.image,
              ports: [
                {
                  containerPort: params.containerPort,
                },
              ],
            },
          ],
          nodeSelector: params.nodeSelector,
          tolerations: params.tolerations,
          imagePullSecrets: [{ name: 'regsecret' }],
        },
      },
    },
  },
  {
    apiVersion: 'v1',
    kind: 'Service',
    metadata: {
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      selector: {
        app: params.name,
      },
      ports: [
        {
          port: params.servicePort,
          targetPort: params.containerPort,
        },
      ],
    },
  },
  {
    apiVersion: 'extensions/v1beta1',
    kind: 'Ingress',
    metadata: {
      annotations: {
        'kubernetes.io/ingress.class': params.ingressClass,
      },
      labels: { app: params.name },
      name: params.name,
    },
    spec: {
      rules: [
        {
          host: params.domain,
          http: {
            paths: [
              {
                backend: {
                  serviceName: params.name,
                  servicePort: params.servicePort,
                },
              },
            ],
          },
        },
      ],
    },
  },
]

اس فائل میں ہم نے ایک ساتھ تین کبرنیٹس ہستیوں کو بیان کیا ہے، یہ ہیں: تعیناتی, سروس и لاگ ان. اگر ہم چاہیں تو انہیں مختلف اجزاء میں ڈال سکتے ہیں، لیکن اس مرحلے پر ہمارے لیے ایک ہی کافی ہوگا۔

نحو jsonnet ریگولر json سے بہت ملتا جلتا ہے، اصولی طور پر، ریگولر json پہلے سے ہی درست jsonnet ہے، اس لیے پہلے تو آپ کے لیے آن لائن سروسز استعمال کرنا آسان ہو سکتا ہے جیسے yaml2json اپنے معمول کے یامل کو json میں تبدیل کرنے کے لیے، یا، اگر آپ کے اجزاء میں کوئی متغیر نہیں ہے، تو انہیں باقاعدہ یامل کی شکل میں بیان کیا جا سکتا ہے۔

کے ساتھ کام کرتے وقت jsonnet میں آپ کے ایڈیٹر کے لیے ایک پلگ ان انسٹال کرنے کی انتہائی سفارش کرتا ہوں۔

مثال کے طور پر، vim کے لیے ایک پلگ ان ہے۔ vim-jsonnet، جو نحو کو نمایاں کرتا ہے اور خود بخود عمل میں آتا ہے۔ jsonnet fmt جب بھی آپ محفوظ کرتے ہیں (jsonnet انسٹال کرنے کی ضرورت ہوتی ہے)۔

سب کچھ تیار ہے، اب ہم تعیناتی شروع کر سکتے ہیں:

یہ دیکھنے کے لیے کہ ہمیں کیا ملا، آئیے چلتے ہیں:

qbec show default

آؤٹ پٹ پر، آپ کو پیش کردہ یامل مینی فیسٹ نظر آئے گا جو ڈیفالٹ کلسٹر پر لاگو ہوں گے۔

بہت اچھا، اب درخواست دیں:

qbec apply default

آؤٹ پٹ پر آپ ہمیشہ دیکھیں گے کہ آپ کے کلسٹر میں کیا کیا جائے گا، qbec آپ کو ٹائپ کرکے تبدیلیوں سے اتفاق کرنے کو کہے گا۔ y آپ اپنے ارادوں کی تصدیق کر سکیں گے۔

ہماری درخواست تیار اور تعینات ہے!

اگر آپ تبدیلیاں کرتے ہیں، تو آپ ہمیشہ یہ کر سکتے ہیں:

qbec diff default

یہ دیکھنے کے لیے کہ یہ تبدیلیاں موجودہ تعیناتی پر کیسے اثر انداز ہوں گی۔

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

cd ../..
git add deploy/website
git commit -m "Add deploy for website"

5. Kubernetes-executor کے ساتھ Gitlab-runner کو آزمانا

حال ہی میں میں نے صرف باقاعدہ استعمال کیا gitlab-رنر شیل یا ڈوکر ایگزیکیوٹر کے ساتھ پہلے سے تیار مشین (LXC کنٹینر) پر۔ ابتدائی طور پر، ہمارے گٹ لیب میں عالمی سطح پر ایسے کئی رنرز کی تعریف کی گئی تھی۔ انہوں نے تمام منصوبوں کے لیے ڈاکر کی تصاویر اکٹھی کیں۔

لیکن جیسا کہ عملی طور پر دکھایا گیا ہے، یہ اختیار عملی اور حفاظت دونوں لحاظ سے سب سے زیادہ مثالی نہیں ہے۔ یہ بہت بہتر اور نظریاتی طور پر زیادہ درست ہے کہ ہر پروجیکٹ کے لیے، یا یہاں تک کہ ہر ماحول کے لیے الگ الگ رنر تعینات کیے جائیں۔

خوش قسمتی سے، یہ کوئی مسئلہ نہیں ہے، کیونکہ اب ہم تعینات کریں گے gitlab-رنر براہ راست ہمارے پروجیکٹ کے حصے کے طور پر Kubernetes میں۔

گٹلاب گٹ لیب رنر کوبرنیٹس کو تعینات کرنے کے لیے ایک ریڈی میڈ ہیلم چارٹ فراہم کرتا ہے۔ لہذا آپ کو صرف یہ جاننے کی ضرورت ہے۔ رجسٹریشن ٹوکن میں ہمارے پروجیکٹ کے لیے ترتیبات -> CI / CD -> رنرز اور اسے ہیلم تک پہنچا دیں:

helm repo add gitlab https://charts.gitlab.io

helm install gitlab-runner 
  --set gitlabUrl=https://gitlab.com 
  --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc 
  --set rbac.create=true 
  gitlab/gitlab-runner

کہاں:

  • https://gitlab.com - آپ کے Gitlab سرور کا پتہ۔
  • yga8y-jdCusVDn_t4Wxc - آپ کے پروجیکٹ کے لیے رجسٹریشن ٹوکن۔
  • rbac.create=true - رنر کو kubernetes-executor کا استعمال کرتے ہوئے اپنے کاموں کو انجام دینے کے لیے پوڈ بنانے کے قابل ہونے کے لیے ضروری مراعات فراہم کرتا ہے۔

اگر سب کچھ صحیح طریقے سے کیا گیا ہے، تو آپ کو سیکشن میں ایک رجسٹرڈ رنر دیکھنا چاہیے۔ داوک، آپ کے پروجیکٹ کی ترتیبات میں۔

شامل کردہ رنر کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

کیا یہ اتنا آسان ہے؟ - ہاں، یہ اتنا آسان ہے! رنرز کو دستی طور پر رجسٹر کرنے میں مزید کوئی پریشانی نہیں، اب سے رنرز خود بخود تخلیق اور تباہ ہو جائیں گے۔

6. QBEC کے ساتھ ہیلم چارٹس تعینات کریں۔

چونکہ ہم نے غور کرنے کا فیصلہ کیا۔ gitlab-رنر ہمارے پروجیکٹ کا حصہ ہے، اب وقت آگیا ہے کہ اسے ہمارے گٹ ریپوزٹری میں بیان کریں۔

ہم اسے ایک الگ جزو کے طور پر بیان کر سکتے ہیں۔ ویب سائٹ، لیکن مستقبل میں ہم مختلف کاپیاں تعینات کرنے کا ارادہ رکھتے ہیں۔ ویب سائٹ اکثر، برعکس gitlab-رنر، جو فی Kubernetes کلسٹر میں صرف ایک بار تعینات کیا جائے گا۔ تو آئیے اس کے لیے ایک علیحدہ درخواست شروع کریں:

cd deploy
qbec init gitlab-runner
cd gitlab-runner

اس بار ہم Kubernetes اداروں کو دستی طور پر بیان نہیں کریں گے، لیکن ایک ریڈی میڈ ہیلم چارٹ لیں گے۔ qbec کے فوائد میں سے ایک Git ذخیرہ سے براہ راست ہیلم چارٹ پیش کرنے کی صلاحیت ہے۔

آئیے اسے گٹ سب موڈیول کا استعمال کرتے ہوئے جوڑتے ہیں:

git submodule add https://gitlab.com/gitlab-org/charts/gitlab-runner vendor/gitlab-runner

اب ڈائریکٹری وینڈر/گٹ لیب رنر ہمارے پاس gitlab-runner کے چارٹ کے ساتھ ایک ذخیرہ ہے۔

اسی طرح، آپ دیگر ریپوزٹریز کو جوڑ سکتے ہیں، مثال کے طور پر، پوری ریپوزٹری کو آفیشل چارٹس کے ساتھ https://github.com/helm/charts

آئیے جزو کی وضاحت کرتے ہیں۔ components/gitlab-runner.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.gitlabRunner;

std.native('expandHelmTemplate')(
  '../vendor/gitlab-runner',
  params.values,
  {
    nameTemplate: params.name,
    namespace: env.namespace,
    thisFile: std.thisFile,
    verbose: true,
  }
)

کی پہلی دلیل expandHelmTemplate ہم چارٹ کا راستہ پاس کرتے ہیں، پھر params.values، جسے ہم ماحولیاتی پیرامیٹرز سے لیتے ہیں، پھر اس کے ساتھ آبجیکٹ آتا ہے۔

  • nameTemplate - رہائی کا نام
  • نام کی جگہ۔ - نام کی جگہ ہیلم کو منتقل کر دی گئی۔
  • یہ فائل - ایک مطلوبہ پیرامیٹر جو موجودہ فائل کا راستہ پاس کرتا ہے۔
  • لفظی - کمانڈ دکھاتا ہے۔ ہیلم ٹیمپلیٹ چارٹ پیش کرتے وقت تمام دلائل کے ساتھ

اب آئیے میں اپنے اجزاء کے پیرامیٹرز کی وضاحت کرتے ہیں۔ ماحول/base.libsonnet:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
      },
    },
  },
}

توجہ دینا رنر رجسٹریشن ٹوکن ہم ایک بیرونی فائل سے لیتے ہیں۔ secrets/base.libsonnet، آئیے اسے بنائیں:

{
  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',
}

آئیے چیک کریں کہ آیا سب کچھ کام کرتا ہے:

qbec show default

اگر سب کچھ ترتیب میں ہے، تو ہم ہیلم کے ذریعے اپنی پہلے سے تعینات ریلیز کو حذف کر سکتے ہیں:

helm uninstall gitlab-runner

اور اسے اسی طرح تعینات کریں، لیکن qbec کے ذریعے:

qbec apply default

7. git-crypt کا تعارف

گٹ کرپٹ ایک ایسا ٹول ہے جو آپ کو اپنے ذخیرے کے لیے شفاف خفیہ کاری ترتیب دینے کی اجازت دیتا ہے۔

اس وقت، gitlab-runner کے لیے ہماری ڈائرکٹری کا ڈھانچہ اس طرح نظر آتا ہے:

.
├── components
│   ├── gitlab-runner.jsonnet
├── environments
│   ├── base.libsonnet
│   └── default.libsonnet
├── params.libsonnet
├── qbec.yaml
├── secrets
│   └── base.libsonnet
└── vendor
    └── gitlab-runner (submodule)

لیکن گٹ میں راز کو ذخیرہ کرنا محفوظ نہیں ہے، کیا یہ ہے؟ لہذا ہمیں انہیں صحیح طریقے سے خفیہ کرنے کی ضرورت ہے۔

عام طور پر، ایک متغیر کی خاطر، یہ ہمیشہ معنی نہیں رکھتا۔ آپ کو راز منتقل کر سکتے ہیں qbec اور آپ کے CI سسٹم کے ماحولیاتی متغیرات کے ذریعے۔
لیکن یہ بات قابل غور ہے کہ مزید پیچیدہ منصوبے بھی ہیں جن میں اور بھی بہت سے راز ہو سکتے ہیں؛ ان سب کو ماحولیاتی تغیرات کے ذریعے منتقل کرنا انتہائی مشکل ہوگا۔

اس کے علاوہ، اس معاملے میں میں آپ کو اس طرح کے ایک شاندار آلے کے بارے میں بتانے کے قابل نہیں ہوں گے git-crypt.

git-crypt یہ اس لحاظ سے بھی آسان ہے کہ یہ آپ کو رازوں کی پوری تاریخ کو بچانے کے ساتھ ساتھ تنازعات کا موازنہ، انضمام اور حل کرنے کی اجازت دیتا ہے جیسا کہ ہم گٹ کے معاملے میں کرنے کے عادی ہیں۔

تنصیب کے بعد پہلی چیز git-crypt ہمیں اپنے ذخیرہ کے لیے چابیاں تیار کرنے کی ضرورت ہے:

git crypt init

اگر آپ کے پاس PGP کلید ہے، تو آپ فوری طور پر اپنے آپ کو اس پروجیکٹ کے لیے بطور معاون شامل کر سکتے ہیں:

git-crypt add-gpg-user [email protected]

اس طرح آپ اپنی نجی کلید کا استعمال کرتے ہوئے ہمیشہ اس ذخیرہ کو ڈکرپٹ کر سکتے ہیں۔

اگر آپ کے پاس PGP کلید نہیں ہے اور آپ اس کی توقع نہیں رکھتے ہیں، تو آپ دوسرے راستے پر جا کر پروجیکٹ کی کو برآمد کر سکتے ہیں:

git crypt export-key /path/to/keyfile

اس طرح، جو کوئی بھی برآمد ہوا ہے۔ کی فائل آپ کے ذخیرے کو ڈکرپٹ کرنے کے قابل ہو جائے گا۔

یہ ہمارا پہلا راز قائم کرنے کا وقت ہے.
میں آپ کو یاد دلاتا ہوں کہ ہم ابھی بھی ڈائریکٹری میں ہیں۔ deploy/gitlab-runner/، جہاں ہمارے پاس ایک ڈائریکٹری ہے۔ راز/آئیے اس میں موجود تمام فائلوں کو انکرپٹ کرتے ہیں، اس کے لیے ہم ایک فائل بنائیں گے۔ secrets/.gitattributes مندرجہ ذیل مواد کے ساتھ:

* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff

جیسا کہ مواد سے دیکھا جا سکتا ہے، تمام فائلیں نقاب پوش ہیں۔ * کے ذریعے چلایا جائے گا git-cryptسب سے زیادہ کے علاوہ .gitaattributes

ہم اسے چلا کر چیک کر سکتے ہیں:

git crypt status -e

آؤٹ پٹ ریپوزٹری میں ان تمام فائلوں کی فہرست ہوگی جن کے لیے خفیہ کاری فعال ہے۔

بس، اب ہم محفوظ طریقے سے اپنی تبدیلیاں کر سکتے ہیں:

cd ../..
git add .
git commit -m "Add deploy for gitlab-runner"

ذخیرہ کو روکنے کے لیے، بس چلائیں:

git crypt lock

اور فوری طور پر تمام انکرپٹڈ فائلیں بائنری چیز میں تبدیل ہو جائیں گی، ان کو پڑھنا ناممکن ہو جائے گا۔
ذخیرہ کو ڈکرپٹ کرنے کے لیے، چلائیں:

git crypt unlock

8. ٹول باکس کی تصویر بنائیں

ٹول باکس کی تصویر تمام ٹولز کے ساتھ ایک تصویر ہے جسے ہم اپنے پروجیکٹ کو تعینات کرنے کے لیے استعمال کریں گے۔ اسے Gitlab رنر کی طرف سے مخصوص تعیناتی کاموں کو انجام دینے کے لیے استعمال کیا جائے گا۔

یہاں سب کچھ آسان ہے، آئیے ایک نیا بنائیں dockerfiles/toolbox/dockerfile مندرجہ ذیل مواد کے ساتھ:

FROM alpine:3.11

RUN apk add --no-cache git git-crypt

RUN QBEC_VER=0.10.3 
 && wget -O- https://github.com/splunk/qbec/releases/download/v${QBEC_VER}/qbec-linux-amd64.tar.gz 
     | tar -C /tmp -xzf - 
 && mv /tmp/qbec /tmp/jsonnet-qbec /usr/local/bin/

RUN KUBECTL_VER=1.17.0 
 && wget -O /usr/local/bin/kubectl 
      https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VER}/bin/linux/amd64/kubectl 
 && chmod +x /usr/local/bin/kubectl

RUN HELM_VER=3.0.2 
 && wget -O- https://get.helm.sh/helm-v${HELM_VER}-linux-amd64.tar.gz 
     | tar -C /tmp -zxf - 
 && mv /tmp/linux-amd64/helm /usr/local/bin/helm

جیسا کہ آپ دیکھ سکتے ہیں، اس تصویر میں ہم وہ تمام یوٹیلیٹیز انسٹال کرتے ہیں جو ہم اپنی ایپلیکیشن کو تعینات کرنے کے لیے استعمال کرتے تھے۔ جب تک ہمیں یہاں اس کی ضرورت نہیں ہے۔ کیوبیکٹل، لیکن آپ پائپ لائن سیٹ اپ مرحلے کے دوران اس کے ساتھ کھیلنا چاہتے ہیں۔

اس کے علاوہ، Kubernetes کے ساتھ بات چیت کرنے اور اس میں تعینات کرنے کے قابل ہونے کے لیے، ہمیں gitlab-runner کے ذریعے تیار کردہ پوڈز کے لیے ایک کردار ترتیب دینے کی ضرورت ہے۔

ایسا کرنے کے لیے، آئیے gitlab-runner کے ساتھ ڈائریکٹری میں جائیں:

cd deploy/gitlab-runner

اور ایک نیا جزو شامل کریں۔ components/rbac.jsonnet:

local env = {
  name: std.extVar('qbec.io/env'),
  namespace: std.extVar('qbec.io/defaultNs'),
};
local p = import '../params.libsonnet';
local params = p.components.rbac;

[
  {
    apiVersion: 'v1',
    kind: 'ServiceAccount',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'Role',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    rules: [
      {
        apiGroups: [
          '*',
        ],
        resources: [
          '*',
        ],
        verbs: [
          '*',
        ],
      },
    ],
  },
  {
    apiVersion: 'rbac.authorization.k8s.io/v1',
    kind: 'RoleBinding',
    metadata: {
      labels: {
        app: params.name,
      },
      name: params.name,
    },
    roleRef: {
      apiGroup: 'rbac.authorization.k8s.io',
      kind: 'Role',
      name: params.name,
    },
    subjects: [
      {
        kind: 'ServiceAccount',
        name: params.name,
        namespace: env.namespace,
      },
    ],
  },
]

ہم نئے پیرامیٹرز کو بھی بیان کریں گے۔ ماحول/base.libsonnet، جو اب اس طرح لگتا ہے:

local secrets = import '../secrets/base.libsonnet';

{
  components: {
    gitlabRunner: {
      name: 'gitlab-runner',
      values: {
        gitlabUrl: 'https://gitlab.com/',
        rbac: {
          create: true,
        },
        runnerRegistrationToken: secrets.runnerRegistrationToken,
        runners: {
          serviceAccountName: $.components.rbac.name,
          image: 'registry.gitlab.com/kvaps/docs.example.org/toolbox:v0.0.1',
        },
      },
    },
    rbac: {
      name: 'gitlab-runner-deploy',
    },
  },
}

توجہ دینا $.components.rbac.name سے مراد نام اجزاء کے لئے آر بی اے سی

آئیے چیک کریں کہ کیا بدلا ہے:

qbec diff default

اور ہماری تبدیلیوں کو Kubernetes پر لاگو کریں:

qbec apply default

نیز، گٹ میں ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

cd ../..
git add dockerfiles/toolbox
git commit -m "Add Dockerfile for toolbox"
git add deploy/gitlab-runner
git commit -m "Configure gitlab-runner to use toolbox"

9. ہماری پہلی پائپ لائن اور ٹیگز کے ذریعے تصاویر کی اسمبلی

منصوبے کی جڑ میں ہم تخلیق کریں گے gitlab-ci.yml مندرجہ ذیل مواد کے ساتھ:

.build_docker_image:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug-v0.15.0
    entrypoint: [""]
  before_script:
    - echo "{"auths":{"$CI_REGISTRY":{"username":"$CI_REGISTRY_USER","password":"$CI_REGISTRY_PASSWORD"}}}" > /kaniko/.docker/config.json

build_toolbox:
  extends: .build_docker_image
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/toolbox --dockerfile $CI_PROJECT_DIR/dockerfiles/toolbox/Dockerfile --destination $CI_REGISTRY_IMAGE/toolbox:$CI_COMMIT_TAG
  only:
    refs:
      - tags

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_TAG
  only:
    refs:
      - tags

براہ کرم نوٹ کریں کہ ہم استعمال کرتے ہیں۔ GIT_SUBMODULE_STRATEGY: نارمل ان ملازمتوں کے لئے جہاں آپ کو عمل درآمد سے پہلے واضح طور پر ذیلی ماڈلز کو شروع کرنے کی ضرورت ہے۔

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add .gitlab-ci.yml
git commit -m "Automate docker build"

میرے خیال میں ہم اسے محفوظ طریقے سے ورژن کہہ سکتے ہیں۔ v0.0.1 اور ٹیگ شامل کریں:

git tag v0.0.1

جب بھی ہمیں نیا ورژن جاری کرنے کی ضرورت ہوگی ہم ٹیگ شامل کریں گے۔ ڈوکر امیجز میں ٹیگز گٹ ٹیگز سے منسلک ہوں گے۔ ایک نئے ٹیگ کے ساتھ ہر دھکا اس ٹیگ کے ساتھ امیجز کی تعمیر کو شروع کرے گا۔

چلو کرتے ہیں git push --tags، اور آئیے اپنی پہلی پائپ لائن کو دیکھیں:

پہلی پائپ لائن کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

آپ کی توجہ اس حقیقت کی طرف مبذول کروانے کے قابل ہے کہ ٹیگز کے ذریعے اسمبلی کرنا ڈاکر امیجز بنانے کے لیے موزوں ہے، لیکن یہ Kubernetes پر ایپلیکیشن کی تعیناتی کے لیے موزوں نہیں ہے۔ چونکہ نئے ٹیگز پرانے عہدوں کو تفویض کیے جاسکتے ہیں، اس صورت میں، ان کے لیے پائپ لائن شروع کرنا پرانے ورژن کی تعیناتی کا باعث بنے گا۔

اس مسئلے کو حل کرنے کے لیے، عام طور پر ڈاکر امیجز کی تعمیر کو ٹیگز سے جوڑا جاتا ہے، اور ایپلی کیشن کو کسی برانچ میں تعینات کیا جاتا ہے۔ ماسٹر، جس میں جمع کردہ تصاویر کے ورژن ہارڈ کوڈ کیے گئے ہیں۔ یہ وہ جگہ ہے جہاں آپ ایک سادہ واپسی کے ساتھ رول بیک شروع کر سکتے ہیں۔ ماسٹر- شاخیں

10. تعیناتی کا آٹومیشن

Gitlab-runner کے لیے ہمارے راز کو ڈکرپٹ کرنے کے لیے، ہمیں ریپوزٹری کلید کو ایکسپورٹ کرنے اور اسے اپنے CI ماحولیاتی متغیرات میں شامل کرنے کی ضرورت ہوگی:

git crypt export-key /tmp/docs-repo.key
base64 -w0 /tmp/docs-repo.key; echo

ہم نتیجے میں آنے والی لائن کو Gitlab میں محفوظ کریں گے؛ ایسا کرنے کے لیے، آئیے اپنے پروجیکٹ کی ترتیبات پر جائیں:
ترتیبات -> CI / CD -> متغیرات

اور آئیے ایک نیا متغیر بنائیں:

قسم
کلیدی
قدر
محفوظ
ماسک
گنجائش

File
GITCRYPT_KEY
<your string>
true (تربیت کے دوران آپ کر سکتے ہیں۔ false)
true
All environments

شامل کردہ متغیر کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

اب ہم اپ ڈیٹ کرتے ہیں۔ gitlab-ci.yml اس میں اضافہ کرنا:

.deploy_qbec_app:
  stage: deploy
  only:
    refs:
      - master

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes

deploy_website:
  extends: .deploy_qbec_app
  script:
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes

یہاں ہم نے qbec کے لیے کئی نئے آپشنز کو فعال کیا ہے:

  • --root some/app - آپ کو ایک مخصوص ایپلی کیشن کی ڈائرکٹری کا تعین کرنے کی اجازت دیتا ہے۔
  • --force:k8s-context __incluster__ - یہ ایک جادوئی متغیر ہے جو کہتا ہے کہ تعیناتی اسی کلسٹر میں ہوگی جس میں gtilab-runner چل رہا ہے۔ یہ ضروری ہے کیونکہ بصورت دیگر qbec آپ کے kubeconfig میں مناسب Kubernetes سرور تلاش کرنے کی کوشش کرے گا۔
  • --انتظار کرو — qbec کو اس وقت تک انتظار کرنے پر مجبور کرتا ہے جب تک کہ اس کے ذریعہ بنائے گئے وسائل تیار حالت میں نہ جائیں اور تب ہی کامیاب ایگزٹ کوڈ کے ساتھ باہر نکلیں۔
  • -جی ہاں - صرف انٹرایکٹو شیل کو غیر فعال کرتا ہے۔ کیا تمہیں یقین ہے؟ جب تعینات کیا جاتا ہے.

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add .gitlab-ci.yml
git commit -m "Automate deploy"

اور اس کے بعد گٹ دھکا ہم دیکھیں گے کہ ہماری درخواستوں کو کیسے تعینات کیا گیا ہے:

دوسری پائپ لائن کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

11. آرٹفیکٹس اور اسمبلی جب ماسٹر کی طرف دھکیلتے ہیں۔

عام طور پر، اوپر بیان کیے گئے اقدامات تقریباً کسی بھی مائیکرو سروس کو بنانے اور فراہم کرنے کے لیے کافی ہیں، لیکن جب بھی ہمیں سائٹ کو اپ ڈیٹ کرنے کی ضرورت ہو ہم ہر بار ٹیگ شامل نہیں کرنا چاہتے۔ لہذا، ہم ایک زیادہ متحرک راستہ اختیار کریں گے اور ماسٹر برانچ میں ڈائجسٹ کی تعیناتی قائم کریں گے۔

خیال آسان ہے: اب ہماری تصویر ویب سائٹ ہر بار جب آپ اندر جائیں گے دوبارہ تعمیر کیا جائے گا۔ ماسٹر، اور پھر خود بخود Kubernetes میں تعینات ہو جاتا ہے۔

آئیے اپنے میں ان دو ملازمتوں کو اپ ڈیٹ کریں۔ gitlab-ci.yml:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/
  only:
    refs:
      - master
      - tags

deploy_website:
  extends: .deploy_qbec_app
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

براہ کرم نوٹ کریں کہ ہم نے ایک دھاگہ شامل کیا ہے۔ ماسٹر к ردعمل ملازمتوں کے لیے build_website اور اب ہم استعمال کرتے ہیں $CI_COMMIT_REF_NAME کے بجائے $CI_COMMIT_TAG، یعنی، ہم گٹ میں ٹیگز سے کھل گئے ہیں اور اب ہم کمٹ برانچ کے نام کے ساتھ ایک تصویر کو آگے بڑھائیں گے جس نے پائپ لائن کو شروع کیا تھا۔ یہ بات قابل غور ہے کہ یہ ٹیگز کے ساتھ بھی کام کرے گا، جو ہمیں docker-رجسٹری میں مخصوص ورژن والی سائٹ کے سنیپ شاٹس کو محفوظ کرنے کی اجازت دے گا۔

جب سائٹ کے نئے ورژن کے لیے ڈاکر ٹیگ کے نام میں کوئی تبدیلی نہیں کی جا سکتی ہے، تب بھی ہمیں Kubernetes میں ہونے والی تبدیلیوں کو بیان کرنا چاہیے، بصورت دیگر یہ نئی تصویر سے ایپلیکیشن کو دوبارہ تعینات نہیں کرے گا، کیونکہ اسے تعیناتی میں کوئی تبدیلی نظر نہیں آئے گی۔ ظاہر

آپشن —vm:ext-str ڈائجسٹ=”$DIGEST” qbec کے لئے - آپ کو ایک بیرونی متغیر کو jsonnet میں منتقل کرنے کی اجازت دیتا ہے۔ ہم چاہتے ہیں کہ اسے ہماری درخواست کی ہر ریلیز کے ساتھ کلسٹر میں دوبارہ تعینات کیا جائے۔ ہم اب ٹیگ کا نام استعمال نہیں کر سکتے، جو اب ناقابل تبدیلی ہو سکتا ہے، کیونکہ ہمیں تصویر کے مخصوص ورژن سے منسلک ہونے کی ضرورت ہے اور جب یہ تبدیل ہوتا ہے تو تعیناتی کو متحرک کرنا پڑتا ہے۔

یہاں ہمیں کنیکو کی ڈائجسٹ امیج کو فائل میں محفوظ کرنے کی صلاحیت سے مدد ملے گی (آپشن --ڈائجسٹ فائل)
پھر ہم اس فائل کو منتقل کریں گے اور تعیناتی کے وقت اسے پڑھیں گے۔

آئیے اپنے پیرامیٹرز کو اپ ڈیٹ کریں۔ deploy/website/environments/base.libsonnet جو اب اس طرح نظر آئے گا:

{
  components: {
    website: {
      name: 'example-docs',
      image: 'registry.gitlab.com/kvaps/docs.example.org/website@' + std.extVar('digest'),
      replicas: 1,
      containerPort: 80,
      servicePort: 80,
      nodeSelector: {},
      tolerations: [],
      ingressClass: 'nginx',
      domain: 'docs.example.org',
    },
  },
}

ہو گیا، اب کوئی بھی کمٹ ماسٹر کے لیے ڈاکر امیج کی تعمیر کو شروع کرتا ہے۔ ویب سائٹ، اور پھر اسے Kubernetes پر تعینات کریں۔

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add .
git commit -m "Configure dynamic build"

ہم بعد میں چیک کریں گے۔ گٹ دھکا ہمیں اس طرح کچھ دیکھنا چاہئے:

ماسٹر کے لیے پائپ لائن کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

اصولی طور پر، ہمیں ہر دھکے کے ساتھ گٹ لیب رنر کو دوبارہ تعینات کرنے کی ضرورت نہیں ہے، جب تک کہ اس کی ترتیب میں کچھ بھی نہیں بدلا ہے، آئیے اسے ٹھیک کرتے ہیں۔ gitlab-ci.yml:

deploy_gitlab_runner:
  extends: .deploy_qbec_app
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  before_script:
    - base64 -d "$GITCRYPT_KEY" | git-crypt unlock -
  script:
    - qbec apply default --root deploy/gitlab-runner --force:k8s-context __incluster__ --wait --yes
  only:
    changes:
      - deploy/gitlab-runner/**/*

تبدیلیاں میں تبدیلیوں کی نگرانی کرنے کی اجازت دے گا۔ deploy/gitlab-runner/ اور ہمارا کام صرف اس صورت میں شروع کرے گا جب کوئی ہو۔

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add .gitlab-ci.yml
git commit -m "Reduce gitlab-runner deploy"

گٹ دھکا، یہ بہتر ہے:

اپ ڈیٹ شدہ پائپ لائن کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

12. متحرک ماحول

اب وقت آگیا ہے کہ ہم اپنی پائپ لائن کو متحرک ماحول کے ساتھ متنوع بنائیں۔

سب سے پہلے، آئیے کام کو اپ ڈیٹ کریں۔ build_website ہمارے میں gitlab-ci.ymlاس سے بلاک کو ہٹانا صرف، جو Gitlab کو کسی بھی برانچ سے کسی بھی عہد پر اسے متحرک کرنے پر مجبور کرے گا:

build_website:
  extends: .build_docker_image
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - mkdir -p $CI_PROJECT_DIR/artifacts
    - /kaniko/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/website/Dockerfile --destination $CI_REGISTRY_IMAGE/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR/artifacts/website.digest
  artifacts:
    paths:
      - artifacts/

پھر کام کو اپ ڈیٹ کریں۔ deploy_website، وہاں ایک بلاک شامل کریں۔ ماحول:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

یہ Gitlab کو کام کے ساتھ منسلک کرنے کی اجازت دے گا۔ پرو ماحول اور اس کا صحیح لنک ڈسپلے کریں۔

اب دو مزید ملازمتیں شامل کریں:

deploy_website:
  extends: .deploy_qbec_app
  environment:
    name: prod
    url: https://docs.example.org
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply default --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST"

deploy_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: http://$CI_ENVIRONMENT_SLUG.docs.example.org
    on_stop: stop_review
  script:
    - DIGEST="$(cat artifacts/website.digest)"
    - qbec apply review --root deploy/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  only:
    refs:
    - branches
  except:
    refs:
      - master

stop_review:
  extends: .deploy_qbec_app
  environment:
    name: review/$CI_COMMIT_REF_NAME
    action: stop
  stage: deploy
  before_script:
    - git clone "$CI_REPOSITORY_URL" master
    - cd master
  script:
    - qbec delete review --root deploy/website --force:k8s-context __incluster__ --yes --vm:ext-str digest="$DIGEST" --vm:ext-str subdomain="$CI_ENVIRONMENT_SLUG" --app-tag "$CI_ENVIRONMENT_SLUG"
  variables:
    GIT_STRATEGY: none
  only:
    refs:
    - branches
  except:
    refs:
      - master
  when: manual

انہیں ماسٹر کے علاوہ کسی بھی برانچ میں دھکیلنے پر لانچ کیا جائے گا اور سائٹ کے پیش نظارہ ورژن کو تعینات کیا جائے گا۔

ہم qbec کے لیے ایک نیا آپشن دیکھتے ہیں: --ایپ ٹیگ — یہ آپ کو ایپلیکیشن کے متعین ورژنز کو ٹیگ کرنے اور صرف اس ٹیگ کے اندر کام کرنے کی اجازت دیتا ہے؛ جب Kubernetes میں وسائل تخلیق اور تباہ کرتے ہیں، qbec صرف ان کے ساتھ کام کرے گا۔
اس طرح ہم ہر جائزے کے لیے الگ ماحول نہیں بنا سکتے، بلکہ صرف ایک ہی کو دوبارہ استعمال کر سکتے ہیں۔

یہاں ہم بھی استعمال کرتے ہیں۔ qbec نظرثانی کا اطلاق کریں۔کے بجائے qbec ڈیفالٹ لاگو کریں۔ - یہ بالکل وہی لمحہ ہے جب ہم اپنے ماحول کے فرق کو بیان کرنے کی کوشش کریں گے (جائزہ اور طے شدہ):

آئیے شامل کریں۔ کا جائزہ لینے کے میں ماحول deploy/website/qbec.yaml

spec:
  environments:
    review:
      defaultNamespace: docs
      server: https://kubernetes.example.org:8443

پھر ہم اس کا اعلان کریں گے۔ deploy/website/params.libsonnet:

local env = std.extVar('qbec.io/env');
local paramsMap = {
  _: import './environments/base.libsonnet',
  default: import './environments/default.libsonnet',
  review: import './environments/review.libsonnet',
};

if std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile

اور اس کے لیے حسب ضرورت پیرامیٹرز لکھیں۔ deploy/website/environments/review.libsonnet:

// this file has the param overrides for the default environment
local base = import './base.libsonnet';
local slug = std.extVar('qbec.io/tag');
local subdomain = std.extVar('subdomain');

base {
  components+: {
    website+: {
      name: 'example-docs-' + slug,
      domain: subdomain + '.docs.example.org',
    },
  },
}

آئیے جاب کو بھی قریب سے دیکھتے ہیں۔ stop_review، یہ اس وقت متحرک ہو جائے گا جب برانچ کو حذف کر دیا جائے گا اور تاکہ گٹلیب چیک آؤٹ کرنے کی کوشش نہ کرے اسے استعمال کیا جاتا ہے۔ GIT_STRATEGY: کوئی نہیں۔، بعد میں ہم کلون کرتے ہیں۔ ماسٹر- برانچ کریں اور اس کے ذریعے جائزہ حذف کریں۔
یہ تھوڑا سا الجھا ہوا ہے، لیکن مجھے ابھی تک اس سے زیادہ خوبصورت طریقہ نہیں ملا۔
ایک متبادل آپشن یہ ہو گا کہ ہر جائزے کو ہوٹل کے نام کی جگہ پر تعینات کیا جائے، جسے ہمیشہ مکمل طور پر منہدم کیا جا سکتا ہے۔

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add .
git commit -m "Enable automatic review"

گٹ دھکا, git checkout -b ٹیسٹ, گٹ پش اوریجن ٹیسٹچیک کریں:

Gitlab میں بنائے گئے ماحول کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

سب کچھ کام کر رہا ہے؟ - بہت اچھا، ہماری ٹیسٹ برانچ کو حذف کریں: گیٹ چیک آؤٹ ماسٹر, git push origin: test، ہم جانچتے ہیں کہ ماحول کو حذف کرنے والی ملازمتیں بغیر کسی غلطی کے کام کرتی ہیں۔

یہاں میں فوری طور پر واضح کرنا چاہوں گا کہ کسی پروجیکٹ میں کوئی بھی ڈویلپر برانچ بنا سکتا ہے، وہ تبدیل بھی کر سکتا ہے۔ gitlab-ci.yml فائل اور خفیہ متغیرات تک رسائی حاصل کریں۔
لہذا، یہ سختی سے سفارش کی جاتی ہے کہ ان کے استعمال کی اجازت صرف محفوظ شاخوں کے لیے، مثال کے طور پر میں ماسٹر، یا ہر ماحول کے لیے متغیرات کا الگ سیٹ بنائیں۔

13. ایپس کا جائزہ لیں۔

ایپس کا جائزہ لیں۔ یہ ایک GitLab خصوصیت ہے جو آپ کو ذخیرہ میں موجود ہر فائل کے لیے ایک بٹن شامل کرنے کی اجازت دیتی ہے تاکہ اسے تعینات ماحول میں تیزی سے دیکھا جا سکے۔

ان بٹنوں کے ظاہر ہونے کے لیے، آپ کو ایک فائل بنانے کی ضرورت ہے۔ gitlab/route-map.yml اور اس میں راستے کی تمام تبدیلیوں کو بیان کریں؛ ہمارے معاملے میں یہ بہت آسان ہوگا:

# Indices
- source: /content/(.+?)_index.(md|html)/ 
  public: '1'

# Pages
- source: /content/(.+?).(md|html)/ 
  public: '1/'

ہماری تبدیلیوں کا ارتکاب کرنا نہ بھولیں:

git add .gitlab/
git commit -m "Enable review apps"

گٹ دھکا، اور چیک کریں:

ریویو ایپ بٹن کا اسکرین شاٹ

Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

کام ہو گیا!

پروجیکٹ کے ذرائع:

آپ کی توجہ کا شکریہ، مجھے امید ہے کہ آپ کو یہ پسند آیا ہوگا۔ Kubernetes میں تعمیر اور خودکار تعیناتی کے لیے نئے ٹولز آزما رہے ہیں۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں