RPM SPEC 파일을 통해 Haskell 앱을 빌드해야 할까요, 아니면 CI 파이프라인에서 (재현 가능한) 바이너리를 사용해야 할까요?

RPM SPEC 파일을 통해 Haskell 앱을 빌드해야 할까요, 아니면 CI 파이프라인에서 (재현 가능한) 바이너리를 사용해야 할까요?

저는 지난 20년 동안 처음부터 RPM을 구축해 본 적이 없습니다. 그래서 우리는 "절대로"라고 효과적으로 말할 수 있습니다.

[편집] RPM에 대한 요구 사항은 롤백, 버전 제어 등을 제공하는 것입니다. 그것은 협상할 수 없습니다.

설치해야 하는 단일 바이너리와 단일 구성 파일이 있습니다. 사용자 계정과 디렉터리에 대한 몇 가지 설정이 필요하며, 이는 간단해야 한다고 생각합니다.

RPM 빌드 프로세스에서 테스트되고 재현 가능한 빌드를 원한다면 CI 파이프라인 단계를 복제해야 합니다. 사소하지 않습니다. 이상적으로는 다른 위치에서 원하는 파일을 가져올 수 있습니다.

%prep
cp ${somefile} ${another file} $RPM_SOURCE_DIR
%setup
:

이것이 가능한가? 아니면 확실한 해결책을 놓치고 있는 걸까요?

감사해요.

답변1

내 관점에서는 정확히 무엇을 목표로 삼고 있는지에 따라 약간 다릅니다.

Fedora와 같은 Linux 배포판은 실제로 소프트웨어가 사양 파일을 사용하여 소스에서 빌드되는 배포 빌드를 기대하며(빌드에 사용되는 패키지/구성 요소를 문서화하는 밀봉된 빌드 시스템 내부) 이를 좋은 방법으로 간주하여 재현성을 최대한 얻습니다. 가능한 한.

그러나 실제로 사전 빌드된 바이너리를 가져와 사양 파일 내에서 사용하여 시나리오에 맞게 단축된 RPM 패키지를 빌드할 수 있습니다.

# […]
Source0: <binary file>
Source1: <config file>

# […]

%prep
%setup -q -c -T

%build

%install
install -D -p -m 0755 %{SOURCE0} $RPM_BUILD_ROOT%{_bindir}/%{name}
install -D -p -m 0644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/%{name}.conf

# […]

이것이 작동할 수도 있지만 결과 RPM 패키지의 종속성이 적합한지( rpm -qp --requires <…>.rpm) 또는 누락된 런타임 종속성이 있는지 명시적으로 확인해야 합니다. 배포 관련 항목을 추가하거나 런타임 종속성을 추출하는 RPM 패키지를 빌드하는 동안 컴파일 시간 옵션이나 매개변수(예: CFLAGSC LDFLAGS로 작성된 소프트웨어)뿐만 아니라 후처리 스크립트(예: )가 있는 경우가 많습니다. /usr/lib/rpm/(redhat/)brp-*이는 귀하에게 관련될 수도 있고 그렇지 않을 수도 있습니다(그리고 일부 후처리 스크립트는 사전 빌드된 바이너리에서도 작동할 수 있지만 다른 일부는 컴파일러 옵션이 부족하기 때문에 작동하지 않습니다). 많은 소프트웨어를 패키징하는 동안 Haskell에 대한 경험은 없지만 일부 Fedora 패키지를 살펴보면 런타임 종속성을 갖는 RPM 패키지가 있습니다(그리고 런타임 종속성이 있는 경우 이를 다음으로 충족해야 합니다). RPM 패키지, 이것이 RPM이 작동하는 방식이기 때문입니다. 그리고 RPM 패키지에서 제공하는 것 외에는 RPM이 이에 대해 알지 못하기 때문에 파일 시스템 어딘가에 일치하는 라이브러리를 두는 것만으로는 충분하지 않습니다. 따라서 사전 빌드된 바이너리에서 RPM 패키지를 빌드하면 나중에 런타임 오류로 나타날 수 있는 적절한 종속성이 없는 RPM 패키지가 생성될 수 있습니다.

위의 예와 관련하여: SourceX:URL이 제공될 수 있지만 RPM 패키지를 빌드할 때 디렉토리 rpmbuild의 디스크에 이러한 파일이 있을 것으로 예상합니다 SOURCES(그래서 디렉토리에 들어가는 방법은 SOURCES귀하에게 달려 있습니다).

어떤 Linux 배포판을 대상으로 하는지 언급하지 않았으므로 Fedora의 배포판을 연결하겠습니다.하스켈 패키징 지침 여기서는 더 많은 영감을 줄 수도 있고 안 줄 수도 있습니다. 그리고 그렇습니다. RPM 패키지는 교차 배포가 가능합니다. 이는 Linux 배포판마다 라이브러리/패키지 버전이 다르기 때문에 실제로 RPM 패키지 내부에 정적 바이너리가 생성되는 경우가 많습니다.

관련 정보