Вызов fetchgit без SSL-подтверждения - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь использовать fetchgit для загрузки исходных репозиториев с частного сервера GitLab моей лаборатории, который в настоящее время самостоятельно подписывает свой сертификат SSL.

default.nix:

with (import <nixpkgs> {});
{ test-pkg = callPackage ./test-pkg.nix {
    buildPythonPackage = python35Packages.buildPythonPackage;
    };
}

test-pkg.nix:

{ buildPythonPackage,fetchgit }:

buildPythonPackage rec {
  pname = "test-pkg";
  version = "0.2.1";

  src = fetchgit {
    url = "https://gitlabserver/experiment-deployment/test-pkg";
    rev = "refs/tags/v${version}";
    sha256 = "43c2c9e5e7a16b6c88ba3088a9bfc82f7db8e13378be7c78d6c14a5f8ed05afd";
  };
}    

Что приводит к ошибке при вызове nix-shell

fatal: unable to access 'https://gitlabserver/experiment-deployment/test-pkg/': SSL certificate problem: self signed certificate

Глядя на build-support / fetchgit , этоКажется, что fetchgit сделан с mkDerivation, поэтому я попытался сделать новый fetchgit, используя overrideAttrs. Я передаю переменную среды git, чтобы git игнорировал проверку SSL, ожидая, что переменная будет инициализирована на этапе установки.

исправлено default.nix:

with (import <nixpkgs> {});
let fetchgit-no-verify = fetchgit.overrideAttrs { GIT_SSL_NO_VERIFY=true;} ;
in rec {
  test-pkg = callPackage ./test-pkg.nix {
    buildPythonPackage = python35Packages.buildPythonPackage;
    fetchgit = fetchgit-no-verify;
    };
}

Я думал, чтоочень умно, когда я думал об этом на выходных, я обнаружил, что при реализации моей новой ошибки говорится, что

error: attribute 'overrideAttrs' missing, at [...]/default.nix:2:26

Проверка fetchgit в nix repl показывает, что это набор атрибутов functor. Я попытался немного добраться до overrideAttrs, но безуспешно. Пытаясь снова, я увидел, что git может быть передано в fetchGit,

, пересмотрено default.nix:

with (import <nixpkgs> {});
let git = git.overrideAttrs { GIT_SSL_NO_VERIFY=true;} ;
    fetchgit-no-verify = fetchgit.override { git=git-no-verify;} ;
in rec {
  test-pkg = callPackage ./test-pkg.nix {
    buildPythonPackage = python35Packages.buildPythonPackage;
    fetchgit = fetchgit-no-verify;
    };
}

, но новая ошибка:

 error: attempt to call something which is not a function but a set, at /nix/store/jmynn33vcn3mcscsch0zf46fz9wsw05y-nixpkgs-20.03pre193309.c4196cca9ac/nixpkgs/pkgs/stdenv/generic/make-derivation.nix:318:55

Наконец, на мои вопросы. Есть ли способ добавить переменную окружения в производные fetchgit или git? Возможно, есть другой способ подключения - какой-то встроенный параметр, который я пропустил? Я мог бы использовать частный репозиторий, используя ssh и избегая https, однако из-за того, как мы проводим эксперименты, я бы хотел этого избежать.

1 Ответ

1 голос
/ 30 сентября 2019

Я смог сделать эту работу с этой уродливой вещью.

default.nix:

with (import <nixpkgs> {});
let fetchgit-no-verify = fetchgit // {
  __functor = self : args :
      (fetchgit.__functor self args).overrideAttrs (oldAttrs:{GIT_SSL_NO_VERIFY=true;});
  } ;
in rec {
  test-pkg = callPackage ./test-pkg.nix {
    buildPythonPackage = python35Packages.buildPythonPackage;
    fetchgit = fetchgit-no-verify;
    };
}

fetchgit-no-verify использует набор функторов fetchgit для начала и перезаписывает__functor атрибут с новой функцией. Новый функтор просто применяет свои аргументы и затем вызывает overrideAttrs.

Это работает, но я рад наградить ответ всем, кто может добавить некоторые идеи или предлагает другое решение. Во-первых, я хотел бы знать, как вывод fetchgit становится функтором. Это что-то делает callPackage?

...