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

от автора

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

Есть такой инструмент для сканирования на утечку секретов, паролей и 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.


ссылка на оригинал статьи https://habr.com/ru/articles/904146/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *