Как я могу извлечь содержимое из файла, хранящегося в репозитории gitlab - PullRequest
0 голосов
/ 16 февраля 2020

Используя пакет gitlab- python, я бы хотел извлечь строки из всех файлов Docker. Используя мой код, приведенный ниже, я могу получить имена проектов и URL-адрес нужного мне репозитория, но как я могу убедиться, что существует Dockerfile, и прочитать содержимое Dockerfile.

import gitlab
import json
from pprint import pprint
import requests
import urllib.request


# private token authentication
gl = gitlab.Gitlab('<path_to_gitlab_repo>', private_token=<token_here>)

gl.auth()

# list all projects
projects = gl.projects.list()
for project in projects:
    # print(project) # prints all the meta data for the project
    print("Project: ", project.name)
    print("Gitlab URL: ", project.http_url_to_repo)
    # print("Branches: ", project.repo_branches)
    pprint(project.repository_tree(all=True))
    f = urllib.request.urlopen(project.http_url_to_repo)
    myfile = f.read()
    print(myfile)
    print("\n\n")

Вывод, который я получаю сейчас:

Gitlab URL:  <path_to_gitlab_repo>
[{'id': '0c4a64925f5c129d33557',
  'mode': '1044',
  'name': 'README.md',
  'path': 'README.md',
  'type': 'blob'}]

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете использовать метод project.files.get() ( см. Документацию ), чтобы получить Dockerfile проекта.

Затем вы можете распечатать содержимое файла Dockerfile / сделать все, что захотите сделать это следующим образом:

import gitlab
import base64


# private token authentication
gl = gitlab.Gitlab(<gitlab-url>, private_token=<private-token>)

gl.auth()

# list all projects
projects = gl.projects.list(all=True)
for project in projects:
    # print(project) # prints all the meta data for the project
    # print("Project: ", project.name)
    # print("Gitlab URL: ", project.http_url_to_repo)

    # Skip projects without branches
    if len(project.branches.list()) == 0:
        continue

    branch = project.branches.list()[0].name

    try:
        f = project.files.get(file_path='Dockerfile', ref=branch)
    except gitlab.exceptions.GitlabGetError:
        # Skip projects without Dockerfile
        continue

    file_content = base64.b64decode(f.content).decode("utf-8")
    print(file_content.replace('\\n', '\n'))

Возможно, вам придется изменить имя ветви, если есть несколько ветвей.

...