Как стать автором
Обновить

Доверяем но проверяем: DevOps

Время на прочтение5 мин
Количество просмотров3.4K

Доверяем но проверяем

Есть такой инструмент для сканирования на утечку секретов, паролей и API ключей – GitLeaks.

Очень популярный проект, но совершенно, на мой взгляд не заслуженно. Качество кода вызывает вопросы, нельзя указывать свои списки с regex паттернами для проверки, и он не умеет отдавать правильный JSON в stdout, что делает его бесполезным автоматизации или пользовании на бэкенде.

Прекрасная возможность:

  • Использовать Julia – один из лучших языков программирования, который почему-то считается нишевым. Область его применения гораздо шире HPC. Он идеально подходит для решения самых разных задач.

  • Научиться как правильно публиковаться на GitHub.

  • Научиться делать линуксовые пакеты.

Долго не будем останавливаться на коде. Код лучше писать или читать, обсуждать его не очень интересно.

Сам скрипт работает следующим образом:

Usage: julia leaquor.jl [options]

Options:
  -h, --help          Display this help message.
  --json              Output results in JSON format.
  --output-file FILE  Write JSON results to the specified file.
  --patterns FILE     Load additional patterns from a YAML file.
  --ignore-files LIST Comma-separated list of files to ignore (e.g., "file1.txt,file2.json").
  --repo URL          Clone and scan a GitHub repository (e.g., https://github.com/user/repo.git).
  --dir PATH          Scan a specific directory on the file system.
  --entropy-threshold FLOAT Set custom entropy threshold (default: 3.5).
  --log-file FILE     Write logs to the specified file.

Arguments:
  Either --repo or --dir must be provided.

Examples:
  julia leaquor.jl --repo https://github.com/user/repo.git --json --output-file out.json
  julia leaquor.jl --dir ./my_project --patterns custom_patterns.yaml | jq .

--patterns <YAML файл с кастомными regex паттернами для поиска>
--dir указываем директорию для сканирования
--repo можно указывать сразу GitHub репо


Интереснее посмотреть как это правильно оформить для GitHub:

Docker и DEB пакеты

В одном Docker файле мы собираем проект на Julia. Julia в этом смысле ничем не отличается от Python или других более популярных языков.

В втором Docker файле мы так же собираем проект, но добавляется nfpm - инструмент на замну стандартному toolchainу для DEB и RPM пакетов.

# Generate DEB packages
RUN nfpm pkg --config nfpm.yaml --target leaquor.deb

# Final stage to output packages
FROM scratch
COPY --from=packager /app/leaquor.deb /leaquor.deb

Последние две директивы собирают и копируют пакет в текущую директорю.

Make

Создается Makefile который использует для Docker для сборки:

# Build the Docker image
docker-build:
	@echo "Building Docker image $(DOCKER_IMAGE)..."
	docker build -t $(DOCKER_IMAGE) .

# Run the Docker container
docker-run:
	@echo "Running Docker container $(DOCKER_CONTAINER)..."
	docker run --rm -v $(PWD):/app $(DOCKER_IMAGE) --help

Если вызвать его без аргументов то появится help:

make
Available targets:
  test             - Run unit tests
  docker-build     - Build the Docker image
  docker-run       - Run the Docker container
  docker-push      - Push the Docker image to Docker Hub
  docker-clean     - Clean up Docker artifacts (images, containers, volumes)
  docker-clean-all - Force cleanup of all Docker images and artifacts
  release          - Create a GitHub release
  open-issue       - Open a new issue on GitHub
  create-pr        - Create a pull request
  list-issues      - List open issues
  list-prs         - List open pull requests
  deploy-docs      - Deploy documentation to GitHub Pages
  check-workflows  - Check GitHub Actions workflow status
  generate-changelog - Generate a changelog

Этой командой можно запушить образ на DockerHub:

# Push the Docker image to Docker Hub
docker-push: docker-build
	@echo "Logging into Docker Hub..."
	@docker login -u $(DOCKER_HUB_USERNAME)
	@echo "Tagging image for Docker Hub..."
	docker tag $(DOCKER_IMAGE) $(DOCKER_HUB_REPO):latest
	@echo "Pushing image to Docker Hub..."
	docker push $(DOCKER_HUB_REPO):latest
	@echo "Image pushed successfully to $(DOCKER_HUB_REPO):latest"

Ничто не мешает нам использовать GitHub CLI для того, чтобы тэгировать репо из грузить его, а также в GitHub release (да это там слева с цифрами v1.0.0):

# Target: Create a Git tag and release on GitHub
.PHONY: release
release:
	@echo "Creating Git tag and releasing on GitHub..."
	@read -p "Enter the version number (e.g., v1.0.0): " version; \
	git tag -a $$version -m "Release $$version"; \
	git push origin $$version; \
	gh release create $$version --generate-notes
	@echo "Release $$version created and pushed to GitHub."

# Upload .deb package to GitHub release
upload-release:
	@if [ ! -f "leaquor.deb" ]; then \
        	echo "Error: leaquor.deb not found. Please run 'make package' first."; \
        	exit 1; \
    	fi
	@echo "Uploading leaquor.deb to GitHub release $(RELEASE_TAG)..."
	gh release upload $(RELEASE_TAG) leaquor.deb --repo $(GITHUB_REPO)
	@echo "Upload complete"
Release
Release

Test

В данном случае мы просто запускаем скрипт в docker контейнере и используем на leaky-repo – тестовый репо где точно есть утечки секретных данных.

# Test target to validate the script
test: docker-build clone-test-repo
	@echo "Running tests..."
	docker run --rm \
        	-v $(PWD)/$(JULIA_SCRIPT):/app/$(JULIA_SCRIPT) \
        	-v $(PWD)/$(TEST_REPO_DIR):/app/$(TEST_REPO_DIR) \
        	--name $(DOCKER_CONTAINER) \
        	$(DOCKER_IMAGE) \
        	julia /app/$(JULIA_SCRIPT) --dir /app/$(TEST_REPO_DIR) \
			--patterns patterns.yaml \
			--output-file results.json \
	       		--log-file /app/test.log
	@echo "Tests completed. Check test.log for details."

Pipeline

Ну и наконец, чтобы все было по GitOps давайте сделаем пайплайн GitHub:

name: CI/CD Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2

    - name: Log in to Docker Hub
      if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_TOKEN }}

    - name: Build Docker image
      run: make docker-build

    - name: Run tests
      run: make test

    - name: Build package (on tag push)
      if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
      run: make package

    - name: Push Docker image to Docker Hub (on tag push)
      if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
      run: |
        docker tag leaquor-image:latest ${{ secrets.DOCKER_HUB_REPO }}:${{ github.ref_name }}
        docker push ${{ secrets.DOCKER_HUB_REPO }}:${{ github.ref_name }}
        

Здесь в очень просто, потому что мы завернули все в Make. Можно просто запускать таргеты make docker-build, make test и делать это автоматически при пуше.


На самом деле все очень просто. С помощью Julia можно решать стандартные каждодневные day-to-day задачи, и использовать для этого Docker и GitHub.

Теги:
Хабы:
+3
Комментарии0

Публикации

Работа

Ближайшие события