Установка зависимостей

Docker

Руководство по установке Docker CE.

Для работы с Docker-демоном пользователю необходимы соответствующие привилегии. Создайте группу docker и добавьте в неё пользователя:

sudo groupadd docker
sudo usermod -aG docker $USER

Git

Руководство по установке Git.

  • Минимально допустимая версия — 1.9.0.
  • В случае использования Git Submodule, минимально допустимая версия — 2.14.0.

Установка werf

Способ 1 (рекомендуемый): multiwerf

Unix shell (sh, bash, zsh)

Installing multiwerf
# add ~/bin into PATH
export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc

# install multiwerf into ~/bin directory
mkdir -p ~/bin
cd ~/bin
curl -L https://raw.githubusercontent.com/flant/multiwerf/master/get.sh | bash
Add werf alias to the current shell session
. $(multiwerf use 1.0 stable --as-file)
CI usage tip

To ensure that multiwerf exists and is executable, use the type command:

type multiwerf && . $(multiwerf use 1.0 stable --as-file)

The command prints a message to stderr if multiwerf is not found. Thus, diagnostics in a CI environment becomes simpler.

Optional: run command on terminal startup
echo '. $(multiwerf use 1.0 stable --as-file)' >> ~/.bashrc

Windows

PowerShell
Installing multiwerf
$MULTIWERF_BIN_PATH = "C:\ProgramData\multiwerf\bin"
mkdir $MULTIWERF_BIN_PATH

Invoke-WebRequest -Uri https://flant.bintray.com/multiwerf/v1.0.16/multiwerf-windows-amd64-v1.0.16.exe -OutFile $MULTIWERF_BIN_PATH\multiwerf.exe

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + "$MULTIWERF_BIN_PATH",
    [EnvironmentVariableTarget]::Machine)

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
Add werf alias to the current shell session
Invoke-Expression -Command "multiwerf use 1.0 stable --as-file --shell powershell" | Out-String -OutVariable WERF_USE_SCRIPT_PATH
. $WERF_USE_SCRIPT_PATH.Trim()
cmd.exe
Installing multiwerf
set MULTIWERF_BIN_PATH="C:\ProgramData\multiwerf\bin"
mkdir %MULTIWERF_BIN_PATH%
bitsadmin.exe /transfer "multiwerf" https://flant.bintray.com/multiwerf/v1.0.16/multiwerf-windows-amd64-v1.0.16.exe %MULTIWERF_BIN_PATH%\multiwerf.exe
setx /M PATH "%PATH%;%MULTIWERF_BIN_PATH%"

# after that open new cmd.exe session and start using multiwerf
Add werf alias to the current shell session
FOR /F "tokens=*" %g IN ('multiwerf use 1.0 stable --as-file --shell cmdexe') do (SET WERF_USE_SCRIPT_PATH=%g)
%WERF_USE_SCRIPT_PATH%

Команда multiwerf use в деталях

Команда multiwerf use MAJOR.MINOR CHANNEL позволяет использовать актуальную версию werf для указанных параметров MAJOR.MINOR и CHANNEL. Команду следует использовать как в CI, так и при локальной разработке. Команда возвращает скрипт или, при использовании опции --as-file, путь к файлу со скриптом, который необходимо использовать как аргумент команды source. В результате в shell-сессии будет доступна актуальная версия werf.

Скрипт можно разделить на две составляющие: обновление и создание alias или функции werf, в зависимости от shell. На стадии обновления выполняется проверка и обновление multiwerf, а также скачивается актуальная версия werf на основе указанных параметров MAJOR.MINOR и CHANNEL (подробнее про версионирование werf в разделе Обещание обратной совместимости).

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

if multiwerf werf-path MAJOR.MINOR CHANNEL >~\.multiwerf\multiwerf_use_first_werf_path.log 2>&1; then
    (multiwerf update --with-cache MAJOR.MINOR CHANNEL >~\.multiwerf\background_update.log 2>&1 </dev/null &)
else
    multiwerf update MAJOR.MINOR CHANNEL
fi

WERF_PATH=$(multiwerf werf-path MAJOR.MINOR CHANNEL)
WERF_FUNC=$(cat <<EOF
werf()
{
    $WERF_PATH "\$@"
}
EOF
)

eval "$WERF_FUNC"
if (Invoke-Expression -Command "multiwerf werf-path MAJOR.MINOR CHANNEL >~\.multiwerf\multiwerf_use_first_werf_path.log 2>&1" | Out-String -OutVariable WERF_PATH) {
    Start-Job { multiwerf update --with-cache MAJOR.MINOR CHANNEL >~\.multiwerf\background_update.log 2>&1 }
} else {
    multiwerf update MAJOR.MINOR CHANNEL
    Invoke-Expression -Command "multiwerf werf-path MAJOR.MINOR CHANNEL" | Out-String -OutVariable WERF_PATH
}

function werf { & $WERF_PATH.Trim() $args }
FOR /F "tokens=*" %%g IN ('multiwerf werf-path MAJOR.MINOR CHANNEL') do (SET WERF_PATH=%%g)

IF %ERRORLEVEL% NEQ 0 (
    multiwerf update MAJOR.MINOR CHANNEL 
    FOR /F "tokens=*" %%g IN ('multiwerf werf-path MAJOR.MINOR CHANNEL') do (SET WERF_PATH=%%g)
) ELSE (
    START /B multiwerf update MAJOR.MINOR CHANNEL >~/.multiwerf/background_update.log 2>&1
)

DOSKEY werf=%WERF_PATH% $*

При обновлении multiwerf пытается скачать правильную версию werf, основываясь на специальном файле соответствий версий и каналов. По умолчанию multiwerf использует файл соответствий, который хранится и сопровождается в репозитории werf (https://github.com/flant/werf/blob/multiwerf/multiwerf.json)

Такой подход позволяет использовать одни и теже версии werf локально и в CI, а также не задумываться об обновлениях. Разработчики werf создают релизы с правками и новым функционалом, переключают версии в каналах, в то время как пользователь, везде использует одну единственную команду.

Способ 2: установка бинарного файла

Выберите подходящую версию из релизов на GitHub или на bintray и используйте один из предложенных подходов с выбранным URL-адресом.

MacOS

curl -L https://dl.bintray.com/flant/werf/v1.0.6-rc.5/werf-darwin-amd64-v1.0.6-rc.5 -o /tmp/werf
chmod +x /tmp/werf
sudo mv /tmp/werf /usr/local/bin/werf

Linux

curl -L https://dl.bintray.com/flant/werf/v1.0.6-rc.5/werf-linux-amd64-v1.0.6-rc.5 -o /tmp/werf
chmod +x /tmp/werf
sudo mv /tmp/werf /usr/local/bin/werf

Windows

PowerShell
$WERF_BIN_PATH = "C:\ProgramData\werf\bin"
mkdir $WERF_BIN_PATH

Invoke-WebRequest -Uri https://dl.bintray.com/flant/werf/v1.0.6-rc.5/werf-windows-amd64-v1.0.6-rc.5.exe -OutFile $WERF_BIN_PATH\werf.exe

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + "$WERF_BIN_PATH",
    [EnvironmentVariableTarget]::Machine)

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
cmd.exe (run as Administrator)
set WERF_BIN_PATH="C:\ProgramData\werf\bin"
mkdir %WERF_BIN_PATH%
bitsadmin.exe /transfer "werf" https://dl.bintray.com/flant/werf/v1.0.6-rc.5/werf-windows-amd64-v1.0.6-rc.5.exe %WERF_BIN_PATH%\werf.exe
setx /M PATH "%PATH%;%WERF_BIN_PATH%"

# откройте новую сессию и начните использовать werf

Способ 3: сборка из исходников

go get github.com/flant/werf/cmd/werf

Обещание обратной совместимости

Note: Настоящее обещание относится к werf, начиная с версии 1.0, и не относится к предыдущим версиям или версиям dapp

werf использует семантическое версионирование. Это значит, что мажорные версии (1.0, 2.0) могут быть обратно не совместимыми между собой. В случае werf это означает, что обновление на следующую мажорную версию может потребовать полного передеплоя приложений, либо других ручных операций.

Минорные версии (1.1, 1.2, etc) могут добавлять новые “значительные” изменения, но без существенных проблем обратной совместимости в пределах мажорной версии. В случае werf это означает, что обновление на следующую минорную версию в большинстве случаев будет беспроблемным, но может потребоваться запуск предоставленных скриптов миграции.

Патч-версии (1.1.0, 1.1.1, 1.1.2) могут добавлять новые возможности, но без каких-либо проблем обратной совместимости в пределах минорной версии (1.1.x). В случае werf это означает, что обновление на следующий патч (следующую патч-версию) не должно вызывать проблем и требовать каких-либо ручных действий.

Все изменения проходят полный цикл по каналам стабильности:

  • Канал обновлений alpha может содержать новые возможности и быть нестабильным. Релизы выполняются с высокой периодичностью. Мы не гарантируем обратную совместимость между версиями канала обновлений alpha.
  • Канал обновлений beta предназначен для более детального тестирования новых возможностей. Мы не гарантируем обратную совместимость между версиями канала обновлений beta.
  • Канал обновлений ea безопасно использовать в некритичных окружениях и при локальной разработке. Мы не гарантируем обратную совместимость между версиями канала обновлений ea.
  • Канал обновлений stable считается безопасным и рекомендуемым для всех окружений. Мы гарантируем, что версия канала обновлений ea перейдет в канал обновлений stable не ранее чем через неделю после внутреннего тестирования. Мы гарантируем обратную совместимость между версиями канала обновлений stable в пределах минорной версии (1.1.x).
  • Канал обновлений rock-solid рекомендуется использовать в критичных окружениях с высоким SLA. Мы гарантируем, что версия из канала обновлений stable перейдет в канал обновлений rock-solid не ранее чем через 2 недели плотного тестирования. Мы гарантируем обратную совместимость между версиями канала обновлений rock-solid в пределах минорной версии (1.1.x).

Соответствие каналов и релизов описывается в файле multiwerf.json, а использование актуальной версии werf в рамках канала должно быть организовано с помощью утилиты multiwerf.

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