# Code Downloader

### Overview

Code Downloader — технический job, который подготавливает SSH окружение и скачивает исходный код из Git-репозитория в директорию `/code` перед запуском сканеров.

### Key capabilities

* Поднимает `ssh-agent` и добавляет приватный ключ из `PRIVATE_SSH_KEY`.
* Автоматически добавляет fingerprints хостов в `~/.ssh/known_hosts` через `ssh-keyscan`.
* Клонирует репозиторий в `/code` (опционально — конкретную ветку).

### How it works

1. Создаёт `~/.ssh` и выставляет безопасные права.
2. Запускает `ssh-agent`.
3. Добавляет SSH-ключ из `PRIVATE_SSH_KEY` через `ssh-add -`.
4. Очищает переменную `PRIVATE_SSH_KEY` (чтобы не «жила» дальше по окружению).
5. Для каждого хоста из `SSH_KNOWN_HOSTS` выполняет `ssh-keyscan -H` и дописывает результат в `~/.ssh/known_hosts`.
6. Переходит в `/code` и выполняет `git clone`:
   * если задан `BRANCH` — клонирует эту ветку;
   * иначе — клонирует дефолтную ветку.
7. Добавляет строку `BRANCH=...` в `.env`.
8. Проверяет, что в `/code` есть файлы кроме `.env`.

### Run details

Сканер использует официальный docker-образ:

* `registry.gitlab.com/traio-group/tools/toolset:latest`

Команда запуска

```ssh-config
mkdir -p ~/.ssh && chmod 700 ~/.ssh
eval $(ssh-agent -s)
echo "$PRIVATE_SSH_KEY" | ssh-add -
export PRIVATE_SSH_KEY=""
for host in $SSH_KNOWN_HOSTS; do
  ssh-keyscan -H "$host" >> ~/.ssh/known_hosts
done
cd /code
if [ -n "$BRANCH" ]; then
 git clone --branch $BRANCH --single-branch --depth 50 $REPOSITORY /code
 echo "BRANCH=$BRANCH" >> .env
else
 git clone --single-branch --depth 50 $REPOSITORY /code
 echo "BRANCH=$(git branch --show-current)" >> .env
fi 
if [ -d "/code" ]; then
    # List all files except .env
    non_env_files=$(find /code -mindepth 1 -not -name ".env")

    if [ -z "$non_env_files" ]; then
        echo "/code folder is empty (ignoring .env)."
        exit 1
    else
        echo "Code has been succesfully downloaded"
        exit 0
    fi
fi
```

### Configuration

#### Environment variables

| Name              | Default                 | Required | Description                                                                                                                                |
| ----------------- | ----------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `REPOSITORY`      |                         | true     | SSH URL репозитория для клонирования (например, `git@gitlab.com:group/project.git`).                                                       |
| `BRANCH`          |                         | false    | Ветка для клонирования. Если не задана — используется дефолтная ветка репозитория.                                                         |
| `SSH_KNOWN_HOSTS` | `gitlab.com github.com` | false    | Список хостов (через пробел), которые будут добавлены в `known_hosts` через `ssh-keyscan`. Пример: `gitlab.com github.com 192.168.50.198`. |
| `PRIVATE_SSH_KEY` | `""`                    | true     | Приватный SSH ключ для доступа к репозиторию. Используется командой `ssh-add -`.                                                           |

### Troubleshooting

* **Host key verification failed**: добавьте хост репозитория в `SSH_KNOWN_HOSTS`.
* **Permission denied (publickey)**: проверьте, что `PRIVATE_SSH_KEY` корректный и имеет доступ к репозиторию.
