Skip to content

Faire fonctionner le template pour build le manual d'un projet R

Ce template doit permettre de générer un manuel pdf pour un paquet R.

J'arrive bien à faire fonctionner ces commandes sur mon PC mais je n'ai pas réussi dans la CI.

Voici les jobs que j'ai essayé :

  • Test 1 : (à mettre dans templates-r.yml) utilise l'image tidyverse et essaie d'installer tout ce qu'il faut :
  # Build a pdf manual
  .R-build-pdf-manual:
    image: rocker/tidyverse
    tags:
      - docker
      - stable
    extends:
      - .R-default-globals
      - .R-package-cache
      - .R-update-packages
    script:
      - cd ${R_PACKAGE_ROOT_ABSOLUTE_PATH}
      - !reference [.R-update-packages, script]
      - echo '*** Additional configs... ***'
      - apt-get update
      - apt-get -yq install pandoc
      - >
        ${R_RUN_CODE_COMMAND} '
          source(file.path(Sys.getenv("CI_PROJECT_DIR"), "temp_gitlabTemplates", "optionsForCi.R")); setOptionsForCi();
          if (Sys.getenv("R_DO_PACKAGE_UPDATE") == 1 || !require("devtools")) {
            install.packages(pkgs = "devtools", repos = Sys.getenv("R_PACKAGE_SOURCE_REPO"))
          }
          '
      - >
        ${R_RUN_CODE_COMMAND} '
          source(file.path(Sys.getenv("CI_PROJECT_DIR"), "temp_gitlabTemplates", "optionsForCi.R")); setOptionsForCi();
          if (Sys.getenv("R_DO_PACKAGE_UPDATE") == 1 || !require("tinytex")) {
            install.packages(pkgs = "tinytex", repos = Sys.getenv("R_PACKAGE_SOURCE_REPO"))
          }
          '
      # Install tinytex
      - ${R_RUN_CODE_COMMAND} 'source(file.path(Sys.getenv("CI_PROJECT_DIR"), "temp_gitlabTemplates", "optionsForCi.R")); setOptionsForCi(); tinytex::install_tinytex()'
      # To solve error "Failed to build manual" with devtools::build_manual()
      # Solution from: https://stackoverflow.com/questions/69847540/devtoolsbuild-manual-error-failed-to-build-manual
      - ${R_RUN_CODE_COMMAND} 'source(file.path(Sys.getenv("CI_PROJECT_DIR"), "temp_gitlabTemplates", "optionsForCi.R")); setOptionsForCi(); tinytex::tlmgr_install("makeindex")'
      # Create package pdf manual
      - echo '*** Generate pdf manual... ***'
      - >
        ${R_RUN_CODE_COMMAND} '
          source(file.path(Sys.getenv("CI_PROJECT_DIR"), "temp_gitlabTemplates", "optionsForCi.R")); setOptionsForCi();
          res <- devtools::build_manual(path = ".");
          if (res$status != 0) {
            stop("devtools::build_manual() return a status code different from 0!")
          }
          pdfFilePath <- strsplit(x = res$command[4], split = "=")[[1]][2];
          message("Created file = ", pdfFilePath)
          '
    when: manual
    artifacts:
      paths:
        - ${R_PACKAGE_ROOT_RELATIVE_PATH}/*.pdf
  • Test 2 : (à mettre dans templates-r.yml) essaie d'utiliser l'image verse qui est sensée contenir tout ce qu'il faut :
  # Build a pdf manual
  .R-build-pdf-manual:
    image: rocker/verse
    tags:
      - docker
      - stable
    extends:
      - .R-default-globals
      - .R-package-cache
      - .R-update-packages
    script:
      - cd ${R_PACKAGE_ROOT_ABSOLUTE_PATH}
      - !reference [.R-update-packages, script]
      - echo '*** Additional configs... ***'
      - >
        ${R_RUN_CODE_COMMAND} '
          source(file.path(Sys.getenv("CI_PROJECT_DIR"), "temp_gitlabTemplates", "optionsForCi.R")); setOptionsForCi();
          if (Sys.getenv("R_DO_PACKAGE_UPDATE") == 1 || !require("devtools")) {
            install.packages(pkgs = "devtools", repos = Sys.getenv("R_PACKAGE_SOURCE_REPO"))
          }
          '
      # Create package pdf manual
      - echo '*** Generate pdf manual... ***'
      - >
        ${R_RUN_CODE_COMMAND} '
          source(file.path(Sys.getenv("CI_PROJECT_DIR"), "temp_gitlabTemplates", "optionsForCi.R")); setOptionsForCi();
          res <- devtools::build_manual(path = ".");
          if (res$status != 0) {
            stop("devtools::build_manual() return a status code different from 0!")
          }
          pdfFilePath <- strsplit(x = res$command[4], split = "=")[[1]][2];
          message("Created file = ", pdfFilePath)
          '
    when: manual
    artifacts:
      paths:
        - ${R_PACKAGE_ROOT_RELATIVE_PATH}/*.pdf

Dans les deux cas le test suivant (à mettre dans .gitlab-ci-r-tests.yml) retourne l'erreur vague Error in value[3L]: ! Failed to build manual :

Test R-build-pdf-manual Good:
  extends:
    - .R-build-pdf-manual
  rules:
    - changes:
      - .gitlab-ci.yml
      - tests/.gitlab-ci-r-tests.yml
      - templates/templates-r.yml
      - tests/r-package/*
      - R/*
  variables:
    R_PACKAGE_ROOT_RELATIVE_PATH: tests/r-package
  script:
    - !reference [.R-build-pdf-manual, script]
    - if [ -f "${R_PACKAGE_ROOT_ABSOLUTE_PATH}/minimal-1.0.0.pdf" ];
      then echo "File found"; exit 0;
      else echo "File not found"; exit -1;
      fi
  when: on_success
  allow_failure: false

Penser remettre la description dans /docs/Descriptions.md :

- **.R-build-pdf-manual**  
  Build a pdf manual for the package.  
  The generated pdf is available as un artifacts or at the parent package folder for subsequent jobs (named `/packagename-versionnumber.pdf`)
Edited by Astre Benjamin