diff --git a/Makefile b/Makefile index 1cdad07..4c9daf8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PLATFORMS := ubuntu-2004 ubuntu-2204 debian-10 debian-11 debian-12 centos-7 centos-8 rhel-9 opensuse-154 +PLATFORMS := ubuntu-2004 ubuntu-2204 debian-10 debian-11 debian-12 centos-7 centos-8 rhel-9 opensuse-154 fedora-37 fedora-38 SLS_BINARY ?= ./node_modules/serverless/bin/serverless.js deps: diff --git a/README.md b/README.md index 7503c0a..f43401f 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ R binaries are built for the following Linux operating systems: - Red Hat Enterprise Linux 7, 8, 9 - openSUSE 15.4 - SUSE Linux Enterprise 15 SP4 +- Fedora 37, 38 Operating systems are supported until their vendor end-of-support dates, which can be found on the [Posit Platform Support](https://posit.co/about/platform-support/) @@ -146,6 +147,24 @@ Then install the package: sudo zypper --no-gpg-checks install R-${R_VERSION}-1-1.x86_64.rpm ``` +#### Fedora Linux + +Download the rpm package: +```bash +# Fedora 37 +curl -O https://cdn.posit.co/r/fedora-37/pkgs/r-${R_VERSION}_1_amd64.rpm + +# Fedora 38 +curl -O https://cdn.posit.co/r/fedora-38/pkgs/r-${R_VERSION}_1_amd64.rpm +``` + +Then install the package: +```bash +sudo dnf install r-${R_VERSION}_1_amd64.rpm +``` + + + ### Verify R installation Test that R was successfully installed by running: diff --git a/builder/Dockerfile.fedora-37 b/builder/Dockerfile.fedora-37 new file mode 100644 index 0000000..ed865c4 --- /dev/null +++ b/builder/Dockerfile.fedora-37 @@ -0,0 +1,88 @@ +FROM fedora:37 + +ENV OS_IDENTIFIER fedora-37 + +RUN dnf -y upgrade \ + && dnf -y install dnf-plugins-core \ + && dnf -y install \ + autoconf \ + automake \ + bzip2-devel \ + cairo-devel \ + flexiblas-devel \ + gcc-c++ \ + gcc-gfortran \ + java-11-openjdk-devel \ + libICE-devel \ + libSM-devel \ + libX11-devel \ + libXmu-devel \ + libXt-devel \ + libcurl-devel \ + libicu-devel \ + libjpeg-devel \ + libpng-devel \ + libtiff-devel \ + libtool \ + make \ + ncurses-devel \ + pango-devel \ + pcre-devel \ + pcre2-devel \ + readline-devel \ + rpm-build \ + tcl-devel \ + tex \ + texinfo-tex \ + texlive-collection-latexrecommended \ + tk-devel \ + unzip \ + valgrind-devel \ + which \ + wget \ + xz-devel \ + zlib-devel \ + && dnf clean all + +# Install AWS CLI +RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + ./aws/install && \ + rm -rf aws awscliv2.zip + +RUN if [ "$(arch)" == "aarch64" ]; then echo arm64; else echo amd64; fi > /tmp/arch + +RUN curl -LO "https://github.com/goreleaser/nfpm/releases/download/v2.18.1/nfpm_$(cat /tmp/arch).rpm" && \ + dnf install -y "nfpm_$(cat /tmp/arch).rpm" && \ + rm "nfpm_$(cat /tmp/arch).rpm" + +RUN chmod 0777 /opt + +# Configure flags for that don't use the defaults in build.sh +ENV CONFIGURE_OPTIONS="\ + --enable-R-shlib \ + --with-tcltk \ + --enable-memory-profiling \ + --with-x \ + --with-system-valgrind-headers \ + --with-tcl-config=/usr/lib64/tclConfig.sh \ + --with-tk-config=/usr/lib64/tkConfig.sh \ + --enable-prebuilt-html \ + --with-blas=flexiblas \ + --with-lapack=flexiblas" + +# Make sure that patching Java does not break R. +# R's default JAVA_HOME path includes the exact Java version on CentOS/RHEL, which +# requires users to run `R CMD javareconf` even on minor/patch upgrades. Use the +# major version symlink to avoid this. +# https://cran.r-project.org/doc/manuals/r-release/R-admin.html#Java-support +# https://solutions.posit.co/envs-pkgs/using-rjava/ +ENV JAVA_HOME=/usr/lib/jvm/jre-11-openjdk + +# R 3.x requires PCRE2 for Pango support on RHEL 9 +ENV INCLUDE_PCRE2_IN_R_3 yes + +COPY package.fedora-37 /package.sh +COPY build.sh . +COPY patches /patches +ENTRYPOINT ./build.sh diff --git a/builder/Dockerfile.fedora-38 b/builder/Dockerfile.fedora-38 new file mode 100644 index 0000000..a5540dc --- /dev/null +++ b/builder/Dockerfile.fedora-38 @@ -0,0 +1,88 @@ +FROM fedora:38 + +ENV OS_IDENTIFIER fedora-38 + +RUN dnf -y upgrade \ + && dnf -y install dnf-plugins-core \ + && dnf -y install \ + autoconf \ + automake \ + bzip2-devel \ + cairo-devel \ + flexiblas-devel \ + gcc-c++ \ + gcc-gfortran \ + java-11-openjdk-devel \ + libICE-devel \ + libSM-devel \ + libX11-devel \ + libXmu-devel \ + libXt-devel \ + libcurl-devel \ + libicu-devel \ + libjpeg-devel \ + libpng-devel \ + libtiff-devel \ + libtool \ + make \ + ncurses-devel \ + pango-devel \ + pcre-devel \ + pcre2-devel \ + readline-devel \ + rpm-build \ + tcl-devel \ + tex \ + texinfo-tex \ + texlive-collection-latexrecommended \ + tk-devel \ + unzip \ + valgrind-devel \ + which \ + wget \ + xz-devel \ + zlib-devel \ + && dnf clean all + +# Install AWS CLI +RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip" -o "awscliv2.zip" && \ + unzip awscliv2.zip && \ + ./aws/install && \ + rm -rf aws awscliv2.zip + +RUN if [ "$(arch)" == "aarch64" ]; then echo arm64; else echo amd64; fi > /tmp/arch + +RUN curl -LO "https://github.com/goreleaser/nfpm/releases/download/v2.18.1/nfpm_$(cat /tmp/arch).rpm" && \ + dnf install -y "nfpm_$(cat /tmp/arch).rpm" && \ + rm "nfpm_$(cat /tmp/arch).rpm" + +RUN chmod 0777 /opt + +# Configure flags that don't use the defaults in build.sh +ENV CONFIGURE_OPTIONS="\ + --enable-R-shlib \ + --with-tcltk \ + --enable-memory-profiling \ + --with-x \ + --with-system-valgrind-headers \ + --with-tcl-config=/usr/lib64/tclConfig.sh \ + --with-tk-config=/usr/lib64/tkConfig.sh \ + --enable-prebuilt-html \ + --with-blas=flexiblas \ + --with-lapack=flexiblas" + +# Make sure that patching Java does not break R. +# R's default JAVA_HOME path includes the exact Java version on CentOS/RHEL, which +# requires users to run `R CMD javareconf` even on minor/patch upgrades. Use the +# major version symlink to avoid this. +# https://cran.r-project.org/doc/manuals/r-release/R-admin.html#Java-support +# https://solutions.posit.co/envs-pkgs/using-rjava/ +ENV JAVA_HOME=/usr/lib/jvm/jre-11-openjdk + +# R 3.x requires PCRE2 for Pango support on RHEL 9 +ENV INCLUDE_PCRE2_IN_R_3 yes + +COPY package.fedora-38 /package.sh +COPY build.sh . +COPY patches /patches +ENTRYPOINT ./build.sh diff --git a/builder/docker-compose.yml b/builder/docker-compose.yml index 8f3bd3d..b8b0407 100644 --- a/builder/docker-compose.yml +++ b/builder/docker-compose.yml @@ -107,3 +107,27 @@ services: image: r-builds:opensuse-154 volumes: - ./integration/tmp:/tmp/output + fedora-37: + command: ./build.sh + environment: + - R_VERSION=${R_VERSION} + - R_INSTALL_PATH=${R_INSTALL_PATH} + - LOCAL_STORE=/tmp/output + build: + context: . + dockerfile: Dockerfile.fedora-37 + image: r-builds:fedora-37 + volumes: + - ./integration/tmp:/tmp/output + fedora-38: + command: ./build.sh + environment: + - R_VERSION=${R_VERSION} + - R_INSTALL_PATH=${R_INSTALL_PATH} + - LOCAL_STORE=/tmp/output + build: + context: . + dockerfile: Dockerfile.fedora-38 + image: r-builds:fedora-38 + volumes: + - ./integration/tmp:/tmp/output \ No newline at end of file diff --git a/builder/package.fedora-37 b/builder/package.fedora-37 new file mode 100644 index 0000000..9a7151f --- /dev/null +++ b/builder/package.fedora-37 @@ -0,0 +1,74 @@ +#!/bin/bash + +if [[ ! -d /tmp/output/${OS_IDENTIFIER} ]]; then + mkdir -p "/tmp/output/${OS_IDENTIFIER}" +fi + +# R 3.x requires PCRE1. On RHEL 9, R 3.x also requires PCRE2 for Pango support. +pcre_libs='- pcre2-devel' +if [[ "${R_VERSION}" =~ ^3 ]]; then + pcre_libs='- pcre2-devel +- pcre-devel' +fi + +blas_lib='flexiblas-devel' + +# Create postremove script to remove empty directories, as nFPM doesn't include them in the RPM files. +cat <> /after-remove.sh +if [ -d ${R_INSTALL_PATH} ]; then + rm -r ${R_INSTALL_PATH} +fi +EOF + +scripts="scripts: + postremove: /after-remove.sh +" + +if [ "$(arch)" == "aarch64" ]; then echo arm64; else echo amd64; fi > /tmp/arch + +cat < /tmp/nfpm.yml +name: R-${R_VERSION} +version: 1 +version_schema: none +arch: $(cat /tmp/arch) +release: 1 +maintainer: Posit Software, PBC +description: | + GNU R statistical computation and graphics system +vendor: Posit Software, PBC +homepage: https://www.r-project.org +license: GPLv2+ +depends: +- bzip2-devel +- gcc +- gcc-c++ +- gcc-gfortran +- libcurl-devel +- libicu-devel +- libSM +- libtiff +- libXmu +- libXt +- make +- ${blas_lib} +- pango +${pcre_libs} +- tcl +- tk +- unzip +- which +- xz-devel +- zip +- zlib-devel +contents: +- src: ${R_INSTALL_PATH} + dst: ${R_INSTALL_PATH} +${scripts} +EOF + +nfpm package \ + -f /tmp/nfpm.yml \ + -p rpm \ + -t "/tmp/output/${OS_IDENTIFIER}" + +export PKG_FILE=$(ls /tmp/output/${OS_IDENTIFIER}/R-${R_VERSION}*.rpm | head -1) diff --git a/builder/package.fedora-38 b/builder/package.fedora-38 new file mode 100644 index 0000000..9a7151f --- /dev/null +++ b/builder/package.fedora-38 @@ -0,0 +1,74 @@ +#!/bin/bash + +if [[ ! -d /tmp/output/${OS_IDENTIFIER} ]]; then + mkdir -p "/tmp/output/${OS_IDENTIFIER}" +fi + +# R 3.x requires PCRE1. On RHEL 9, R 3.x also requires PCRE2 for Pango support. +pcre_libs='- pcre2-devel' +if [[ "${R_VERSION}" =~ ^3 ]]; then + pcre_libs='- pcre2-devel +- pcre-devel' +fi + +blas_lib='flexiblas-devel' + +# Create postremove script to remove empty directories, as nFPM doesn't include them in the RPM files. +cat <> /after-remove.sh +if [ -d ${R_INSTALL_PATH} ]; then + rm -r ${R_INSTALL_PATH} +fi +EOF + +scripts="scripts: + postremove: /after-remove.sh +" + +if [ "$(arch)" == "aarch64" ]; then echo arm64; else echo amd64; fi > /tmp/arch + +cat < /tmp/nfpm.yml +name: R-${R_VERSION} +version: 1 +version_schema: none +arch: $(cat /tmp/arch) +release: 1 +maintainer: Posit Software, PBC +description: | + GNU R statistical computation and graphics system +vendor: Posit Software, PBC +homepage: https://www.r-project.org +license: GPLv2+ +depends: +- bzip2-devel +- gcc +- gcc-c++ +- gcc-gfortran +- libcurl-devel +- libicu-devel +- libSM +- libtiff +- libXmu +- libXt +- make +- ${blas_lib} +- pango +${pcre_libs} +- tcl +- tk +- unzip +- which +- xz-devel +- zip +- zlib-devel +contents: +- src: ${R_INSTALL_PATH} + dst: ${R_INSTALL_PATH} +${scripts} +EOF + +nfpm package \ + -f /tmp/nfpm.yml \ + -p rpm \ + -t "/tmp/output/${OS_IDENTIFIER}" + +export PKG_FILE=$(ls /tmp/output/${OS_IDENTIFIER}/R-${R_VERSION}*.rpm | head -1) diff --git a/install.sh b/install.sh index b46c812..4b9a51f 100755 --- a/install.sh +++ b/install.sh @@ -52,9 +52,14 @@ detect_os () { then distro="LEAP12" fi - if [[ -f /etc/centos-release || -f /etc/redhat-release ]] + if [[ -f /etc/centos-release || -f /etc/redhat-release || -f /etc/fedora-release ]] then - distro="RedHat" + if [[ -f /etc/fedora-release ]] + then + distro="Fedora" + else + distro="RedHat" + fi fi if [[ $(cat /etc/os-release | grep -e "^CPE_NAME\=*" | cut -f 2 -d '=') =~ cpe:/o:suse:sles:12 ]] then @@ -94,11 +99,11 @@ detect_os () { # Returns the OS version detect_os_version () { os=$1 - if [[ "${os}" =~ ^(RedHat|Alma|Rocky)$ ]]; then + if [[ "${os}" =~ ^(RedHat|Alma|Rocky|Fedora)$ ]]; then # Get the major version. /etc/redhat-release is used if /etc/os-release isn't available, # e.g., on CentOS/RHEL 6. if [[ -f /etc/os-release ]]; then - cat /etc/os-release | grep VERSION_ID= | sed -E 's/VERSION_ID="([0-9.]*)"/\1/' | cut -d '.' -f 1 + cat /etc/os-release | grep VERSION_ID= | sed -E 's/VERSION_ID="?([0-9.]*)"?/\1/' | cut -d '.' -f 1 elif [[ -f /etc/redhat-release ]]; then cat /etc/redhat-release | sed -E 's/[^0-9]+([0-9.]+)[^0-9]*/\1/' | cut -d '.' -f 1 fi @@ -119,7 +124,7 @@ detect_os_version () { detect_installer_type () { os=$1 case $os in - "RedHat" | "CentOS" | "LEAP12" | "LEAP15" | "SLES12" | "SLES15" | "Amazon" | "Alma" | "Rocky") + "RedHat" | "Fedora" | "CentOS" | "LEAP12" | "LEAP15" | "SLES12" | "SLES15" | "Amazon" | "Alma" | "Rocky") echo "rpm" ;; "Ubuntu" | "Debian") @@ -160,7 +165,7 @@ download_name () { ;; esac case $os in - "RedHat" | "CentOS" | "Amazon" | "Alma" | "Rocky") + "RedHat" | "Fedora" | "CentOS" | "Amazon" | "Alma" | "Rocky") echo "R-${version}-1-1.${rpm_arch}.rpm" ;; "Ubuntu" | "Debian") @@ -185,6 +190,9 @@ download_url () { else case $os in + "Fedora") + echo "${CDN_URL}/fedora-${ver}/pkgs/${name}" + ;; "RedHat" | "CentOS" | "Amazon" | "Alma" | "Rocky") if [ "${ver}" -ge 9 ]; then echo "${CDN_URL}/rhel-${ver}/pkgs/${name}" @@ -304,7 +312,7 @@ install_rpm () { yes="-y" fi case $os in - "RedHat" | "CentOS" | "Amazon" | "Alma" | "Rocky") + "RedHat" | "Fedora" | "CentOS" | "Amazon" | "Alma" | "Rocky") if ! has_sudo "yum"; then echo "Must have sudo privileges to run yum" exit 1 @@ -333,6 +341,8 @@ install_pre () { ver=$2 case $os in + "Fedora") + ;; "RedHat" | "CentOS" | "Alma" | "Rocky") install_epel "${os}" "${ver}" ;; diff --git a/serverless-resources.yml b/serverless-resources.yml index cd846bf..9e8f6db 100644 --- a/serverless-resources.yml +++ b/serverless-resources.yml @@ -257,6 +257,34 @@ rBuildsBatchJobDefinitionOpensuse154: Image: "#{AWS::AccountId}.dkr.ecr.#{AWS::Region}.amazonaws.com/r-builds:opensuse-154" Timeout: AttemptDurationSeconds: 7200 +rBuildsBatchJobDefinitionFedora37: + Type: AWS::Batch::JobDefinition + Properties: + Type: container + ContainerProperties: + Command: + - ./build.sh + Vcpus: 4 + Memory: 4096 + JobRoleArn: + "Fn::GetAtt": [ rBuildsEcsTaskIamRole, Arn ] + Image: "#{AWS::AccountId}.dkr.ecr.#{AWS::Region}.amazonaws.com/r-builds:fedora-37" + Timeout: + AttemptDurationSeconds: 7200 +rBuildsBatchJobDefinitionFedora38: + Type: AWS::Batch::JobDefinition + Properties: + Type: container + ContainerProperties: + Command: + - ./build.sh + Vcpus: 4 + Memory: 4096 + JobRoleArn: + "Fn::GetAtt": [ rBuildsEcsTaskIamRole, Arn ] + Image: "#{AWS::AccountId}.dkr.ecr.#{AWS::Region}.amazonaws.com/r-builds:fedora-38" + Timeout: + AttemptDurationSeconds: 7200 # step function cloudwatch event trigger resources rBuildsEventRuleIamRole: diff --git a/serverless.yml b/serverless.yml index 3b4af82..f857a4e 100644 --- a/serverless.yml +++ b/serverless.yml @@ -63,7 +63,11 @@ provider: Ref: rBuildsBatchJobDefinitionRhel9 JOB_DEFINITION_ARN_opensuse_154: Ref: rBuildsBatchJobDefinitionOpensuse154 - SUPPORTED_PLATFORMS: ubuntu-2004,ubuntu-2204,debian-10,debian-11,debian-12,centos-7,centos-8,rhel-9,opensuse-154 + JOB_DEFINITION_ARN_fedora_37: + Ref: rBuildsBatchJobDefinitionFedora37 + JOB_DEFINITION_ARN_fedora_38: + Ref: rBuildsBatchJobDefinitionFedora38 + SUPPORTED_PLATFORMS: ubuntu-2004,ubuntu-2204,debian-10,debian-11,debian-12,centos-7,centos-8,rhel-9,opensuse-154,fedora-37,fedora-38 functions: queueBuilds: diff --git a/test/docker-compose.yml b/test/docker-compose.yml index f44e77e..4ba742b 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -71,3 +71,19 @@ services: - R_VERSION=${R_VERSION} volumes: - ../:/r-builds + fedora-37: + image: fedora:37 + command: /r-builds/test/test-yum.sh + environment: + - OS_IDENTIFIER=fedora-37 + - R_VERSION=${R_VERSION} + volumes: + - ../:/r-builds + fedora-38: + image: fedora:38 + command: /r-builds/test/test-yum.sh + environment: + - OS_IDENTIFIER=fedora-38 + - R_VERSION=${R_VERSION} + volumes: + - ../:/r-builds