aenvs/.docs/00-initial-qa-session/init.md

4.4 KiB
Raw Permalink Blame History

cli tool

We're going to make a tool which objective is to sync .env variables between different machines and team members; Предполагается, что cli общается с сервером, имплементация которого остаётся за рамками этого спринта. При этом, нужно понимать, что сервер существует и для упрощения дальнейшей разработки задать вопросы и подготовить документацию для дальнейшего кодирования сервера. Сам сервер мы не проектируем, но описываем интерфейс для работы с ним, чтобы сервер можно было замокать и тестировать CLI приложение.

Язык разработки golang.

Stories

Read projects list

cmd: aevs project -l (or --list)

shows project's list from the server

    uuid | name

Update project (project's name)

cmd: aevs project save -n "project_name" (or --name) optional: - -c, --config to identify config path to use parseConfig to get project variable (project_id); - -i --id to identify project's id w/o reading config;

Delete project

cmd: aevs project remove --id {uuid.UUID} (or -r) removes project's envs from the server; asks user to type project's name to proof that user really wants to delete project from the server;

Read remote project's environments

cmd: by uuid: aevs project read --id {uuid.UUID} (or --read-id) cmd: by name: aevs project read --name {name} (or --read-name)

shows project's environment's list w/ version indentation: f.e.:

    version_creation_timestamp | version_name | creator | branch_name | active/inactive
        - production    | relative_path
        - development   | relative_path
        - local         | relative_path

Sync project's environments by config

cmd: aevs sync - -c, --config [FILE_PATH] identifies path to config to use with parseConfig, if not provided tries to read DEFAULT_CONFIG path;

fails w/ an error "no config found" if no config found;

  • THEN uses parseLocals to read local env files
  • THEN makes server request to retrieve version's environments (listed at the config only);
    • if version is inactive, server responds w/ latest version data;
  • THEN makes diffs map
  • THEN recursively asks what environments to save at the local files (new environments should be added to a local map w/o questions) here's two options: - result files creates new version (updates local env files and saves new version at the server);

Merge versions

cmd: aevs merge mandatory flags: - -v, --version - the list of space separate versions (timestamp) to be merged into a single one optional flag) - -n, --name - new version's name

Gets version's environments and asks user to select which version is correct; If name is not provided - set timestamp as a version's name; All merged versions becomes inactive;

Functions

parseConfig

Parse provided directory and search for a config file (file path should be provided or DEFAULT_CONFIG path would be used). Reads this file to retrieve:

  • project_id (uuid.UUID);
  • version_id (timestamp);
  • api_key (string);
  • active environment's names and paths to it's files
    project: "11111111-1111-1111-1111-0123456789ab"
    api_key: "this-is-my-key"
    version: "12341234"
    environments:
        production:
            path: "production_env_path"
        development:
            path: "dev_env_path"

parseLocals

Parse current directory and all subdirectories, then searches for all files with *.env.* naming; Creates map[K]map[string]any object where: - K -- environment variables file name, f.e. ./docker/.env.prod --> .env.prod

Environments:

DEFAULT_CONFIG = aevs.yaml

Types

type Project struct {
    Id uuid.UUID `json:"id"`
    Name string `json:"name"`
}

type State int

const (
    ACTIVE State = 1
    INACTIVE State = -1
}

type Version struct {
    Ts int64 `json:"ts"` // unix timestamp;
    Name string `json:"name"`
    Creator string `json:"creator"`
    Branch string `json:"branch"`
    State State `json:"state"`
    Envs []Env `json:"envs"`
}

type Env struct {
    Name string `json:"name"`
    Path string `json:"path"`
}