first commit
This commit is contained in:
commit
fd4731129a
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Launch Package",
|
||||
"type": "go",
|
||||
"request": "launch",
|
||||
"mode": "auto",
|
||||
"program": "${fileDirname}"
|
||||
},
|
||||
{
|
||||
"name": "Attach to Running Go Program",
|
||||
"type": "go",
|
||||
"request": "attach",
|
||||
"mode": "remote",
|
||||
"remotePath": "${workspaceFolder}",
|
||||
"port": 40000,
|
||||
"host": "127.0.0.1"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
# Debug
|
||||
```dlv debug --headless --listen=:40000 --api-version=2```
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
module hello
|
||||
|
||||
go 1.23.5
|
||||
|
||||
require (
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
|
|
@ -0,0 +1,342 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"gopkg.in/ini.v1"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// Variables описывает работу с .ini файлами
|
||||
type Variables struct {
|
||||
iniFileName string
|
||||
config *ini.File
|
||||
}
|
||||
|
||||
// NewVariables конструктор для работы с .ini файлами
|
||||
func NewVariables(iniFileName string) *Variables {
|
||||
config, err := ini.LooseLoad(iniFileName)
|
||||
if err != nil {
|
||||
log.Fatalf("Ошибка загрузки ini-файла: %v", err)
|
||||
}
|
||||
|
||||
return &Variables{
|
||||
iniFileName: iniFileName,
|
||||
config: config,
|
||||
}
|
||||
}
|
||||
|
||||
// GetVar читает или запрашивает переменную из .ini
|
||||
func (v *Variables) GetVar(sectionName, varName string, interactive bool) string {
|
||||
section := v.config.Section(sectionName)
|
||||
value := section.Key(varName).String()
|
||||
|
||||
if interactive || value == "" {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
fmt.Printf("Введите %s (%s): ", varName, value)
|
||||
newValue, _ := reader.ReadString('\n')
|
||||
newValue = strings.TrimSpace(newValue)
|
||||
|
||||
if newValue != "" {
|
||||
section.Key(varName).SetValue(newValue)
|
||||
v.config.SaveTo(v.iniFileName)
|
||||
return newValue
|
||||
}
|
||||
}
|
||||
if !interactive && value == "" {
|
||||
fmt.Printf("Переменная %s не найдена", varName)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
return value
|
||||
}
|
||||
|
||||
// MenuItem описывает структуру меню из YAML
|
||||
type MenuItem struct {
|
||||
Title string `yaml:"title"`
|
||||
File string `yaml:"file,omitempty"`
|
||||
Items map[int]MenuItem `yaml:"items,omitempty"`
|
||||
Commands []string `yaml:"commands,omitempty"`
|
||||
Catch []string `yaml:"catch,omitempty"`
|
||||
Vars []string `yaml:"vars,omitempty"`
|
||||
Env string `yaml:"env,omitempty"`
|
||||
}
|
||||
|
||||
// Menu управляет отображением меню
|
||||
type Menu struct {
|
||||
items map[int]MenuItem
|
||||
variables *Variables
|
||||
baseDir string
|
||||
}
|
||||
|
||||
// NewMenu инициализирует меню из YAML
|
||||
func NewMenu(yamlFile string) *Menu {
|
||||
currDir, _ := os.Getwd()
|
||||
// baseDir := filepath.Join(currDir, "menu") // Базовая директория меню
|
||||
baseDir := currDir
|
||||
yamlPath := resolvePath(baseDir, yamlFile)
|
||||
|
||||
// Читаем YAML файл
|
||||
file, err := os.Open(yamlPath)
|
||||
if err != nil {
|
||||
log.Fatalf("Ошибка чтения YAML файла %s: %v", yamlPath, err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
decoder := yaml.NewDecoder(file)
|
||||
var menu struct {
|
||||
Items map[int]MenuItem `yaml:"items"`
|
||||
}
|
||||
|
||||
if err := decoder.Decode(&menu); err != nil {
|
||||
log.Fatalf("Ошибка парсинга YAML: %v", err)
|
||||
}
|
||||
|
||||
return &Menu{
|
||||
items: menu.Items,
|
||||
variables: NewVariables("env.ini"),
|
||||
baseDir: baseDir,
|
||||
}
|
||||
}
|
||||
|
||||
// resolvePath корректно формирует путь к файлу
|
||||
func resolvePath(baseDir, yamlFile string) string {
|
||||
// Если путь абсолютный, используем его как есть
|
||||
if filepath.IsAbs(yamlFile) {
|
||||
return yamlFile
|
||||
}
|
||||
|
||||
// Если путь уже содержит сегмент "menu", оставляем всё как есть
|
||||
if strings.HasPrefix(baseDir, "menu"+string(os.PathSeparator)) {
|
||||
return filepath.Join(baseDir, yamlFile)
|
||||
}
|
||||
|
||||
// Обычно добавляем сегмент "menu" перед файлом
|
||||
return filepath.Join(baseDir, string(os.PathSeparator)+"menu", yamlFile)
|
||||
}
|
||||
|
||||
// ShowItems отображает главное меню
|
||||
func (m *Menu) ShowItems() {
|
||||
fmt.Println("0. Выход")
|
||||
|
||||
//Извлекаем ключи из мапы
|
||||
keys := make([]int, 0, len(m.items))
|
||||
for key := range m.items {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
|
||||
//Сортируем ключи
|
||||
sort.Ints(keys)
|
||||
|
||||
for _, key := range keys {
|
||||
fmt.Printf("%s\n", m.items[key].Title)
|
||||
}
|
||||
}
|
||||
|
||||
// Loop запускает интерактивный цикл меню
|
||||
func (m *Menu) Loop() {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
|
||||
for {
|
||||
m.ShowItems()
|
||||
fmt.Print("Выберите действие: ")
|
||||
input, _ := reader.ReadString('\n')
|
||||
input = strings.TrimSpace(input)
|
||||
|
||||
if input == "0" {
|
||||
break
|
||||
}
|
||||
|
||||
if itemNum, err := strconv.Atoi(input); err == nil {
|
||||
m.ChooseItem(itemNum)
|
||||
} else {
|
||||
fmt.Println("Неверный ввод")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ChooseItem обрабатывает выбор элемента меню
|
||||
func (m *Menu) ChooseItem(itemNum int) {
|
||||
item, found := m.items[itemNum]
|
||||
if !found {
|
||||
fmt.Println("Элемент не найден")
|
||||
return
|
||||
}
|
||||
|
||||
if len(item.File) > 0 {
|
||||
// Подгружаем дочернее меню
|
||||
f := strings.TrimPrefix(item.File, string(os.PathSeparator))
|
||||
filePath := resolvePath(m.baseDir, f)
|
||||
subMenu := NewMenu(filePath)
|
||||
subMenu.Loop()
|
||||
} else if len(item.Items) > 0 {
|
||||
subMenu := &Menu{items: item.Items, variables: m.variables, baseDir: m.baseDir}
|
||||
subMenu.Loop()
|
||||
} else if len(item.Commands) > 0 {
|
||||
vars := m.getVars(item, true)
|
||||
if !m.runCommands(item, vars) {
|
||||
m.catch(item, vars)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Menu) ExecItem(itemNum int) *Menu {
|
||||
item, found := m.items[itemNum]
|
||||
if !found {
|
||||
fmt.Println("Элемент не найден")
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(item.File) > 0 {
|
||||
// Подгружаем дочернее меню
|
||||
f := strings.TrimPrefix(item.File, string(os.PathSeparator))
|
||||
filePath := resolvePath(m.baseDir, f)
|
||||
subMenu := NewMenu(filePath)
|
||||
return subMenu
|
||||
} else if len(item.Items) > 0 {
|
||||
subMenu := &Menu{items: item.Items, variables: m.variables, baseDir: m.baseDir}
|
||||
return subMenu
|
||||
} else if len(item.Commands) > 0 {
|
||||
vars := m.getVars(item, false)
|
||||
if !m.runCommands(item, vars) {
|
||||
m.catch(item, vars)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// getVars получает переменные из .ini
|
||||
func (m *Menu) getVars(item MenuItem, interactive bool) map[string]string {
|
||||
vars := make(map[string]string)
|
||||
vars["currentDir"], _ = os.Getwd()
|
||||
|
||||
for _, varName := range item.Vars {
|
||||
vars[varName] = m.variables.GetVar(item.Env, varName, interactive)
|
||||
}
|
||||
|
||||
return vars
|
||||
}
|
||||
|
||||
// runCommands выполняет команды
|
||||
func (m *Menu) runCommands(item MenuItem, vars map[string]string) bool {
|
||||
for _, cmd := range item.Commands {
|
||||
// Здесь можно вызвать реальное выполнение, используя os/exec
|
||||
re := regexp.MustCompile(`%\(([a-zA-Z0-9]*)\)s`)
|
||||
command := re.ReplaceAllStringFunc(cmd, func(match string) string {
|
||||
// Извлекаем ключ внутри %( и )s
|
||||
key := re.FindStringSubmatch(match)[1]
|
||||
|
||||
// Проверяем, есть ли значение для ключа в map
|
||||
if val, exists := vars[key]; exists {
|
||||
return val // Заменяем найденной строкой
|
||||
}
|
||||
// Если ключа нет в map, оставляем как есть
|
||||
return match
|
||||
})
|
||||
fmt.Printf("Выполнение: %s\n", command)
|
||||
|
||||
// Разделяем на части
|
||||
parts := strings.Split(command, " ")
|
||||
|
||||
// Проверяем, является ли первая часть установкой переменной окружения
|
||||
envs := []string{} // Хранилище для переменных окружения
|
||||
for len(parts) > 0 && strings.Contains(parts[0], "=") {
|
||||
envs = append(envs, parts[0]) // Добавляем переменную в массив env
|
||||
parts = parts[1:] // Убираем первую часть
|
||||
}
|
||||
|
||||
// Теперь `parts` содержит только саму команду и её аргументы
|
||||
cmd := exec.Command(parts[0], parts[1:]...)
|
||||
|
||||
// Добавляем переменные окружения к текущим
|
||||
cmd.Env = append(os.Environ(), envs...)
|
||||
// Передаём текущее окружение
|
||||
// cmd.Env = os.Environ()
|
||||
cmd.Stdin = os.Stdin // Ввод
|
||||
cmd.Stdout = os.Stdout // Вывод
|
||||
cmd.Stderr = os.Stderr // Вывод ошибок
|
||||
|
||||
// Запускаем команду
|
||||
if err := cmd.Run(); err != nil {
|
||||
os.Stderr.WriteString("Ошибка выполнения: " + err.Error() + "\n")
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// catch выполняет обработку ошибок команд
|
||||
func (m *Menu) catch(item MenuItem, vars map[string]string) {
|
||||
for _, cmd := range item.Catch {
|
||||
fmt.Printf("Обработка ошибки: %s\n", cmd)
|
||||
// Здесь можно вызвать реальное выполнение, используя os/exec
|
||||
re := regexp.MustCompile(`%\(([a-zA-Z0-9]*)\)s`)
|
||||
command := re.ReplaceAllStringFunc(cmd, func(match string) string {
|
||||
// Извлекаем ключ внутри %( и )s
|
||||
key := re.FindStringSubmatch(match)[1]
|
||||
|
||||
// Проверяем, есть ли значение для ключа в map
|
||||
if val, exists := vars[key]; exists {
|
||||
return val // Заменяем найденной строкой
|
||||
}
|
||||
// Если ключа нет в map, оставляем как есть
|
||||
return match
|
||||
})
|
||||
fmt.Printf("Выполнение: %s\n", command)
|
||||
|
||||
// Разделяем на части
|
||||
parts := strings.Split(command, " ")
|
||||
|
||||
// Проверяем, является ли первая часть установкой переменной окружения
|
||||
envs := []string{} // Хранилище для переменных окружения
|
||||
for len(parts) > 0 && strings.Contains(parts[0], "=") {
|
||||
envs = append(envs, parts[0]) // Добавляем переменную в массив env
|
||||
parts = parts[1:] // Убираем первую часть
|
||||
}
|
||||
|
||||
// Теперь `parts` содержит только саму команду и её аргументы
|
||||
cmd := exec.Command(parts[0], parts[1:]...)
|
||||
|
||||
// Добавляем переменные окружения к текущим
|
||||
cmd.Env = append(os.Environ(), envs...)
|
||||
// Передаём текущее окружение
|
||||
// cmd.Env = os.Environ()
|
||||
cmd.Stdin = os.Stdin // Ввод
|
||||
cmd.Stdout = os.Stdout // Вывод
|
||||
cmd.Stderr = os.Stderr // Вывод ошибок
|
||||
|
||||
// Запускаем команду
|
||||
if err := cmd.Run(); err != nil {
|
||||
os.Stderr.WriteString("Ошибка выполнения: " + err.Error() + "\n")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Инициализация главного меню
|
||||
menu := NewMenu("menu.yml") // Файл главного меню (menu/menu.yml)
|
||||
|
||||
// Создаем флаг -e/--exec с необязательным аргументом
|
||||
execFlag := flag.String("exec", "", "Execution parameter")
|
||||
flag.Parse() // Парсим аргументы
|
||||
|
||||
if *execFlag != "" { // Проверяем, задан ли флаг --exec
|
||||
items := strings.Split(*execFlag, "-") // Разделяем строку по "-"
|
||||
for _, item := range items { // Итерируемся по элементам
|
||||
num, _ := strconv.Atoi(item)
|
||||
menu = menu.ExecItem(num)
|
||||
}
|
||||
os.Exit(0) // Завершаем выполнение программы
|
||||
}
|
||||
|
||||
menu.Loop()
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
items:
|
||||
1:
|
||||
title: '1. Build'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_dev.yml build --no-cache'
|
||||
vars:
|
||||
- appName
|
||||
2:
|
||||
title: '2. InitDB'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker run -v %(currentDir)s/data/mysql:/var/lib/mysql -v %(currentDir)s/dumps:/home/dumps -v %(currentDir)s/conf/scripts/mysql:/home/scripts -it %(appName)s_db sh /home/scripts/initDB.sh'
|
||||
vars:
|
||||
- appName
|
||||
3:
|
||||
title: '3. Deploy and Up'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'mkdir -p data/mysql'
|
||||
- 'mkdir -p app'
|
||||
- 'docker run -v %(currentDir)s/data/mysql:/var/lib/mysql -v %(currentDir)s/dumps:/home/dumps -v %(currentDir)s/conf/scripts/mysql:/home/scripts -it %(appName)s_db sh /home/scripts/initDB.sh'
|
||||
- 'sh conf/scripts/deploy/dev.sh'
|
||||
- 'docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet'
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_dev.yml up --force-recreate -d'
|
||||
- 'docker exec -it %(appName)s_workspace_1 sh /home/scripts/deploy_dev.sh'
|
||||
vars:
|
||||
- appName
|
||||
4:
|
||||
title: '4. Up'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet'
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_dev.yml up --force-recreate -d'
|
||||
vars:
|
||||
- appName
|
||||
5:
|
||||
title: '5. Stop'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_dev.yml stop'
|
||||
- 'sleep 3'
|
||||
- 'docker network rm dockernet'
|
||||
vars:
|
||||
- appName
|
||||
6:
|
||||
title: '6. Remove'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker rm %(appName)s_php_1 --force'
|
||||
- 'docker rm %(appName)s_workspace_1 --force'
|
||||
- 'docker rm %(appName)s_db_1 --force'
|
||||
- 'docker rm %(appName)s_nginx_1 --force'
|
||||
- 'docker rm %(appName)s_nodejs_1 --force'
|
||||
- 'docker rm %(appName)s_python_1 --force'
|
||||
- 'docker rm %(appName)s_ftp_1 --force'
|
||||
- 'docker rm %(appName)s_elastic_1 --force'
|
||||
- 'docker rmi %(appName)s_php --force'
|
||||
- 'docker rmi %(appName)s_workspace --force'
|
||||
- 'docker rmi %(appName)s_db --force'
|
||||
- 'docker rmi %(appName)s_nginx --force'
|
||||
- 'docker rmi %(appName)s_nodejs --force'
|
||||
- 'docker rmi %(appName)s_python --force'
|
||||
- 'docker rmi %(appName)s_ftp --force'
|
||||
- 'docker rmi %(appName)s_elastic --force'
|
||||
vars:
|
||||
- appName
|
||||
7:
|
||||
title: '7. In php workspace'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker exec -it %(appName)s_workspace_1 sh'
|
||||
vars:
|
||||
- appName
|
||||
8:
|
||||
title: '8. In nodejs workspace'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker exec -it %(appName)s_nodejs_1 /bin/bash'
|
||||
vars:
|
||||
- appName
|
||||
9:
|
||||
title: '9. Make Dump'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'docker exec -it %(appName)s_db_1 sh /home/scripts/makeDump.sh dump.sql'
|
||||
vars:
|
||||
- appName
|
||||
10:
|
||||
title: '10. SSHFS'
|
||||
items:
|
||||
1:
|
||||
title: '1. Mount'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'sshfs %(user)s@%(ip)s:%(remotePath)s %(currentDir)s/server'
|
||||
vars:
|
||||
- appName
|
||||
- user
|
||||
- ip
|
||||
- remotePath
|
||||
2:
|
||||
title: '2. Umount'
|
||||
env: 'dev'
|
||||
commands:
|
||||
- 'sudo umount -l %(currentDir)s/server'
|
||||
vars:
|
||||
- appName
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
items:
|
||||
1:
|
||||
title: '1. Develop'
|
||||
file: '/develop/menu.yml'
|
||||
2:
|
||||
title: '2. Test'
|
||||
file: '/test/menu.yml'
|
||||
3:
|
||||
title: '3. Production'
|
||||
file: '/prod/menu.yml'
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
items:
|
||||
1:
|
||||
title: '1. Build'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_prod.yml build --no-cache'
|
||||
vars:
|
||||
- appName
|
||||
2:
|
||||
title: '2. InitDB'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker run -v %(currentDir)s/data/mysql:/var/lib/mysql -v %(currentDir)s/dumps:/home/dumps -v %(currentDir)s/conf/scripts/mysql:/home/scripts -it %(appName)s_db sh /home/scripts/initDB.sh'
|
||||
vars:
|
||||
- appName
|
||||
3:
|
||||
title: '3. Deploy and Up'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'mkdir -p data/mysql'
|
||||
- 'mkdir -p app'
|
||||
- 'sh conf/scripts/deploy/test.sh'
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_prod.yml up --force-recreate -d'
|
||||
vars:
|
||||
- appName
|
||||
4:
|
||||
title: '4. Up'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_prod.yml up --force-recreate -d'
|
||||
vars:
|
||||
- appName
|
||||
5:
|
||||
title: '5. Stop'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_prod.yml stop'
|
||||
- 'sleep 3'
|
||||
- 'docker network rm dockernet'
|
||||
vars:
|
||||
- appName
|
||||
6:
|
||||
title: '6. Remove'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker rm %(appName)s_php_1 --force'
|
||||
- 'docker rm %(appName)s_db_1 --force'
|
||||
- 'docker rm %(appName)s_nginx_1 --force'
|
||||
- 'docker rm %(appName)s_ftp_1 --force'
|
||||
- 'docker rm %(appName)s_elastic_1 --force'
|
||||
- 'docker rm %(appName)s_redis_1 --force'
|
||||
- 'docker rmi %(appName)s_php --force'
|
||||
- 'docker rmi %(appName)s_db --force'
|
||||
- 'docker rmi %(appName)s_nginx --force'
|
||||
- 'docker rm %(appName)s_ftp --force'
|
||||
- 'docker rm %(appName)s_elastic --force'
|
||||
- 'docker rm %(appName)s_redis --force'
|
||||
vars:
|
||||
- appName
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
items:
|
||||
1:
|
||||
title: '1. Build'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_test.yml build --no-cache'
|
||||
vars:
|
||||
- appName
|
||||
2:
|
||||
title: '2. InitDB'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker run -v %(currentDir)s/data/mysql:/var/lib/mysql -v %(currentDir)s/dumps:/home/dumps -v %(currentDir)s/conf/scripts/mysql:/home/scripts -it %(appName)s_db sh /home/scripts/initDB.sh'
|
||||
vars:
|
||||
- appName
|
||||
3:
|
||||
title: '3. Deploy and Up'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'mkdir -p data/mysql'
|
||||
- 'mkdir -p app'
|
||||
- 'sh conf/scripts/deploy/test.sh'
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_test.yml up --force-recreate -d'
|
||||
vars:
|
||||
- appName
|
||||
4:
|
||||
title: '4. Up'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_test.yml up --force-recreate -d'
|
||||
vars:
|
||||
- appName
|
||||
5:
|
||||
title: '5. Stop'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker-compose --project-name %(appName)s --file conf/docker/docker-compose_test.yml stop'
|
||||
- 'sleep 3'
|
||||
- 'docker network rm dockernet'
|
||||
vars:
|
||||
- appName
|
||||
6:
|
||||
title: '6. Remove'
|
||||
env: 'test'
|
||||
commands:
|
||||
- 'docker rm %(appName)s_php_1 --force'
|
||||
- 'docker rm %(appName)s_db_1 --force'
|
||||
- 'docker rm %(appName)s_nginx_1 --force'
|
||||
- 'docker rm %(appName)s_ftp_1 --force'
|
||||
- 'docker rm %(appName)s_elastic_1 --force'
|
||||
- 'docker rm %(appName)s_redis_1 --force'
|
||||
- 'docker rmi %(appName)s_php --force'
|
||||
- 'docker rmi %(appName)s_db --force'
|
||||
- 'docker rmi %(appName)s_nginx --force'
|
||||
- 'docker rm %(appName)s_ftp --force'
|
||||
- 'docker rm %(appName)s_elastic --force'
|
||||
- 'docker rm %(appName)s_redis --force'
|
||||
vars:
|
||||
- appName
|
||||
Loading…
Reference in New Issue