ഡോക്കർ കണ്ടെയ്‌നറുകളിൽ നിന്ന് CI/CD പരിതസ്ഥിതികളിലെ ഹോസ്റ്റിലേക്ക് ബിൽഡ് ആർട്ടിഫാക്‌റ്റുകൾ കൈമാറുന്നു

ഡോക്കർ കണ്ടെയ്‌നറുകളിൽ നിന്ന് CI/CD പരിതസ്ഥിതികളിലെ ഹോസ്റ്റിലേക്ക് ബിൽഡ് ആർട്ടിഫാക്‌റ്റുകൾ കൈമാറുന്നു
ഡോക്കർ കണ്ടെയ്‌നറുകളിൽ നിന്ന് CI/CD പരിതസ്ഥിതികളിലെ ഹോസ്റ്റിലേക്ക് ബിൽഡ് ആർട്ടിഫാക്‌റ്റുകൾ കൈമാറുന്നു

സിഐ/സിഡിയിൽ ഡിപൻഡൻസി മാനേജ്മെൻ്റിനായി ഡോക്കർ ഉപയോഗിക്കുന്നു

ഡിപൻഡൻസികൾ കൈകാര്യം ചെയ്യുന്നതിനും പരിതസ്ഥിതികൾ നിർമ്മിക്കുന്നതിനുമുള്ള കാര്യക്ഷമമായ മാർഗം ഡോക്കർ നൽകുന്നു, പ്രത്യേകിച്ച് തുടർച്ചയായ ഏകീകരണ (സിഐ) സജ്ജീകരണങ്ങളിൽ. ഡോക്കർ കണ്ടെയ്‌നറുകൾ ഉപയോഗിക്കുന്നതിലൂടെ, നിങ്ങളുടെ സിഐ ഏജൻ്റുമാരിൽ വിവിധ റൺടൈമുകളും ലൈബ്രറികളും ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനുള്ള ബുദ്ധിമുട്ട് നിങ്ങൾക്ക് ഒഴിവാക്കാനാകും, സ്ഥിരവും ഒറ്റപ്പെട്ടതുമായ ബിൽഡ് പ്രോസസ്സ് ഉറപ്പാക്കുന്നു.

അത്തരം വർക്ക്ഫ്ലോകളിലെ ഒരു പൊതുവായ ആവശ്യകത കണ്ടെയ്നറിൽ നിന്ന് ഹോസ്റ്റ് മെഷീനിലേക്ക് ബിൽഡ് ആർട്ടിഫാക്റ്റുകൾ കൈമാറാനുള്ള കഴിവാണ്. തത്ഫലമായുണ്ടാകുന്ന ഫയലുകൾ ആവശ്യാനുസരണം ഉപയോഗിക്കാനോ വിന്യസിക്കാനോ കഴിയുമെന്ന് ഇത് ഉറപ്പാക്കുന്നു. എന്നാൽ നിങ്ങളുടെ CI പൈപ്പ്‌ലൈനിൽ ഇത് എങ്ങനെ കാര്യക്ഷമമായി നേടാനാകും? ഓപ്ഷനുകൾ പര്യവേക്ഷണം ചെയ്യാം.

കമാൻഡ് വിവരണം
docker cp ഒരു കണ്ടെയ്‌നറിനും ലോക്കൽ ഫയൽസിസ്റ്റത്തിനും ഇടയിൽ ഫയലുകൾ/ഫോൾഡറുകൾ പകർത്തുന്നു
docker volume rm ഒരു നിർദ്ദിഷ്ട ഡോക്കർ വോളിയം നീക്കംചെയ്യുന്നു
client.images.build പൈത്തണിനായുള്ള ഡോക്കർ SDK ഉപയോഗിച്ച് നിർദ്ദിഷ്ട പാതയിൽ നിന്ന് ഒരു ഡോക്കർ ഇമേജ് നിർമ്മിക്കുന്നു
client.containers.run പൈത്തണിനായുള്ള ഡോക്കർ SDK ഉപയോഗിച്ച് ഒരു ചിത്രത്തിൽ നിന്ന് ഒരു ഡോക്കർ കണ്ടെയ്‌നർ സൃഷ്‌ടിക്കുകയും ആരംഭിക്കുകയും ചെയ്യുന്നു
container.stop() പൈത്തണിനായുള്ള ഡോക്കർ SDK ഉപയോഗിച്ച് പ്രവർത്തിക്കുന്ന കണ്ടെയ്നർ നിർത്തുന്നു
container.remove() പൈത്തണിനായുള്ള ഡോക്കർ SDK ഉപയോഗിച്ച് ഒരു കണ്ടെയ്നർ നീക്കംചെയ്യുന്നു
client.volumes.get പൈത്തണിനുള്ള ഡോക്കർ SDK ഉപയോഗിച്ച് പേര് പ്രകാരം ഒരു ഡോക്കർ വോളിയം വീണ്ടെടുക്കുന്നു

ഡോക്കർ ആർട്ടിഫാക്റ്റ് ട്രാൻസ്ഫർ സ്ക്രിപ്റ്റുകളുടെ വിശദമായ വിശദീകരണം

നൽകിയിരിക്കുന്ന സ്ക്രിപ്റ്റുകളിൽ, ഡോക്കർ ഇമേജ് നിർമ്മിക്കുന്നതിലൂടെ പ്രക്രിയ ആരംഭിക്കുന്നു docker build -t my-build-image . കമാൻഡ്. ഈ കമാൻഡ് നിലവിലെ ഡയറക്‌ടറിയിൽ സ്ഥിതിചെയ്യുന്ന ഒരു ഡോക്കർ ഫയലിൽ നിന്ന് ഒരു ഡോക്കർ ഇമേജ് കംപൈൽ ചെയ്യുന്നു, അതിനെ ടാഗ് ചെയ്യുന്നു my-build-image. ചിത്രം നിർമ്മിച്ചുകഴിഞ്ഞാൽ, അടുത്ത ഘട്ടത്തിൽ ഈ ചിത്രത്തിൽ നിന്ന് ഒരു കണ്ടെയ്‌നർ പ്രവർത്തിപ്പിക്കുന്നത് ഉൾപ്പെടുന്നു docker run --name my-build-container -v build_volume:/build my-build-image. ഈ കമാൻഡ് എന്ന പേരിൽ ഒരു പുതിയ കണ്ടെയ്നർ ആരംഭിക്കുന്നു my-build-container എന്ന പേരിൽ ഒരു ഡോക്കർ വോളിയം മൗണ്ട് ചെയ്യുന്നു build_volume ലേക്ക് /build കണ്ടെയ്നറിനുള്ളിലെ ഡയറക്ടറി. കണ്ടെയ്‌നറിൻ്റെ ഓട്ടത്തിനിടയിൽ ജനറേറ്റ് ചെയ്‌ത ഡാറ്റ നിലനിർത്താൻ വോളിയം സഹായിക്കുന്നു.

ബിൽഡ് ആർട്ടിഫാക്‌റ്റുകൾ കണ്ടെയ്‌നറിൽ നിന്ന് ഹോസ്റ്റിലേക്ക് പകർത്താൻ, കമാൻഡ് docker cp my-build-container:/path/to/build/artifacts/. /path/on/host ഉപയോഗിക്കുന്നു. ഈ കമാൻഡ് കണ്ടെയ്‌നറിനുള്ളിലെ ഉറവിട ഡയറക്ടറിയും ഹോസ്റ്റ് മെഷീനിലെ ഡെസ്റ്റിനേഷൻ ഡയറക്ടറിയും വ്യക്തമാക്കുന്നു. പകർത്തൽ പൂർത്തിയായിക്കഴിഞ്ഞാൽ, ഉപയോഗിച്ച് കണ്ടെയ്നർ നിർത്താനും നീക്കം ചെയ്യാനും വൃത്തിയാക്കൽ പ്രവർത്തനങ്ങൾ നടത്തുന്നു docker stop my-build-container ഒപ്പം docker rm my-build-container യഥാക്രമം. വോളിയം ഇനി ആവശ്യമില്ലെങ്കിൽ, അത് ഉപയോഗിച്ച് നീക്കം ചെയ്യാം docker volume rm build_volume.

CI/CD പൈപ്പ്ലൈൻ ഉദാഹരണത്തിൽ, YAML കോൺഫിഗറേഷൻ ഈ ഘട്ടങ്ങൾ ഓട്ടോമേറ്റ് ചെയ്യുന്നു. ദി docker build, docker run, ഒപ്പം docker cp പൈപ്പ്ലൈനിൻ്റെ ബിൽഡ് സ്റ്റേജിൻ്റെ ഭാഗമായി പ്രവർത്തിക്കാൻ കമാൻഡുകൾ സ്ക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു, ബിൽഡ് എൻവയോൺമെൻ്റ് സ്ഥിരമായി പുനഃസൃഷ്ടിക്കപ്പെടുന്നുവെന്ന് ഉറപ്പാക്കുന്നു. അതുപോലെ, ഡോക്കർ ഓപ്പറേഷനുകൾ പ്രോഗ്രമാറ്റിക്കായി കൈകാര്യം ചെയ്യാൻ പൈത്തണിനായി ഡോക്കർ എസ്ഡികെ ഉപയോഗിക്കുന്നത് പൈത്തൺ സ്ക്രിപ്റ്റ് കാണിക്കുന്നു. ഇത് ഒരു ഡോക്കർ ക്ലയൻ്റ് ആരംഭിക്കുന്നു client = docker.from_env(), ഉപയോഗിച്ച് ചിത്രം നിർമ്മിക്കുന്നു client.images.build, ഒപ്പം കണ്ടെയ്നർ പ്രവർത്തിപ്പിക്കുന്നു client.containers.run. സ്ക്രിപ്റ്റ് ഉപയോഗിച്ച് പുരാവസ്തുക്കൾ പകർത്തുന്നു os.system(f"docker cp {container.id}:/path/to/build/artifacts/. /path/on/host"), ഒടുവിൽ, അത് ഉപയോഗിച്ച് കണ്ടെയ്നറും വോളിയവും നിർത്തുകയും നീക്കം ചെയ്യുകയും ചെയ്യുന്നു container.stop(), container.remove(), ഒപ്പം client.volumes.get('build_volume').remove(). ഈ സമീപനം പൂർണ്ണമായും യാന്ത്രികവും കാര്യക്ഷമവുമായ ആർട്ടിഫാക്റ്റ് കൈമാറ്റ പ്രക്രിയ ഉറപ്പാക്കുന്നു.

ഡോക്കർ കണ്ടെയ്‌നറിൽ നിന്ന് ഹോസ്റ്റിലേക്ക് ബിൽഡ് ആർട്ടിഫാക്‌റ്റുകൾ പകർത്തുന്നു

ഫയലുകൾ പകർത്തുന്നതിനുള്ള ഷെൽ സ്ക്രിപ്റ്റ്

# Step 1: Build the Docker image
docker build -t my-build-image .

# Step 2: Run the Docker container and create a named volume
docker run --name my-build-container -v build_volume:/build my-build-image

# Step 3: Copy the build artifacts to the volume
docker cp my-build-container:/path/to/build/artifacts/. /path/on/host

# Step 4: Cleanup - stop and remove the container
docker stop my-build-container
docker rm my-build-container

# Step 5: Optionally remove the volume if it's no longer needed
docker volume rm build_volume

സിഐ പൈപ്പ്ലൈനിൽ ആർട്ടിഫാക്റ്റ് ട്രാൻസ്ഫർ ഓട്ടോമേറ്റ് ചെയ്യുന്നു

CI/CD പൈപ്പ്ലൈനിനായുള്ള YAML കോൺഫിഗറേഷൻ

stages:
  - build
  - deploy

build:
  stage: build
  script:
    - docker build -t my-build-image .
    - docker run --name my-build-container -v build_volume:/build my-build-image
    - docker cp my-build-container:/path/to/build/artifacts/. /path/on/host
    - docker stop my-build-container
    - docker rm my-build-container
    - docker volume rm build_volume

deploy:
  stage: deploy
  script:
    - echo "Deploying build artifacts..."
    - ./deploy.sh

ഡോക്കർ ആർട്ടിഫാക്‌റ്റുകൾ പകർത്തുന്നതിനുള്ള പൈത്തൺ സ്‌ക്രിപ്റ്റ്

ഡോക്കർ SDK ഉപയോഗിച്ച് പൈത്തൺ ഉപയോഗിക്കുന്നു

import docker
import os

# Initialize Docker client
client = docker.from_env()

# Build the Docker image
image = client.images.build(path=".", tag="my-build-image")[0]

# Run the Docker container
container = client.containers.run(image.id, name="my-build-container", detach=True)

# Copy the build artifacts to the host
os.system(f"docker cp {container.id}:/path/to/build/artifacts/. /path/on/host")

# Cleanup - stop and remove the container
container.stop()
container.remove()

# Optionally remove the volume if it's no longer needed
client.volumes.get('build_volume').remove()

CI/CD വർക്ക്ഫ്ലോകൾക്കായി ഡോക്കർ ഒപ്റ്റിമൈസ് ചെയ്യുന്നു

CI/CD പരിതസ്ഥിതികളിൽ ഡോക്കർ ഉപയോഗിക്കുന്നത് ഡിപൻഡൻസി മാനേജ്മെൻ്റ് ലളിതമാക്കുക മാത്രമല്ല, പൈപ്പ്ലൈനിൻ്റെ വിവിധ ഘട്ടങ്ങളിലുടനീളം സ്കേലബിളിറ്റിയും സ്ഥിരതയും വർദ്ധിപ്പിക്കുകയും ചെയ്യുന്നു. ജെങ്കിൻസ്, GitLab CI, CircleCI എന്നിവ പോലെയുള്ള വിവിധ CI/CD ടൂളുകളുമായുള്ള ഡോക്കറിൻ്റെ സംയോജനമാണ് പലപ്പോഴും അവഗണിക്കപ്പെടുന്ന ഒരു വശം. ഈ സംയോജനങ്ങൾ കൂടുതൽ കരുത്തുറ്റ ഓട്ടോമേഷൻ അനുവദിക്കുകയും ബിൽഡുകളും വിന്യാസങ്ങളും കൈകാര്യം ചെയ്യുന്നതിലെ മാനുവൽ ഓവർഹെഡ് വളരെ കുറയ്ക്കുകയും ചെയ്യും. ഡോക്കറുടെ കഴിവുകൾ പ്രയോജനപ്പെടുത്തുന്നതിലൂടെ, ടീമുകൾക്ക് അവരുടെ പൈപ്പ്ലൈനിൻ്റെ ഓരോ ഘട്ടവും, കോഡ് കംപൈലേഷൻ മുതൽ ടെസ്റ്റിംഗും വിന്യാസവും വരെ, നിയന്ത്രിതവും പുനരുൽപ്പാദിപ്പിക്കാവുന്നതുമായ പരിതസ്ഥിതിയിൽ പ്രവർത്തിക്കുന്നുവെന്ന് ഉറപ്പാക്കാൻ കഴിയും.

പരിഗണിക്കേണ്ട മറ്റൊരു പ്രധാന വശം ഡോക്കർഫയലുകളിലെ മൾട്ടി-സ്റ്റേജ് ബിൽഡുകളുടെ ഉപയോഗമാണ്. റൺടൈം എൻവയോൺമെൻ്റിൽ നിന്ന് ബിൽഡ് എൻവയോൺമെൻ്റ് വേർതിരിക്കുന്നതിലൂടെ ഡവലപ്പർമാരെ അവരുടെ ഡോക്കർ ഇമേജുകൾ ഒപ്റ്റിമൈസ് ചെയ്യാൻ മൾട്ടി-സ്റ്റേജ് ബിൽഡുകൾ അനുവദിക്കുന്നു. ഇത് കൈകാര്യം ചെയ്യാനും വിന്യസിക്കാനും എളുപ്പമുള്ള ചെറുതും കൂടുതൽ കാര്യക്ഷമവുമായ ഇമേജുകൾക്ക് കാരണമാകുന്നു. കൂടാതെ, ഡോക്കർ വോള്യങ്ങളും ബൈൻഡ് മൗണ്ടുകളും ഉപയോഗിക്കുന്നത് ഫയൽ I/O ഓപ്പറേഷനുകളുടെ പ്രകടനം ഗണ്യമായി മെച്ചപ്പെടുത്തും, ഇത് വലിയ ബിൽഡ് ആർട്ടിഫാക്‌റ്റുകളോ ഡാറ്റാസെറ്റുകളോ കൈകാര്യം ചെയ്യുമ്പോൾ പ്രത്യേകിച്ചും പ്രയോജനകരമാണ്. ഈ തന്ത്രങ്ങൾ CI/CD പ്രോസസ്സ് കാര്യക്ഷമമാക്കുക മാത്രമല്ല, കൂടുതൽ സുരക്ഷിതവും പരിപാലിക്കാൻ കഴിയുന്നതുമായ ഡോക്കർ ഇമേജുകൾക്ക് സംഭാവന നൽകുകയും ചെയ്യുന്നു.

ഡോക്കർ, സിഐ/സിഡി എന്നിവയെക്കുറിച്ചുള്ള പൊതുവായ ചോദ്യങ്ങളും ഉത്തരങ്ങളും

  1. ഡോക്കർ കണ്ടെയ്‌നറുകളിൽ എനിക്ക് എങ്ങനെ ഡാറ്റ നിലനിർത്താനാകും?
  2. നിങ്ങൾക്ക് ഉപയോഗിക്കാം Docker volumes അഥവാ bind mounts ഒരു കണ്ടെയ്‌നറിൻ്റെ ജീവിതചക്രത്തിനപ്പുറം ഡാറ്റ നിലനിർത്താൻ.
  3. മൾട്ടി-സ്റ്റേജ് ബിൽഡുകൾ ഉപയോഗിക്കുന്നതിൻ്റെ പ്രയോജനം എന്താണ്?
  4. ബിൽഡ്, റൺടൈം എൻവയോൺമെൻ്റുകൾ വേർതിരിച്ച് ചെറുതും കൂടുതൽ കാര്യക്ഷമവുമായ ഡോക്കർ ഇമേജുകൾ സൃഷ്ടിക്കാൻ മൾട്ടി-സ്റ്റേജ് ബിൽഡുകൾ സഹായിക്കുന്നു.
  5. ജെൻകിൻസുമായി ഡോക്കറെ എങ്ങനെ സംയോജിപ്പിക്കാം?
  6. ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഡോക്കറിനെ ജെങ്കിൻസുമായി സംയോജിപ്പിക്കാം Docker Pipeline നിർമ്മാണ പ്രക്രിയയിൽ ഡോക്കർ ചിത്രങ്ങളുമായും കണ്ടെയ്‌നറുകളുമായും സംവദിക്കാൻ ജെങ്കിൻസിനെ അനുവദിക്കുന്ന പ്ലഗിൻ.
  7. എന്താണ് ഡോക്കർ ബൈൻഡ് മൗണ്ടുകൾ?
  8. ഹോസ്റ്റും കണ്ടെയ്‌നറും തമ്മിൽ എളുപ്പത്തിൽ ഫയൽ പങ്കിടൽ സുഗമമാക്കിക്കൊണ്ട്, ഹോസ്റ്റ് ഫയൽസിസ്റ്റത്തിൽ നിന്ന് ഒരു ഡോക്കർ കണ്ടെയ്‌നറിലേക്ക് ഒരു ഫയലോ ഡയറക്‌ടറിയോ മൗണ്ട് ചെയ്യാൻ ബൈൻഡ് മൗണ്ടുകൾ നിങ്ങളെ അനുവദിക്കുന്നു.
  9. സിഐ/സിഡിയിൽ ഡോക്കർ കണ്ടെയ്‌നർ ക്ലീനപ്പ് എങ്ങനെ ഓട്ടോമേറ്റ് ചെയ്യാം?
  10. പോലുള്ള കമാൻഡുകൾ ഉപയോഗിച്ച് ഡോക്കർ കണ്ടെയ്‌നർ ക്ലീനപ്പ് ഓട്ടോമേറ്റ് ചെയ്യുക docker stop, docker rm, ഒപ്പം docker volume rm നിങ്ങളുടെ CI/CD സ്ക്രിപ്റ്റുകളുടെ അവസാനം.
  11. എന്താണ് ഡോക്കർ വോളിയം?
  12. ഡോക്കർ കണ്ടെയ്‌നറുകൾ സൃഷ്‌ടിച്ചതും ഉപയോഗിക്കുന്നതുമായ ഡാറ്റ നിലനിർത്തുന്നതിനുള്ള ഒരു സംവിധാനമാണ് ഡോക്കർ വോളിയം.
  13. ഒരു CI/CD പൈപ്പ്‌ലൈനിൽ എനിക്ക് ഒന്നിലധികം ഡോക്കർ കണ്ടെയ്‌നറുകൾ പ്രവർത്തിപ്പിക്കാൻ കഴിയുമോ?
  14. അതെ, വ്യത്യസ്‌ത സേവനങ്ങളും ഡിപൻഡൻസികളും വെവ്വേറെ നിയന്ത്രിക്കുന്നതിന് നിങ്ങൾക്ക് ഒരു സിഐ/സിഡി പൈപ്പ്‌ലൈനിൽ ഒന്നിലധികം ഡോക്കർ കണ്ടെയ്‌നറുകൾ പ്രവർത്തിപ്പിക്കാം.
  15. ഒരു ഡോക്കർ കണ്ടെയ്‌നറിൽ നിന്ന് ഹോസ്റ്റിലേക്ക് ഫയലുകൾ എങ്ങനെ പകർത്താം?
  16. ഉപയോഗിക്കുക docker cp ഒരു കണ്ടെയ്‌നറിൽ നിന്ന് ഹോസ്റ്റ് ഫയൽസിസ്റ്റത്തിലേക്ക് ഫയലുകൾ പകർത്താനുള്ള കമാൻഡ്.
  17. CI/CD പൈപ്പ് ലൈനുകളിൽ ഞാൻ എന്തിന് ഡോക്കർ ഉപയോഗിക്കണം?
  18. CI/CD പൈപ്പ് ലൈനുകളിൽ ഡോക്കർ ഉപയോഗിക്കുന്നത് സ്ഥിരവും പുനരുൽപ്പാദിപ്പിക്കാവുന്നതുമായ അന്തരീക്ഷം ഉറപ്പാക്കുന്നു, ഡിപൻഡൻസി മാനേജ്മെൻ്റ് ലളിതമാക്കുന്നു, കൂടാതെ സ്കേലബിളിറ്റി വർദ്ധിപ്പിക്കുന്നു.
  19. സിഐ/സിഡിയിൽ ഡോക്കർ സംയോജനത്തെ പിന്തുണയ്ക്കുന്ന ഉപകരണങ്ങൾ ഏതാണ്?
  20. Jenkins, GitLab CI, CircleCI എന്നിവ പോലുള്ള ഉപകരണങ്ങൾ ഡോക്കർ സംയോജനത്തെ പിന്തുണയ്ക്കുന്നു, ഇത് ബിൽഡ്, വിന്യാസ പ്രക്രിയകളുടെ തടസ്സമില്ലാത്ത ഓട്ടോമേഷൻ അനുവദിക്കുന്നു.

പൊതിയുക:

സിഐ/സിഡി പൈപ്പ്ലൈനുകളിൽ ഡോക്കർ ഉൾപ്പെടുത്തുന്നത് ഡിപൻഡൻസി മാനേജ്മെൻ്റ് ലളിതമാക്കുകയും സ്ഥിരതയാർന്ന ബിൽഡ് എൻവയോൺമെൻ്റ് ഉറപ്പാക്കുകയും ചെയ്യുന്നു. ഡോക്കർ കമാൻഡുകളും സ്ക്രിപ്റ്റുകളും ഉപയോഗിക്കുന്നതിലൂടെ, നിങ്ങൾക്ക് കണ്ടെയ്നറുകളിൽ നിന്ന് ഹോസ്റ്റ് സിസ്റ്റത്തിലേക്ക് ബിൽഡ് ആർട്ടിഫാക്റ്റുകൾ കാര്യക്ഷമമായി കൈമാറാൻ കഴിയും. ഈ രീതി ബിൽഡ് പ്രോസസ് ഒപ്റ്റിമൈസ് ചെയ്യുക മാത്രമല്ല നിങ്ങളുടെ CI/CD വർക്ക്ഫ്ലോകളുടെ സ്കേലബിളിറ്റിയും മെയിൻ്റനബിലിറ്റിയും വർദ്ധിപ്പിക്കുകയും ചെയ്യുന്നു. ഈ ടാസ്‌ക്കുകൾ ഓട്ടോമേറ്റ് ചെയ്യുന്നത് പ്രവർത്തനങ്ങളെ കൂടുതൽ കാര്യക്ഷമമാക്കുന്നു, ഇത് ആധുനിക സോഫ്‌റ്റ്‌വെയർ വികസനത്തിനുള്ള അമൂല്യമായ സമീപനമാക്കി മാറ്റുന്നു.