வழிமுறைகள்: எவ்வாறு முக்கிய பாத்திரங்களைச் சோதிப்பது மற்றும் உற்பத்திக்கு முன் சிக்கல்களைக் கண்டறிவது

அனைவருக்கும் வணக்கம்!

நான் ஒரு ஹோட்டல் முன்பதிவு சேவையில் DevOps இன்ஜினியராக வேலை செய்கிறேன். Ostrovok.ru. இந்த கட்டுரையில், முக்கிய பாத்திரங்களை சோதிப்பதில் எங்கள் அனுபவத்தைப் பற்றி பேச விரும்புகிறேன்.

Ostrovok.ru இல், நாங்கள் ansible ஐ உள்ளமைவு மேலாளராகப் பயன்படுத்துகிறோம். சமீபத்தில், பாத்திரங்களை சோதிக்க வேண்டிய அவசியத்திற்கு நாங்கள் வந்தோம், ஆனால் அது மாறியது போல், இதற்கு பல கருவிகள் இல்லை - மிகவும் பிரபலமானது, ஒருவேளை, மூலக்கூறு கட்டமைப்பாகும், எனவே அதைப் பயன்படுத்த முடிவு செய்தோம். ஆனால் அவரது ஆவணங்கள் பல ஆபத்துக்களைப் பற்றி அமைதியாக இருப்பது தெரியவந்தது. ரஷ்ய மொழியில் போதுமான விரிவான கையேட்டை எங்களால் கண்டுபிடிக்க முடியவில்லை, எனவே இந்த கட்டுரையை எழுத முடிவு செய்தோம்.

வழிமுறைகள்: எவ்வாறு முக்கிய பாத்திரங்களைச் சோதிப்பது மற்றும் உற்பத்திக்கு முன் சிக்கல்களைக் கண்டறிவது

மூலக்கூறு

மூலக்கூறு - அன்சிபிள் பாத்திரங்களைச் சோதிக்க உதவும் ஒரு கட்டமைப்பு.

எளிமைப்படுத்தப்பட்ட விளக்கம்: மூலக்கூறு நீங்கள் குறிப்பிடும் மேடையில் ஒரு நிகழ்வை உருவாக்குகிறது (மேகம், மெய்நிகர் இயந்திரம், கொள்கலன்; மேலும் விவரங்களுக்கு, பகுதியைப் பார்க்கவும் இயக்கி), அதில் உங்கள் பங்கை இயக்கவும், பின்னர் சோதனைகளை இயக்கவும் மற்றும் நிகழ்வை நீக்கவும். படிகளில் ஒன்றில் தோல்வியுற்றால், மூலக்கூறு அதைப் பற்றி உங்களுக்குத் தெரிவிக்கும்.

இப்போது இன்னும்.

ஒரு பிட் கோட்பாடு

மூலக்கூறின் இரண்டு முக்கிய உறுப்புகளைக் கவனியுங்கள்: காட்சி மற்றும் இயக்கி.

சூழ்நிலையில்

ஸ்கிரிப்ட் என்ன, எங்கே, எப்படி மற்றும் எந்த வரிசையில் நிகழ்த்தப்படும் என்பதற்கான விளக்கத்தைக் கொண்டுள்ளது. ஒரு பாத்திரத்தில் பல ஸ்கிரிப்ட்கள் இருக்கலாம், ஒவ்வொன்றும் பாதையில் ஒரு கோப்பகம் <role>/molecule/<scenario>, சோதனைக்குத் தேவையான செயல்களின் விளக்கங்களைக் கொண்டுள்ளது. ஸ்கிரிப்ட் சேர்க்கப்பட வேண்டும் default, நீங்கள் ஒரு மூலக்கூறுடன் பங்கை துவக்கினால் தானாகவே உருவாக்கப்படும். பின்வரும் ஸ்கிரிப்ட்களின் பெயர்கள் உங்களுடையது.

ஒரு ஸ்கிரிப்ட்டில் செயல்களைச் சோதிக்கும் வரிசை அழைக்கப்படுகிறது அணி, மற்றும் இயல்பாக இது:

(படிகள் பெயரிடப்பட்டுள்ளன ?, பயனரால் குறிப்பிடப்படவில்லை எனில் இயல்பாக தவிர்க்கப்படும்)

  • lint - ஓடும் லிண்டர்கள். இயல்பாகவே பயன்படுத்தப்படுகின்றன yamllint и flake8,
  • destroy - மூலக்கூறின் கடைசி வெளியீட்டில் இருந்து நிகழ்வுகளை நீக்குதல் (ஏதேனும் இருந்தால்),
  • dependency? - பரிசோதிக்கப்பட்ட பாத்திரத்தின் உறுதியான சார்புநிலையை நிறுவுதல்,
  • syntax - பயன்படுத்தி பாத்திரத்தின் தொடரியல் சரிபார்க்கிறது ansible-playbook --syntax-check,
  • create - ஒரு உதாரணத்தை உருவாக்குதல்,
  • prepare? - நிகழ்வைத் தயாரித்தல்; எ.கா. பைதான்2 ஐ சரிபார்க்கவும்/நிறுவும்
  • converge - சோதனை செய்யப்பட்ட பிளேபுக் வெளியீடு,
  • idempotence - பலவீனமான சோதனைக்கான பிளேபுக்கை மறுதொடக்கம் செய்தல்,
  • side_effect? - செயல்கள் நேரடியாக பாத்திரத்துடன் தொடர்புடையவை அல்ல, ஆனால் சோதனைகளுக்கு அவசியம்,
  • verify - இதன் விளைவாக உள்ளமைவின் சோதனைகளை இயக்குதல் testinfra(இயல்புநிலை) /goss/inspec,
  • cleanup? - (புதிய பதிப்புகளில்) - தோராயமாக, மூலக்கூறால் பாதிக்கப்பட்ட வெளிப்புற உள்கட்டமைப்பை "சுத்தம்" செய்தல்,
  • destroy - ஒரு நிகழ்வை நீக்குதல்.

இந்த வரிசை பெரும்பாலான நிகழ்வுகளை உள்ளடக்கியது, ஆனால் தேவைப்பட்டால் மாற்றலாம்.

மேலே உள்ள ஒவ்வொரு படிகளையும் தனித்தனியாக இயக்கலாம் molecule <command>. ஆனால் இதுபோன்ற ஒவ்வொரு கிளை-கட்டளைக்கும் அதன் சொந்த செயல்களின் வரிசை இருக்கலாம் என்பதை புரிந்து கொள்ள வேண்டும், அதை நீங்கள் செயல்படுத்துவதன் மூலம் கண்டுபிடிக்கலாம் molecule matrix <command>. உதாரணமாக, கட்டளையை இயக்கும் போது converge (சோதனையின் கீழ் பிளேபுக்கை இயக்குகிறது), பின்வரும் செயல்கள் செய்யப்படும்:

$ molecule matrix converge
...
└── default         # название сценария
    ├── dependency  # установка зависимостей
    ├── create      # создание инстанса
    ├── prepare     # преднастройка инстанса
    └── converge    # прогон плейбука

இந்த செயல்களின் வரிசையை திருத்தலாம். பட்டியலிலிருந்து ஏதாவது ஏற்கனவே செய்யப்பட்டிருந்தால், அது தவிர்க்கப்படும். தற்போதைய நிலை மற்றும் நிகழ்வுகளின் கட்டமைப்பு, மூலக்கூறு அடைவில் சேமிக்கப்படுகிறது $TMPDIR/molecule/<role>/<scenario>.

உடன் படிகளைச் சேர்க்கவும் ? நீங்கள் விரும்பிய செயல்களை ansible-playbook வடிவத்தில் விவரிக்கலாம் மற்றும் படியின் படி கோப்பு பெயரை உருவாக்கலாம்: prepare.yml/side_effect.yml. இந்த கோப்புகளை எதிர்பார்க்கலாம் மூலக்கூறு ஸ்கிரிப்ட் கோப்புறையில் இருக்கும்.

இயக்கி

இயக்கி என்பது சோதனை நிகழ்வுகள் உருவாக்கப்பட்ட ஒரு நிறுவனம்.
Molecule வார்ப்புருக்கள் தயாராக உள்ள நிலையான இயக்கிகளின் பட்டியல் பின்வருமாறு: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Deligated.

பெரும்பாலான சந்தர்ப்பங்களில், வார்ப்புருக்கள் கோப்புகளாகும் create.yml и destroy.yml ஸ்கிரிப்ட் கோப்புறையில் முறையே ஒரு நிகழ்வை உருவாக்குதல் மற்றும் நீக்குதல் ஆகியவற்றை விவரிக்கிறது.
விதிவிலக்குகள் டோக்கர் மற்றும் வாக்ரான்ட், ஏனெனில் அவற்றின் தொகுதிகளுடன் தொடர்புகள் மேற்கூறிய கோப்புகள் இல்லாமல் நிகழலாம்.

பிரதிநிதித்துவ இயக்கியை முன்னிலைப்படுத்துவது மதிப்புக்குரியது, ஏனெனில் இது ஒரு நிகழ்வை உருவாக்குவதற்கும் நீக்குவதற்கும் கோப்புகளில் பயன்படுத்தப்பட்டால், நிகழ்வுகளின் உள்ளமைவுடன் மட்டுமே வேலை செய்வது விவரிக்கப்பட்டுள்ளது, மீதமுள்ளவை பொறியாளரால் விவரிக்கப்பட வேண்டும்.

இயல்புநிலை இயக்கி டோக்கர்.

இப்போது பயிற்சிக்கு செல்லலாம் மற்றும் அங்குள்ள கூடுதல் அம்சங்களைக் கருத்தில் கொள்வோம்.

தொடங்குதல்

"ஹலோ வேர்ல்ட்" ஆக, ஒரு எளிய nginx நிறுவல் பாத்திரத்தை சோதிப்போம். நாங்கள் டோக்கரை டிரைவராக தேர்வு செய்வோம் - உங்களில் பெரும்பாலானோர் இதை நிறுவியிருப்பீர்கள் என்று நினைக்கிறேன் (மேலும் டோக்கரே முன்னிருப்பு இயக்கி என்பதை நினைவில் கொள்ளுங்கள்).

தயார் செய்வோம் virtualenv மற்றும் அதில் நிறுவவும் molecule:

> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker  # molecule установит ansible как зависимость; docker для драйвера

அடுத்த படி புதிய பாத்திரத்தை துவக்க வேண்டும்.
ஒரு புதிய பாத்திரத்தின் துவக்கம், அதே போல் ஒரு புதிய ஸ்கிரிப்ட், கட்டளையைப் பயன்படுத்தி செய்யப்படுகிறது molecule init <params>:

> molecule init role -r nginx
--> Initializing new role nginx...
Initialized role in <path>/nginx successfully.
> cd nginx
> tree -L 1
.
├── README.md
├── defaults
├── handlers
├── meta
├── molecule
├── tasks
└── vars

6 directories, 1 file

இது ஒரு பொதுவான பாத்திரமாக மாறியது. மேலும், CLI மூலக்கூறுகளுடனான அனைத்து தொடர்புகளும் பாத்திரத்தின் மூலத்திலிருந்து செய்யப்படுகின்றன.

பங்கு அடைவில் என்ன இருக்கிறது என்று பார்ப்போம்:

> tree molecule/default/
molecule/default/
├── Dockerfile.j2  # Jinja-шаблон для Dockerfile
├── INSTALL.rst.   # Немного информации об установке зависимостей сценария
├── molecule.yml   # Файл конфигурации
├── playbook.yml   # Плейбук запуска роли
└── tests          # Директория с тестами стадии verify
    └── test_default.py

1 directory, 6 files

கட்டமைப்பை பகுப்பாய்வு செய்வோம் molecule/default/molecule.yml (டாக்கர் படத்தை மட்டும் மாற்றவும்):

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: instance
    image: centos:7
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

சார்பு

இந்த பிரிவு சார்புகளின் மூலத்தை விவரிக்கிறது.

சாத்தியமான விருப்பங்கள்: விண்மீன், கில்ட், ஷெல்.

ஷெல் என்பது ஒரு கட்டளை ஷெல் ஆகும், இது கேலக்ஸி மற்றும் கில்ட் உங்கள் தேவைகளை பூர்த்தி செய்யவில்லை என்றால் பயன்படுத்தப்படும்.

நான் நீண்ட காலம் இங்கு வசிக்க மாட்டேன், அது போதுமானதாக விவரிக்கப்பட்டுள்ளது ஆவணங்கள்.

இயக்கி

ஓட்டுநரின் பெயர். எங்களுடையது டாக்கர்.

பஞ்சு

லிண்டர் yamllint.

கட்டமைப்பின் இந்த பகுதியில் உள்ள பயனுள்ள விருப்பங்கள் யாம்லிண்ட், முன்னோக்கி சூழல் மாறிகள் அல்லது லிண்டரை முடக்குவதற்கான உள்ளமைவு கோப்பைக் குறிப்பிடும் திறன்:

lint:
  name: yamllint
  options:
    config-file: foo/bar
  env:
    FOO: bar
  enabled: False

தளங்களில்

நிகழ்வுகளின் உள்ளமைவை விவரிக்கிறது.
ஒரு இயக்கியாக டோக்கரைப் பொறுத்தவரை, மூலக்கூறு இந்தப் பிரிவில் மீண்டும் மீண்டும் செய்யப்படுகிறது, மேலும் பட்டியலின் ஒவ்வொரு உறுப்பும் இதில் கிடைக்கும் Dockerfile.j2 ஒரு மாறியாக item.

தேவைப்படும் ஒரு இயக்கி விஷயத்தில் create.yml и destroy.yml, என்ற பிரிவு அவற்றில் கிடைக்கிறது molecule_yml.platforms, மற்றும் அதன் மீதான மறு செய்கைகள் ஏற்கனவே இந்தக் கோப்புகளில் விவரிக்கப்பட்டுள்ளன.

மூலக்கூறு அன்சிபிள் தொகுதிகளுக்கு நிகழ்வுகளின் கட்டுப்பாட்டை வழங்குவதால், சாத்தியமான அமைப்புகளின் பட்டியலையும் அங்கு தேட வேண்டும். டோக்கருக்கு, எடுத்துக்காட்டாக, தொகுதி பயன்படுத்தப்படுகிறது docker_container_module. மற்ற இயக்கிகளில் எந்த தொகுதிகள் பயன்படுத்தப்படுகின்றன என்பதைக் காணலாம் ஆவணங்கள்.

பல்வேறு இயக்கிகளைப் பயன்படுத்துவதற்கான எடுத்துக்காட்டுகளையும் காணலாம் மூலக்கூறின் சோதனைகளில்.

இங்கே மாற்றவும் சென்டோஸ்:7 மீது உபுண்டு.

வழங்குபவர்

"சப்ளையர்" - நிகழ்வுகளை நிர்வகிக்கும் ஒரு நிறுவனம். மூலக்கூறைப் பொறுத்தவரை, இது அன்சிபிள், மற்றவர்களுக்கு ஆதரவு திட்டமிடப்படவில்லை, எனவே இந்த பகுதியை ஒரு எச்சரிக்கையுடன் கூடிய நீட்டிக்கப்பட்ட உள்ளமைவு என்று அழைக்கலாம்.
இங்கே நீங்கள் நிறைய விஷயங்களைக் குறிப்பிடலாம், என் கருத்துப்படி, முக்கிய புள்ளிகளை நான் முன்னிலைப்படுத்துவேன்:

  • playbooks: குறிப்பிட்ட நிலைகளில் எந்த நாடகப் புத்தகங்கள் பயன்படுத்தப்பட வேண்டும் என்பதைக் குறிப்பிடலாம்.

provisioner:
  name: ansible
  playbooks:
    create: create.yml
    destroy: ../default/destroy.yml
    converge: playbook.yml
    side_effect: side_effect.yml
    cleanup: cleanup.yml

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

  • இணைப்பு_விருப்பங்கள்: விருப்பங்கள் இணைப்பு

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • விருப்பங்கள்: அன்சிபிள் விருப்பங்கள் மற்றும் சூழல் மாறிகள்

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

சூழ்நிலையில்

ஸ்கிரிப்ட் வரிசைகளின் பெயர் மற்றும் விளக்கம்.
விசையைச் சேர்ப்பதன் மூலம் எந்த கட்டளையின் இயல்புநிலை செயல் மேட்ரிக்ஸை மாற்றலாம் <command>_sequence மற்றும் அதற்கான மதிப்பாக, நமக்குத் தேவையான படிகளின் பட்டியலை வரையறுக்கிறது.
பிளேபுக் ரன் கட்டளையை இயக்கும்போது செயல்களின் வரிசையை மாற்ற விரும்புகிறோம் என்று வைத்துக்கொள்வோம்: molecule converge

# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

பார்க்கலாம்

சோதனைகளுக்கான கட்டமைப்பையும் அதற்கு ஒரு லிண்டரையும் அமைத்தல். இயல்புநிலை லிண்டர் ஆகும் testinfra и flake8. சாத்தியமான விருப்பங்கள் மேலே உள்ளதைப் போலவே இருக்கும்:

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*
  options:
    n: 1
  enabled: False
  env:
    FOO: bar
  lint:
    name: flake8
    options:
      benchmark: True
    enabled: False
    env:
      FOO: bar

நமது பாத்திரத்திற்கு திரும்புவோம். கோப்பை திருத்தலாம் tasks/main.yml இந்த வகைக்கு:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

மற்றும் சோதனைகளைச் சேர்க்கவும் molecule/default/tests/test_default.py

def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_config(host):
    host.run("nginx -t")

முடிந்தது, இது இயங்குவதற்கு மட்டுமே உள்ளது (பாத்திரத்தின் மூலத்திலிருந்து, நான் உங்களுக்கு நினைவூட்டுகிறேன்):

> molecule test

ஸ்பாய்லரின் கீழ் நீண்ட வெளியேற்றம்:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

எங்கள் எளிய பாத்திரம் எந்த பிரச்சனையும் இல்லாமல் சோதிக்கப்பட்டது.
வேலையின் போது சிக்கல்கள் இருந்தால் நினைவில் கொள்வது மதிப்பு molecule test, நீங்கள் இயல்புநிலை வரிசையை மாற்றவில்லை என்றால், மூலக்கூறு நிகழ்வை நீக்கும்.

பிழைத்திருத்தத்திற்கு பின்வரும் கட்டளைகள் பயனுள்ளதாக இருக்கும்:

> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge          # Оставляет инстанс после прогона тестируемой роли.
> molecule login             # Зайти в созданный инстанс.
> molecule --help            # Полный список команд.

தற்போதுள்ள பங்கு

ஏற்கனவே உள்ள பாத்திரத்தில் புதிய ஸ்கிரிப்டைச் சேர்ப்பது பங்கு அடைவில் இருந்து பின்வரும் கட்டளைகளுடன்:

# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>

இது பாத்திரத்தில் முதல் காட்சியாக இருந்தால், அளவுரு -s இது ஒரு ஸ்கிரிப்டை உருவாக்கும் என்பதால் தவிர்க்கலாம் default.

முடிவுக்கு

நீங்கள் பார்க்கிறபடி, மூலக்கூறு மிகவும் சிக்கலானது அல்ல, மேலும் உங்கள் சொந்த டெம்ப்ளேட்களைப் பயன்படுத்துவதன் மூலம், ஒரு புதிய ஸ்கிரிப்டைப் பயன்படுத்துவதன் மூலம், நிகழ்வு உருவாக்கம் மற்றும் நீக்குதல் பிளேபுக்குகளில் மாறிகளைத் திருத்துவதற்கு குறைக்கலாம். இந்த மூலக்கூறு CI அமைப்புகளுடன் தடையின்றி ஒருங்கிணைக்கிறது, இது பிளேபுக்குகளின் கைமுறை சோதனைக்கான நேரத்தைக் குறைப்பதன் மூலம் வளர்ச்சியின் வேகத்தை அதிகரிக்க உங்களை அனுமதிக்கிறது.

உங்கள் கவனத்திற்கு நன்றி. அன்சிபிள் பாத்திரங்களைச் சோதிப்பதில் உங்களுக்கு அனுபவம் இருந்தால், அது மூலக்கூறுடன் தொடர்புடையதாக இல்லாவிட்டால், அதைப் பற்றி கருத்துகளில் சொல்லுங்கள்!

ஆதாரம்: www.habr.com

கருத்தைச் சேர்