Skip to content

Python required for RST rendering

Summary

We in the University of Cambridge are kicking the tires on our GitLab EE install and have discovered that RST documents do not get rendered. Example repository and logs are linked to from https://gitlab.developers.cam.ac.uk/uis/devops/devhub/docs/issues/1. The logs suggest that one of the GitLab containers should have Python installed.

Steps to reproduce

  1. Install GitLab from helm chart.
  2. Create a project and repository with a ReStructuredText README.
  3. Visit project page.

Configuration used

We use terraform to manage the helm release. The command line options used to build the configuration are as follows. Specific values for the variables can be provided on request.

  # By default, new users cannot create groups. This does not affect the ability
  # of existing group owners to create subgroups and it does not change the "can
  # create groups" bit for existing users.
  set {
    name  = "global.appConfig.defaultCanCreateGroup"
    value = "false"
  }

  # Users (unless invited by others) will have their usernames match their
  # crsids. In general, we want to discourage changing usernames.
  set {
    name  = "global.appConfig.usernameChangingEnabled"
    value = "false"
  }

  # Components which should not be installed
  set {
    name  = "gitlab-runner.install"
    value = "false"
  }

  set {
    name  = "postgresql.install"
    value = "false"
  }

  set {
    name  = "global.minio.enabled"
    value = "false"
  }

  # Certmanager issuer
  set {
    name  = "certmanager-issuer.email"
    value = "${var.certmanager_email}"
  }

  # Database configuration redacted

  # Domain, hostname and external IP configuration redacted

  # Persistence. Use a custom retained storage class which is SSD backed.
  set {
    name  = "redis.persistence.storageClass"
    value = "${var.storage_class}"
  }

  set {
    name  = "gitlab.gitaly.persistence.storageClass"
    value = "${var.storage_class}"
  }

  set {
    name  = "gitlab.gitaly.persistence.size"
    value = "${var.gitaly_persistence_size}"
  }

  # Backup object storage
  set {
    name  = "global.appConfig.backups.bucket"
    value = "${google_storage_bucket.backup.name}"
  }

  set {
    name  = "global.appConfig.backups.tmpBucket"
    value = "${google_storage_bucket.backup_temp.name}"
  }

  set {
    name  = "gitlab.task-runner.backups.objectStorage.config.secret"
    value = "${local.backups_s3cfg_secret}"
  }

  set {
    name  = "gitlab.task-runner.backups.objectStorage.config.key"
    value = "s3cfg"
  }

  # Uploads object storage
  set {
    name  = "global.appConfig.uploads.bucket"
    value = "${local.uploads_storage_bucket}"
  }

  set {
    name  = "global.appConfig.uploads.connection.secret"
    value = "${local.uploads_storage_secret}"
  }

  set {
    name  = "global.appConfig.uploads.connection.key"
    value = "${local.uploads_storage_key}"
  }

  # Lfs object storage
  set {
    name  = "global.appConfig.lfs.bucket"
    value = "${local.lfs_storage_bucket}"
  }

  set {
    name  = "global.appConfig.lfs.connection.secret"
    value = "${local.lfs_storage_secret}"
  }

  set {
    name  = "global.appConfig.lfs.connection.key"
    value = "${local.lfs_storage_key}"
  }

  # Artifacts object storage
  set {
    name  = "global.appConfig.artifacts.bucket"
    value = "${local.artifacts_storage_bucket}"
  }

  set {
    name  = "global.appConfig.artifacts.connection.secret"
    value = "${local.artifacts_storage_secret}"
  }

  set {
    name  = "global.appConfig.artifacts.connection.key"
    value = "${local.artifacts_storage_key}"
  }

  # Packages object storage
  set {
    name  = "global.appConfig.packages.bucket"
    value = "${local.packages_storage_bucket}"
  }

  set {
    name  = "global.appConfig.packages.connection.secret"
    value = "${local.packages_storage_secret}"
  }

  set {
    name  = "global.appConfig.packages.connection.key"
    value = "${local.packages_storage_key}"
  }

  # Configuration for docker image registry storage
  set {
    name  = "registry.storage.secret"
    value = "${local.registry_storage_secret}"
  }

  set {
    name  = "registry.storage.key"
    value = "${local.registry_storage_key}"
  }

  set {
    name  = "registry.storage.extraKey"
    value = "${local.registry_storage_extra_key}"
  }

  set {
    name  = "global.registry.bucket"
    value = "${local.registry_storage_bucket}"
  }

  # SAML configuration
  set {
    name  = "global.appConfig.omniauth.enabled"
    value = "true"
  }

  set {
    name  = "global.appConfig.omniauth.allowSingleSignOn[0]"
    value = "saml"
  }

  set {
    name  = "global.appConfig.omniauth.blockAutoCreatedUsers"
    value = "false"
  }

  set {
    name  = "global.appConfig.omniauth.autoLinkSamlUser"
    value = "true"
  }

  set {
    name  = "global.appConfig.omniauth.providers[0].secret"
    value = "${local.saml_config_secret}"
  }

  set {
    name  = "global.appConfig.omniauth.providers[0].key"
    value = "config"
}

Current behavior

We cannot render repositories with ReStrucutredText READMEs

Expected behavior

READMEs either render or are shown as text.

Versions

  • Chart: 1.3.4
  • Platform: GKE
  • Helm: (helm version)
    • Client: 2.11.0
    • Server: 2.11.0

Relevant logs

Completed 500 Internal Server Error in 64ms (ActiveRecord: 10.0ms | Elasticsearch: 0.0ms)
ActionView::Template::Error (No such file or directory - python2):
3: - unless context[:markdown_engine] == :redcarpet
4: - context[:rendered] = blob.rendered_markup if blob.respond_to?(:rendered_markup)
5: .file-content.wiki
6: = markup(blob.name, blob.data, context)
lib/gitlab/other_markup.rb:11:in `render'
app/helpers/markup_helper.rb:277:in `other_markup_unsafe'
app/helpers/markup_helper.rb:162:in `markup_unsafe'
app/helpers/markup_helper.rb:120:in `markup'
app/views/projects/blob/viewers/_markup.html.haml:6:in `_app_views_projects_blob_viewers__markup_html_haml__3397475243023731680_46969018836380'
app/views/projects/blob/_viewer.html.haml:23:in `_app_views_projects_blob__viewer_html_haml___3868546677886242378_46969012500280'
app/controllers/application_controller.rb:318:in `view_to_html_string'
app/controllers/concerns/renders_blob.rb:20:in `blob_json'
app/controllers/projects/blob_controller.rb:288:in `show_json'
app/controllers/projects/blob_controller.rb:50:in `block (2 levels) in show'
app/controllers/projects/blob_controller.rb:42:in `show'
lib/gitlab/i18n.rb:55:in `with_locale'
lib/gitlab/i18n.rb:61:in `with_user_locale'
app/controllers/application_controller.rb:427:in `set_locale'
lib/gitlab/middleware/multipart.rb:101:in `call'
lib/gitlab/request_profiler/middleware.rb:14:in `call'
ee/lib/gitlab/jira/middleware.rb:15:in `call'
lib/gitlab/middleware/go.rb:17:in `call'
lib/gitlab/etag_caching/middleware.rb:11:in `call'
lib/gitlab/middleware/rails_queue_duration.rb:22:in `call'
lib/gitlab/metrics/rack_middleware.rb:15:in `block in call'
lib/gitlab/metrics/transaction.rb:53:in `run'
lib/gitlab/metrics/rack_middleware.rb:15:in `call'
lib/gitlab/middleware/read_only/controller.rb:40:in `call'
lib/gitlab/middleware/read_only.rb:16:in `call'
lib/gitlab/middleware/basic_health_check.rb:25:in `call'
lib/gitlab/request_context.rb:20:in `call'
lib/gitlab/metrics/requests_rack_middleware.rb:27:in `call'
lib/gitlab/middleware/release_env.rb:10:in `call'
Edited by DJ Mountney