AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ืคืจื•ื‘ื™ืจื˜, ื”ืขืœื!

ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ืจืขื“ืŸ ื•ื•ืขื’ืŸ ืžื™ื™ืŸ ื“ืขืจืคืึทืจื•ื ื’ ืื™ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ GitLab ืื•ืŸ AppCenter ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ ื“ื•ืจืš BitBucket.

ื“ื™ ื ื•ื™ื˜ ืคึฟืึทืจ ืึทื–ืึท ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ ืื™ื– ืื•ื™ืคื’ืขืฉื˜ืื ืขืŸ ื•ื•ืขืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึทืจื•ื™ืฃ ืึธื˜ืึทืžืึทื˜ื™ืง ืงืึทื˜ืขืจ ืคื•ืŸ ื•ื™ ื˜ืขืกืฅ ืคึฟืึทืจ ืึท ืงืจื™ื™ึทื–-ืคึผืœืึทื˜ืคืึธืจืžืข ืคึผืจื•ื™ืขืงื˜ ืื•ื™ืฃ Xamarin. ื“ื™ื˜ื™ื™ืœื“ ื˜ื•ื˜ืึธืจื™ืึทืœ ืื•ื ื˜ืขืจ ื“ื™ ืฉื ื™ื™ึทื“ืŸ!

* ืื™ืš ื•ื•ืขืœ ืžืึทื›ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ืึธื˜ืึทืžื™ื™ื˜ื™ื ื’ ื•ื™ ื˜ืขืกื˜ื™ื ื’ ืื™ืŸ ืงืจื™ื™ึทื–-ืคึผืœืึทื˜ืคืึธืจืžืข ื˜ื ืึธื™ื ืื•ื™ื‘ ื“ืขืจ ืฆื™ื‘ื•ืจ ืื™ื– ืื™ื ื˜ืขืจืขืกื™ืจื˜.

ืื™ืš ื”ืึธื‘ ื ืึธืจ ืื•ื™ืกื’ืขื’ืจืึธื‘ืŸ ืื™ื™ืŸ ืึทื–ืึท ืžืึทื˜ืขืจื™ืึทืœ ืึทืจื˜ื™ืงืœ. ื“ืขืจื™ื‘ืขืจ, ืžื™ื™ืŸ ืึทืจื˜ื™ืงืœ ืงืขืŸ ื”ืขืœืคืŸ ืขืžืขืฆืขืจ.

ืึทืจื‘ืขื˜: ืฉื˜ืขืœืŸ ืึทืจื•ื™ืฃ ืึธื˜ืึทืžืึทื˜ื™ืง ืงืึทื˜ืขืจ ืคื•ืŸ ื•ื™ ื˜ืขืกืฅ ืื•ื™ืฃ ืึทืคึผืคึผืฆืขื ื˜ืจืึทืœ, ื•ื•ื™ื™ึทืœ ืื•ื ื“ื–ืขืจ ืžืึทื ืฉืึทืคึฟื˜ ื ื™ืฆื˜ GitLab ื•ื•ื™ ืึท ื•ื•ืขืจืกื™ืข ืงืึธื ื˜ืจืึธืœ ืกื™ืกื˜ืขื.

ืคึผืจืึธื‘ืœืขื ืขืก ืคืืจืงืขืจื˜ ืื•ื™ืก ืึทื– AppCenter ืื™ื– ื ื™ืฉื˜ ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื“ ื’ืœื™ื™ึทืš ืžื™ื˜ GitLab. ื‘ื™ื™ืคึผืึทืก ื“ื•ืจืš BitBucket ืื™ื– ืื•ื™ืกื“ืขืจื•ื•ื™ื™ืœื˜ ื•ื•ื™ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืกืึทืœื•ืฉืึทื ื–.

ื˜ืจื™ื˜

1. ืฉืึทืคึฟืŸ ืึท ืœื™ื™ื“ื™ืง ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืื•ื™ืฃ BitBucket

ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื–ืขืŸ ื“ื™ ื ื•ื™ื˜ ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ืขื ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ :)

2. ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ GitLab

ืžื™ืจ ื“ืึทืจืคึฟืŸ ืึทื– ื•ื•ืขืŸ ืคึผื•ืฉื™ื ื’ / ืžืขืจื“ื–ืฉื™ื ื’ ืื™ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™, ืขื ื“ืขืจื•ื ื’ืขืŸ ื–ืขื ืขืŸ ืื•ื™ืš ื•ืคึผืœืึธืึทื“ืขื“ ืฆื• BitBucket. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืœื™ื™ื’ืŸ ืึท ืจืึทื ืขืจ (ืึธื“ืขืจ ืจืขื“ืึทื’ื™ืจืŸ ื“ื™ ื™ื’ื–ื™ืกื˜ื™ื ื’ .gitlab-ci.yml ื˜ืขืงืข).

ืขืจืฉื˜ืขืจ ืžื™ืจ ืœื™ื™ื’ืŸ ืงืึทืžืึทื ื“ื– ืฆื• ื“ื™ before_scripts ืึธืคึผื˜ื™ื™ืœื•ื ื’

 - git config --global user.email "user@email"
 - git config --global user.name "username"

ื“ืขืจื ืึธืš ืœื™ื™ื’ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ืึทืคึฟืขืœ ืฆื• ื“ืขืจ ื’ืขื•ื•ืืœื˜ ื‘ื™ื ืข:

- git push --mirror https://username:[email protected]/username/projectname.git

ืื™ืŸ ืžื™ื™ืŸ ืคืึทืœ, ื“ืึธืก ืื™ื– ื“ืขืจ ื˜ืขืงืข ืื™ืš ื’ืึทื˜:

before_script:
 - git config --global user.email "user@email"
 - git config --global user.name "username"

stages:
  - mirror
mirror:
  stage: mirror
  script:
    - git push --mirror https://****:*****@bitbucket.org/****/testapp.git

ืžื™ืจ ืงืึทื˜ืขืจ ื“ื™ ื‘ื•ื™ืขืŸ, ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืึทื– ืื•ื ื“ื–ืขืจ ืขื ื“ืขืจื•ื ื’ืขืŸ / ื˜ืขืงืขืก ื–ืขื ืขืŸ ืื•ื™ืฃ BitBucket.
* ื•ื•ื™ ืคื™ืจ ื”ืื˜ ื’ืขื•ื•ื™ื–ืŸ, ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึทืจื•ื™ืฃ SSH ืฉืœื™ืกืœืขืŸ ืื™ื– ืึทืคึผืฉืึทื ืึทืœ. ืึธื‘ืขืจ, ื ืึธืจ ืื™ืŸ ืคืึทืœ, ืื™ืš ื•ื•ืขืœ ืฆื•ืฉื˜ืขืœืŸ ืึท ืึทืœื’ืขืจื™ื“ืึทื ืคึฟืึทืจ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึท ืงืฉืจ ื“ื•ืจืš SSH ืื•ื ื˜ืŸ

ืงืึทื ืขืงื˜ื™ื ื’ ื“ื•ืจืš SSH

ืขืจืฉื˜ืขืจ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึท SSH ืฉืœื™ืกืœ. ืคื™ืœืข ืึทืจื˜ื™ืงืœืขืŸ ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ื•ื•ืขื’ืŸ ื“ืขื. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืจ ืงืขื ืขืŸ ืงื•ืงืŸ ื“ืึธ.
ื“ื™ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืฉืœื™ืกืœืขืŸ ืงื•ืงืŸ ืขืคึผืขืก ื•ื•ื™ ื“ืึธืก:
AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื•ื•ื™ื™ึทื˜ืขืจ ื“ืขืจ ืกื•ื“ ืฉืœื™ืกืœ ื“ืึทืจืฃ ื–ื™ื™ืŸ ืžื•ืกื™ืฃ ื•ื•ื™ ืึท ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืื•ื™ืฃ GitLab. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ื’ื™ื™ืŸ ืฆื• ืกืขื˜ื˜ื™ื ื’ืก> ืกื™ / ืงืึธืžืคึผืึทืงื˜ื“ื™ืกืง> ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื–. ืœื™ื™ื’ ืึทืœืข ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ืขืจ ื˜ืขืงืข ืื™ืŸ ื•ื•ืึธืก ืื™ืจ ื”ืึธื˜ ื’ืขืจืื˜ืขื•ื•ืขื˜ ื“ื™ ืกื•ื“ ืฉืœื™ืกืœ. ืœืึธืžื™ืจ ืจื•ืคืŸ ื“ื™ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง SSH_PRIVATE_KEY.
* ื“ืขื ื˜ืขืงืข, ื ื™ื˜ ืขื ืœืขืš ื“ื™ ืคื•ื‘ืœื™ืง ืฉืœื™ืกืœ ื˜ืขืงืข, ื•ื•ืขื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ื“ื™ ืคืึทืจืœืขื ื’ืขืจื•ื ื’
AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื’ืจื•ื™ืก, ื•ื•ื™ื™ึทื˜ืขืจ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ ื“ืขื ืฆื™ื‘ื•ืจ ืฉืœื™ืกืœ ืฆื• BitBucket. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืขืคืขื ืขืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืื•ืŸ ื’ื™ื™ืŸ ืฆื• ืกืขื˜ื˜ื™ื ื’ืก> ืึทืงืกืขืก ืงื™ื–.

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื“ืึธ ืžื™ืจ ื’ื™ื˜ ืฆื•ื’ืขื‘ืŸ ืฉืœื™ืกืœ ืื•ืŸ ืึทืจื™ื™ึทื ืœื™ื™ื’ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ืขืจ ื˜ืขืงืข ืžื™ื˜ ื“ื™ ืฆื™ื‘ื•ืจ ืฉืœื™ืกืœ (ื˜ืขืงืข ืžื™ื˜ ื“ื™ ืคืึทืจืœืขื ื’ืขืจื•ื ื’ .ืคึผื•ื‘).

ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืฉืจื™ื˜ ืื™ื– ืฆื• ื ื•ืฆืŸ ื“ื™ ืฉืœื™ืกืœืขืŸ ืื™ืŸ gitlab-runner. ื ื™ืฆืŸ ื“ื™ ืงืึทืžืึทื ื“ื–, ืึธื‘ืขืจ ืคืึทืจื‘ื™ื™ึทื˜ืŸ ื“ื™ ืึทืกื˜ืขืจื™ืกืง ืžื™ื˜ ื“ื™ื™ืŸ ื“ืขื˜ืึทื™ืœืก

image: timbru31/node-alpine-git:latest

stages:
  - mirror

before_script:
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
  - git config --global user.email "*****@***"
  - git config --global user.name "****"
  - ssh -T [email protected]

mirror:
  stage: mirror
  script:
    - git push --mirror https://****:****@bitbucket.org/*****/*****.git

3. ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึทืคึผืคึผืฆืขื ื˜ืขืจ

ืžื™ืจ ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ื™ืฃ ืึทืคึผืคึผืฆืขื ื˜ืจืึทืœ.

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ืฉืคึผืจืึทืš / ืคึผืœืึทื˜ืคืึธืจืžืข

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื•ื•ื™ื™ึทื˜ืขืจ, ื’ื™ื™ืŸ ืฆื• ื“ื™ ื‘ื™ืœื“ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืคื•ืŸ ื“ื™ ื ื™ื™ ื‘ืืฉืืคืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ื“ืึธ ืžื™ืจ ืกืขืœืขืงื˜ื™ืจืŸ BitBucket ืื•ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ื‘ืืฉืืคืŸ ืื™ืŸ ืฉืจื™ื˜ 1.

ื’ืจื•ื™ืก, ืื™ืฆื˜ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ื‘ื•ื™ืขืŸ. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ื’ืขืคึฟื™ื ืขืŸ ื“ื™ ื’ืึทื ื’ ื‘ื™ืœื“ืœ

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ืื™ืŸ ืคึผืจื™ื ืฆื™ืคึผ, ืึทืœืฅ ืื™ื– ื™ื ื˜ื•ืึทื˜ื™ื•ื•. ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืึท ืคึผืจื•ื™ืขืงื˜ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ. ืื•ื™ื‘ ื ื™ื™ื˜ื™ืง, ื’ืขื‘ืŸ ื“ื™ ืงืึทื˜ืขืจ ืคื•ืŸ ื˜ืขืกืฅ ื ืึธืš ื“ื™ ื‘ื•ื™ืขืŸ. ื–ื™ื™ ื•ื•ืขืœืŸ ืึธื ื”ื™ื™ื‘ืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ.

ื‘ื™ื™ืกื™ืงืœื™, ืึทื– ืก ืึทืœืข. ืขืก ืกืึธื•ื ื“ืก ืคึผืฉื•ื˜, ืึธื‘ืขืจ, ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš, ืึทืœืฅ ื•ื•ืขื˜ ื ื™ืฉื˜ ื’ื™ื™ืŸ ืกืžื•ื“ืœื™. ื“ืขืจื™ื‘ืขืจ, ืื™ืš ื•ื•ืขืœ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ืขื˜ืœืขื›ืข ืขืจืจืึธืจืก ืึทื– ืื™ืš ื’ืขืคึผืœืึธื ื˜ืขืจื˜ ื‘ืฉืขืช ืืจื‘ืขื˜ืŸ:

'ssh-keygen' ืื™ื– ื ื™ืฉื˜ ืื ืขืจืงืขื ื˜ ื•ื•ื™ ืึทืŸ ื™ื ืขืจืœืขืš ืึธื“ืขืจ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ื‘ืึทืคึฟืขืœ.

ืขืก ืื•ื™ืš ืึทืงืขืจื– ื•ื•ื™ื™ึทืœ ื“ืขืจ ื“ืจืš ืฆื• ssh-keygen.exe ืื™ื– ื ื™ืฉื˜ ืฆื•ื’ืขื’ืขื‘ืŸ ืฆื• ื“ื™ ืกื•ื•ื™ื•ื•ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื–.
ืขืก ื–ืขื ืขืŸ ืฆื•ื•ื™ื™ ืึธืคึผืฆื™ืขืก: ืœื™ื™ื’ืŸ C: Program FilesGitusrbin ืฆื• ื™ื ื•ื•ื™ื™ืจืึทื ืžืขื ืึทืœ ื•ื•ืขืจื™ืึทื‘ืึทืœื– (ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ืขื ื“ื˜ ื ืึธืš ืจื™ืกื˜ืึทืจื˜ื™ื ื’ ื“ื™ ืžืึทืฉื™ืŸ), ืึธื“ืขืจ ืงืึทื˜ืขืจ ื“ื™ ืงืึทื ืกืึธื•ืœ ืคึฟื•ืŸ ื“ืขื ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ.

ืึทืคึผืคึผืฆืขื ื˜ืจืึทืœ ืงืึธื ื ืขืงื˜ืขื“ ืฆื• ื“ืขื ืื•ืžืจืขื›ื˜ BitBucket ื—ืฉื‘ื•ืŸ?

ืฆื• ืกืึธืœื•ื•ืข ื“ื™ ืคึผืจืึธื‘ืœืขื, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืึทื ืœื™ื ืง ื“ื™ื™ืŸ BitBucket ื—ืฉื‘ื•ืŸ ืคึฟื•ืŸ ืึทืคึผืคึผืฆืขื ื˜ืจืึทืœ. ืžื™ืจ ืงืœืึธืฅ ืื™ืŸ ื“ืขื ืื•ืžืจืขื›ื˜ BitBucket ื—ืฉื‘ื•ืŸ ืื•ืŸ ื’ื™ื™ืŸ ืฆื• ื“ื™ ื‘ืึทื ื™ืฆืขืจ ืคึผืจืึธืคื™ืœ.

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื•ื•ื™ื™ึทื˜ืขืจ, ื’ื™ื™ืŸ ืฆื• ืกืขื˜ื˜ื™ื ื’ืก> ืึทืงืกืขืก ืžืึทื ืึทื’ืขืžืขื ื˜> OAuth

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื“ืจื™ืงื˜ ืึธืคึผืžืึทืš ืฆื• ื•ืคืฉืœื™ืกืŸ ื“ื™ื™ืŸ ื—ืฉื‘ื•ืŸ.

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื ืึธืš ื“ืขื, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืœืึธืฅ ืื™ืŸ ืžื™ื˜ ื“ื™ ืคืืจืœืื ื’ื˜ BitBucket ื—ืฉื‘ื•ืŸ.
* ื•ื•ื™ ืึท ืœืขืฆื˜ืข ืจื™ื–ืึธืจื˜, ืื•ื™ืš ื•ื™ืกืžืขืงืŸ ื“ื™ื™ืŸ ื‘ืœืขื˜ืขืจืขืจ ืงืึทืฉ.

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ื’ื™ื™ืŸ ืฆื• AppCenter. ื’ื™ื™ืŸ ืฆื• ื“ื™ ื‘ื™ืœื“ ืึธืคึผื˜ื™ื™ืœื•ื ื’, ื’ื™ื˜ Disconnect BitBucket ื—ืฉื‘ื•ืŸ

AppCenter ืื•ืŸ GitLab ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ

ื•ื•ืขืŸ ื“ืขืจ ืึทืœื˜ ื—ืฉื‘ื•ืŸ ืื™ื– ืึทื ืœื™ื ืงื“, ืžื™ืจ ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ AppCenter ื•ื•ื™ื“ืขืจ. ืื™ืฆื˜ ืฆื• ื“ื™ ื’ืขื‘ืขื˜ืŸ ื—ืฉื‘ื•ืŸ.

'ืขื•ื•ืึทืœ' ืื™ื– ื ื™ืฉื˜ ืื ืขืจืงืขื ื˜ ื•ื•ื™ ืึทืŸ ื™ื ืขืจืœืขืš ืึธื“ืขืจ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ื‘ืึทืคึฟืขืœ

ืžื™ืจ ื ื•ืฆืŸ ืขืก ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ืึท ื‘ืึทืคึฟืขืœ

  - eval $(ssh-agent -s)

ืžืึทื ืฉืึทืคึฟื˜:

  - ssh-agent

ืื™ืŸ ืขื˜ืœืขื›ืข ืงืึทืกืขืก, ืื™ืจ ื•ื•ืขื˜ ื”ืึธื‘ืŸ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ืคื•ืœ ื“ืจืš ืฆื• C: ืคึผืจืึธื’ืจืึทื ืคื™ืœืขืก ื’ื™ื˜ื•ืกืจื‘ื™ื ืกืฉ-ืึทื’ืขื ื˜.ืขืงืกืข, ืึธื“ืขืจ ืœื™ื™ื’ืŸ ื“ืขื ื•ื•ืขื’ ืฆื• ื“ื™ ืกื™ืกื˜ืขื ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืื•ื™ืฃ ื“ื™ ืžืึทืฉื™ืŸ ื•ื•ื• ื“ื™ ืจืึทื ืขืจ ืื™ื– ืคืœื™ืกื ื“ื™ืง.

AppCenter Build ืื™ื– ื˜ืจื™ื™ื ื’ ืฆื• ืงืึทื˜ืขืจ ืึท ื‘ื•ื™ืขืŸ ืคึฟืึทืจ ืึท ืคึผืจื•ื™ืขืงื˜ ืคึฟื•ืŸ ืึทืŸ ืึทื•ื˜ื“ื™ื™ื˜ื™ื“ ื‘ื™ื˜ื‘ื•ืงืงืขื˜ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™

ืื™ืŸ ืžื™ื™ืŸ ืคืึทืœ, ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ื– ืื•ื™ืคื’ืขืฉื˜ืื ืขืŸ ื•ื•ื™ื™ึทืœ ืื™ืš ืื™ื– ื’ืขื•ื•ืขืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืงื™ื™ืคืœ ืึทืงืึทื•ื ืฅ. ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ืฆื• ื•ื™ืกืžืขืงืŸ ื“ื™ ืงืึทืฉ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’