transparencia-mg / dpckan

MIT License
5 stars 4 forks source link

Flag --exit-code --no-exit-code não funcionando corretamente #206

Open gabrielbdornas opened 1 year ago

gabrielbdornas commented 1 year ago

Ao tentar implantar fluxo de publicação automática no novo dataset template deparei com o seguinte erro:

Run dpckan --datastore --datapackage dataset/datapackage.json --ckan-host "$CKAN_HOST" --ckan-key "$CKAN_KEY" dataset create
Creating dataset ***/dataset/nome-pacote
Dataset ***/dataset/nome-pacote already published
Error: Process completed with exit code 1.

Os demais jobs não foram processados pois o exit code do comando dpckan dataset create foi 1. O que é estranho pois na documentação do pacote está escrito:

(venv) ➜  letters2 git:(main) ✗ dpckan --help
  --exit-code / --no-exit-code  Set exit code to 1. --no-exit-code = False set
                                as default. If you want exit code set to 1
                                exit-code flag must be informed.

Isso significa que o default do comando seria um exit code 0, o que permitiria a continuidade dos demais jobs.

Em um processo de debug rápido verifiquei que a função create do módulo create_dataset recebe e utiliza o parâmetro exit_code corretamente:

https://github.com/transparencia-mg/dpckan/blob/2de5072ca55ae5328a0fc1505abd41d1ab612b01/dpckan/create_dataset.py#L21-L25

O problema, identificado neste debug rápido, está na função run_dataset_validations que é chamada na linha 18:

https://github.com/transparencia-mg/dpckan/blob/2de5072ca55ae5328a0fc1505abd41d1ab612b01/dpckan/create_dataset.py#L18

O argumento exit_code não é passada para nenhuma função de validação e ali todos os erros são finalizados com sys.exit(1).

O comando echo $? me ajudou a visualizar o exit code no terminal, conforme demonstrado neste post.

gabrielbdornas commented 1 year ago

Tomar cuidado na hora de executar esta mudança. Ao tentar fazer incluir um if statement no final da função is_dataset_published_check o conjunto já publicado foi excluído:

def is_dataset_published_check(ckan_instance, package, exit_code):
  dataset = dataset_path(ckan_instance.address, package)
  if is_dataset_published(ckan_instance, package.name):
    click.echo(f'Dataset {dataset} already published')
    if exit_code:
        sys.exit(1)

Isso aconteceu porque o fluxo caiu no exept da função create do módulo create_dataset, que chama a função delete_dataset.

def create(ckan_host, ckan_key, datapackage, datastore, exit_code):
  local_datapackage = load_complete_datapackage(datapackage)
  dataset = dataset_path(ckan_host, local_datapackage)
  click.echo(f"Creating dataset {dataset}")
  ckan_instance = RemoteCKAN(ckan_host, apikey = ckan_key)
  try:
    run_dataset_validations(ckan_instance, local_datapackage)
    dataset_create(ckan_instance, local_datapackage, datastore)
    click.echo(f"Dataset {dataset} created")
  except Exception:
    delete_dataset(ckan_instance, local_datapackage.name)
    print(f"Error during {dataset} creation")
    if exit_code == True:
      sys.exit(1)