Чтобы запустить скрипт через Dockerfile (основанный на redhat/ubi8) и интегрировать его в GitLab CI/CD, выполните следующие шаги:


1. Структура проекта

Создайте структуру проекта, например:

project-root/
├── Dockerfile
├── list_ldap_users.sh
└── .gitlab-ci.yml

Здесь:

  • list_ldap_users.sh — ваш Bash-скрипт.
  • Dockerfile — файл для создания Docker-образа.
  • .gitlab-ci.yml — конфигурация для GitLab CI/CD.

2. Dockerfile

# Базовый образ
FROM redhat/ubi8

# Установка необходимых пакетов
RUN dnf install -y curl jq && \
    dnf clean all

# Копирование скрипта в контейнер
COPY list_ldap_users.sh /usr/local/bin/list_ldap_users.sh

# Делаем скрипт исполняемым
RUN chmod +x /usr/local/bin/list_ldap_users.sh

# Команда по умолчанию
CMD ["/usr/local/bin/list_ldap_users.sh"]

Пояснение:

  1. Базовый образ: Используется redhat/ubi8.
  2. Установка зависимостей:
    • curl для выполнения HTTP-запросов.
    • jq для обработки JSON.
  3. Копирование скрипта: Скрипт list_ldap_users.sh копируется в контейнер.
  4. Права доступа: Скрипт делается исполняемым.
  5. CMD: По умолчанию запускается скрипт.

3. GitLab CI/CD конфигурация (.gitlab-ci.yml)

stages:
  - build
  - run

variables:
  NEXUS_URL: "http://<nexus-host>:<port>"  # Замените на ваш URL
  USERNAME: "admin"                        # Замените на имя пользователя
  PASSWORD: "password"                     # Замените на пароль
  TARGET_ROLE: "my-role"                   # Замените на целевую роль

build_image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t nexus-ldap-users:latest .
    - docker save nexus-ldap-users:latest > nexus-ldap-users.tar
  artifacts:
    paths:
      - nexus-ldap-users.tar

run_script:
  stage: run
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker load < nexus-ldap_users.tar
    - docker run --rm \
        -e NEXUS_URL="$NEXUS_URL" \
        -e USERNAME="$USERNAME" \
        -e PASSWORD="$PASSWORD" \
        -e TARGET_ROLE="$TARGET_ROLE" \
        nexus-ldap-users:latest

Пояснение:

  1. Стадии (stages):
    • build: Сборка Docker-образа.
    • run: Запуск скрипта внутри контейнера.
  2. Переменные окружения:
    • Замените значения переменных (NEXUS_URL, USERNAME, PASSWORD, TARGET_ROLE) на актуальные данные.
  3. Сборка образа:
    • Собирается Docker-образ с помощью docker build.
    • Образ сохраняется как артефакт (nexus-ldap-users.tar).
  4. Запуск скрипта:
    • Образ загружается из артефакта.
    • Запускается контейнер с передачей переменных окружения.

4. Модификация скрипта для работы с переменными окружения

Обновите list_ldap_users.sh, чтобы он использовал переменные окружения вместо жестко заданных значений:

#!/bin/bash

# Конфигурация из переменных окружения
NEXUS_URL=${NEXUS_URL:-"http://localhost:8081"}  # URL Nexus (по умолчанию localhost)
USERNAME=${USERNAME:-"admin"}                    # Имя пользователя
PASSWORD=${PASSWORD:-"password"}                # Пароль
TARGET_ROLE=${TARGET_ROLE:-"my-role"}           # Целевая роль

# Получение списка всех пользователей через API
response=$(curl -s -u "$USERNAME:$PASSWORD" -X GET "$NEXUS_URL/service/rest/v1/security/users")

# Проверка успешности запроса
if [[ $? -ne 0 ]]; then
    echo "Ошибка при получении данных от Nexus API"
    exit 1
fi

# Фильтрация LDAP-пользователей с целевой ролью
ldap_users_with_role=$(echo "$response" | jq -r --arg role "$TARGET_ROLE" '
    .[] 
    | select(.source == "LDAP" and (.roles | index($role) != null)) 
    | "\(.userId) (\(.firstName) \(.lastName))"
')

# Вывод результата
if [[ -z "$ldap_users_with_role" ]]; then
    echo "Нет LDAP-пользователей с ролью '$TARGET_ROLE'."
else
    echo "LDAP-пользователи с ролью '$TARGET_ROLE':"
    echo "$ldap_users_with_role"
fi

Пояснение:

  • Переменные окружения (NEXUS_URL, USERNAME, PASSWORD, TARGET_ROLE) используются для настройки скрипта.
  • Если переменные не заданы, используются значения по умолчанию.

5. Запуск в GitLab CI/CD

  1. Поместите файлы (Dockerfile, list_ldap_users.sh, .gitlab-ci.yml) в ваш репозиторий.
  2. Настройте переменные окружения в GitLab:
    • Перейдите в Settings > CI/CD > Variables.
    • Добавьте переменные NEXUS_URL, USERNAME, PASSWORD, TARGET_ROLE.
  3. Запустите пайплайн:
    • GitLab автоматически запустит пайплайн, который:
      • Соберет Docker-образ.
      • Запустит скрипт внутри контейнера.

6. Пример вывода в GitLab CI/CD

Если все настроено правильно, вы увидите вывод скрипта в логах GitLab CI/CD:

Running with gitlab-runner 15.0.0
...
$ docker run --rm -e NEXUS_URL="$NEXUS_URL" -e USERNAME="$USERNAME" -e PASSWORD="$PASSWORD" -e TARGET_ROLE="$TARGET_ROLE" nexus-ldap-users:latest
LDAP-пользователи с ролью 'my-role':
user1 (John Doe)
user2 (Jane Smith)

7. Дополнительные рекомендации

  • Безопасность: Не храните чувствительные данные (например, пароли) в коде. Используйте переменные окружения GitLab или секреты.
  • Тестирование: Перед развертыванием протестируйте скрипт локально, чтобы убедиться, что он работает корректно.

Если у вас возникнут вопросы или потребуется помощь с доработкой, дайте знать!