Универсальная Работа С Vcs/Scm В Рамках Автоматизации С Futoin Cid



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID

Для некоторых современных программистов не существует другой системы контроля версий, кроме Git, но на практике Subversion по-прежнему востребована, и у Mercurial есть свои ярые сторонники.

Быстрый поиск в подкреплениях.

В результате DevOps неоднопроектных компаний сталкиваются с необходимостью автоматизировать работу с очень разными системами.

При этом каждый имеет свои нюансы и в сценариях неизбежно появляются скрытые ошибки, выскакивающие в самый неподходящий момент. Необходимо предсказуемое поведение с минимальной «гибкостью», а не пестрый букет возможностей.



Интерфейс

В статья встречаться ФутоИн C.I.D. Неявная работа с различными СВК уже была описана.

В версии v0.7 был добавлен явный командный интерфейс и новый функционал для автоматизации создания и объединения ветвей: В общем сам интерфейс с комментариями ниже:

  
  
  
  
  
  
  
   

cid vcs checkout [<vcs_ref>] [--vcsRepo=<vcs_repo>] [--wcDir=<wc_dir>] cid vcs commit <commit_msg> [<commit_files>.

] [--wcDir=<wc_dir>] cid vcs merge <vcs_ref> [--no-cleanup] [--wcDir=<wc_dir>] cid vcs branch <vcs_ref> [--wcDir=<wc_dir>] cid vcs delete <vcs_ref> [--vcsRepo=<vcs_repo>] [--cacheDir=<cache_dir>] [--wcDir=<wc_dir>] cid vcs export <vcs_ref> <dst_dir> [--vcsRepo=<vcs_repo>] [--cacheDir=<cache_dir>] [--wcDir=<wc_dir>] cid vcs tags [<tag_pattern>] [--vcsRepo=<vcs_repo>] [--cacheDir=<cache_dir>] [--wcDir=<wc_dir>] cid vcs branches [<branch_pattern>] [--vcsRepo=<vcs_repo>] [--cacheDir=<cache_dir>] [--wcDir=<wc_dir>] cid vcs reset [--wcDir=<wc_dir>] cid vcs ismerged <vcs_ref> [--wcDir=<wc_dir>]

Если отступить от лозунгов об идеологическом превосходстве децентрализованных систем контроля версий, то итогом разработки любого успешного проекта остается все та же клиент-серверная модель с дополнительными преимуществами на стороне клиента.

Второй очевидный момент — беспроблемная «эмуляция» клиент-серверной модели в распределенных системах и сложность реализации обратной.

Именно это и определяет логику работы — обязательная неявная синхронизация с сервером.

Это подразумевает такую таблицу соответствия:

CID Гит Меркуриальный Подрывная деятельность


cid vcs checkout



git clone/fetch

+

git checkout



hg pull

+

hg checkout



svn checkout/switch



cid vcs commit



git commit

+

git push



hg commit

+

hg push



svn commit



cid vcs merge



git merge

+

git push



hg merge

+

hg push



svn merge

+

svn commit



cid vcs branch



git checkout -b

+

git push



hg branch

+

hg push



svn copy



cid vcs delete



git branch -D

+

git push -f --delete



hg checkout

+

hg commit --close-branch

+

hg push



svn remove



cid vcs export



git fetch/clone --mirror --depth=1

+

git archive | tar



hg archive --type files

+

.

hg*

очистка



svn export



cid vcs tags



git ls-remote



hg tags



svn ls {repo}/tags



cid vcs branches



git ls-remote



hg branches



svn ls {repo}/branches



cid vcs reset



git merge --abort

+

git reset --hard



hg update --clean

+

hg purge -I **/*.

orig



svn revert -R .





cid vcs ismerged



git branch -r --merged HEAD



hg merge --preview



svn mergeinfo --show-revs eligible

Несмотря на краткость, это кажется вполне ясным.

Стоит только отметить, что:

  1. SVN опирается на слияние без явной ссылки на версии - «знай, что делаешь».

  2. В Hg нет удаления веток, а закладки больше похожи на костыль.

  3. Конечно, хоть свет и сошёлся на этих трёх системах, через механизм плагинов можно добавить поддержку любой другой.



Некоторые примеры

Все примеры без лишних слов: небольшой комментарий, последовательность команд как есть и наглядный результат.

> Подготовительные работы

Снова используем чистый Debian Jessie. Давайте создадим репозиторий Git, добавим файлы README.txt и LICENSE и создадим вторую ветку разработки.



sudo apt-get install -y python-pip sudo pip install futoin-cid VCS_REPO_DIR=${HOME}/repo VCS_REPO=git:${VCS_REPO_DIR} function prep_cache_dir() { local repo=$1 local cache_dir=$(echo $repo | sed -e 's,[/:@],_,g') [ -d $cache_dir ] && cid vcs reset --wcDir=$cache_dir 1>&2 echo $cache_dir } # set -x is too verbose function cid() { echo '$' cid "$@" 1>&2 $(which cid) "$@" } rm ${VCS_REPO_DIR} wc $(prep_cache_dir ${VCS_REPO}) -rf cid tool exec git -- init --bare ${VCS_REPO_DIR} cid vcs checkout --vcsRepo=${VCS_REPO} --wcDir=wc # Commit All echo 'Info' > wc/README.txt cid vcs commit 'Initial commit' --wcDir=wc # Commit specific file(s) echo 'License' > wc/LICENSE cid vcs commit 'Adding license' LICENSE --wcDir=wc cid vcs branch develop --wcDir=wc



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID



> История задания 1. Когда начинается работа над новой функцией, требуется автоматическое создание ветки для организации имени.

Примечание.

Предполагается, что разработчики не могут сами создавать ветки или им не рекомендуется это делать, и что трекер каким-то образом срабатывает.

function on_feature_start() { local repo="$1" local feature="$2" local cache_dir=$(prep_cache_dir $repo) cid vcs checkout develop --vcsRepo=$repo --wcDir=$cache_dir cid vcs branch feature-${feature} --wcDir=$cache_dir } function list_branches() { # Remote case cid vcs branches --vcsRepo=${VCS_REPO} # Local case cid vcs branches --wcDir=wc } on_feature_start "${VCS_REPO}" '123_one' on_feature_start "${VCS_REPO}" '234_two' list_branches



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID



> История работы № 2: Каждую ночь (каждый коммит) ветку разработки (релиза) необходимо объединять с веткой функций (разработки), чтобы избежать несоответствий и обеспечить соответствие процесса.

Примечание: этот рабочий процесс в целом считается идеологически правильным [и безопасным], хотя rebase делает историю более стерильной и понятной.

Подготовка веток:

cid vcs checkout develop --wcDir=wc echo 'Info 2' > wc/README.txt cid vcs commit 'Commit 2' --wcDir=wc cid vcs checkout feature-234_two --wcDir=wc echo 'Info 3' > wc/README.txt cid vcs commit 'Conflict 3' --wcDir=wc



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID



function sync_branches() { local repo="$1" local cache_dir=$(prep_cache_dir $repo) local logfile=$(realpath $2) cid vcs checkout develop --vcsRepo=$repo --wcDir=$cache_dir pushd $cache_dir # Release -> Develop echo >$logfile for b in $(cid vcs branches 'release*'); do echo -n "Merging $b into develop: " >>$logfile cid vcs merge $b && \ echo 'OK' >>$logfile || \ echo 'FAIL' >>$logfile done # Develop -> Feature for b in $(cid vcs branches 'feature*'); do echo -n "Merging develop into $b: " >>$logfile cid vcs checkout $b && \ cid vcs merge develop && \ echo 'OK' >>$logfile || \ echo 'FAIL' >>$logfile done popd } sync_branches "${VCS_REPO}" merge.log cat merge.log



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID

Ошибка ожидал - мы намеренно создали конфликт, но в нем нет опечатки.

Будет исправлено в следующем релизе.



> История задания №3: после релиза удалить все включенные ветки функций, чтобы не засорять пространство имен

Примечание: для Hg и SVN в этом вообще нет ничего страшного, а вот для Git есть риск потери коммитов — поэтому желательно иметь зеркало для истории только для чтения.



function remove_merged() { local repo="$1" local cache_dir=$(prep_cache_dir $repo) local logfile=$(realpath $2) cid vcs checkout develop --vcsRepo=$repo --wcDir=$cache_dir pushd $cache_dir echo >$logfile # Removed merged into develop for b in $(cid vcs branches 'feature*'); do if ! cid vcs ismerged $b; then continue fi echo -n "Removing $b: " >>$logfile cid vcs delete $b && \ echo 'OK' >>$logfile || \ echo 'FAIL' >>$logfile done popd } # Merge first branch cid vcs checkout develop --wcDir=wc cid vcs merge feature-123_one --wcDir=wc # Try cleanup remove_merged "${VCS_REPO}" delete.log cat delete.log



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID



> История задания № 4: с заданной частотой генерировать файлы и отправлять их в VCS, чтобы иметь полную историю изменений.

Примеры: а) загружаемые файлы в коммерческом блоге или новостном сайте имеют определенную ценность, Subversion становится чрезвычайно подходящей для повышения целостности и эффективности архивирования б) пример постоянно обновляемого черные списки адресов активных атак , без участия FutoIn CID.

function update_file() { local repo="$1" local cache_dir=$(prep_cache_dir $repo) cid vcs checkout develop --vcsRepo=$repo --wcDir=$cache_dir pushd $cache_dir date > Timestamp.txt cid vcs commit 'Updated timestamp' Timestamp.txt popd } update_file "${VCS_REPO}"



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID



> История работы №5: каждую ночь вам необходимо обновлять зависимости во всех проектах, чтобы всегда использовать последние версии.

Примечание: может быть масса других вариантов автоматизированной обработки списка проектов.



function update_project_deps() { local repo="$1" local cache_dir=$(prep_cache_dir $repo) cid vcs checkout develop --vcsRepo=$repo --wcDir=$cache_dir pushd $cache_dir date > Timestamp.txt for t in $(cid tool detect); do case $t in npm*|composer*|bundler*) cid tool exec $t -- update ;; esac done cid vcs commit 'Updated dependencies' popd } update_project_deps "${VCS_REPO}"



Универсальная работа с VCS/SCM в рамках автоматизации с FutoIn CID

Файлы npm/composer/bundler не были добавлены в пример, чтобы не загромождать его.



Заключение

В целом FutoIn CID не навязывает никаких технологических процессов, а лишь предоставляет единый облегченный интерфейс к VCS/SCM для творчества администратора, DevOps и даже разработчика в рамках командной строки.

Конечно, интерфейс еще не до конца проработан; возможны обратно совместимые изменения.

Обнаруженные проблемы, предложения и пожелания добро пожаловать .

Теги: #futoin #git #hg #svn #Mercurial #subversion #DevOps #vcs #scm #разработка веб-сайтов #открытый исходный код #программирование #git #github

Вместе с данным постом часто просматривают: