gitlab: Build frontend assets from source

Instead of extracting prebuilt assets from the debian build, build
them from the source. This should give faster package updates and
reduces the amount of data needed to be downloaded by more than 500MB.
This commit is contained in:
talyz
2019-10-08 11:24:06 +02:00
parent 09e657efea
commit 59324d1fb9
3 changed files with 14313 additions and 54 deletions
@@ -1,9 +1,21 @@
{ stdenv, lib, fetchurl, fetchFromGitLab, bundlerEnv
, ruby, tzdata, git, nettools, nixosTests
, gitlabEnterprise ? false
, ruby, tzdata, git, nettools, nixosTests, nodejs
, gitlabEnterprise ? false, callPackage, yarn
, yarn2nix-moretea
}:
let
flavour = if gitlabEnterprise then "ee" else "ce";
data = (builtins.fromJSON (builtins.readFile ./data.json)).${flavour};
version = data.version;
src = fetchFromGitLab {
owner = data.owner;
repo = data.repo;
rev = data.rev;
sha256 = data.repo_hash;
};
rubyEnv = bundlerEnv rec {
name = "gitlab-env-${version}";
inherit ruby;
@@ -26,28 +38,64 @@ let
ignoreCollisions = true;
};
flavour = if gitlabEnterprise then "ee" else "ce";
data = (builtins.fromJSON (builtins.readFile ./data.json)).${flavour};
yarnOfflineCache = (callPackage ./yarnPkgs.nix {}).offline_cache;
version = data.version;
sources = {
gitlab = fetchFromGitLab {
owner = data.owner;
repo = data.repo;
rev = data.rev;
sha256 = data.repo_hash;
};
gitlabDeb = fetchurl {
url = data.deb_url;
sha256 = data.deb_hash;
};
assets = stdenv.mkDerivation {
pname = "gitlab-assets";
inherit version src;
nativeBuildInputs = [ rubyEnv.wrappedRuby rubyEnv.bundler nodejs yarn ];
configurePhase = ''
runHook preConfigure
# Some rake tasks try to run yarn automatically, which won't work
rm lib/tasks/yarn.rake
# The rake tasks won't run without a basic configuration in place
mv config/database.yml.env config/database.yml
mv config/gitlab.yml.example config/gitlab.yml
# Yarn and bundler wants a real home directory to write cache, config, etc to
export HOME=$NIX_BUILD_TOP/fake_home
# Make yarn install packages from our offline cache, not the registry
yarn config --offline set yarn-offline-mirror ${yarnOfflineCache}
# Fixup "resolved"-entries in yarn.lock to match our offline cache
${yarn2nix-moretea.fixup_yarn_lock}/bin/fixup_yarn_lock yarn.lock
yarn install --offline --frozen-lockfile --ignore-scripts --no-progress --non-interactive
patchShebangs node_modules/
runHook postConfigure
'';
buildPhase = ''
runHook preBuild
bundle exec rake gettext:po_to_json RAILS_ENV=production NODE_ENV=production
bundle exec rake rake:assets:precompile RAILS_ENV=production NODE_ENV=production
bundle exec rake webpack:compile RAILS_ENV=production NODE_ENV=production NODE_OPTIONS="--max_old_space_size=4096"
bundle exec rake gitlab:assets:fix_urls RAILS_ENV=production NODE_ENV=production
runHook postBuild
'';
installPhase = ''
runHook preInstall
mv public/assets $out
runHook postInstall
'';
};
in
stdenv.mkDerivation {
name = "gitlab${if gitlabEnterprise then "-ee" else ""}-${version}";
src = sources.gitlab;
inherit src;
buildInputs = [
rubyEnv rubyEnv.wrappedRuby rubyEnv.bundler tzdata git nettools
@@ -59,7 +107,7 @@ stdenv.mkDerivation {
# For reasons I don't understand "bundle exec" ignores the
# RAILS_ENV causing tests to be executed that fail because we're
# not installing development and test gems above. Deleting the
# tests works though.:
# tests works though.
rm lib/tasks/test.rake
rm config/initializers/gitlab_shell_secret_token.rb
@@ -69,27 +117,15 @@ stdenv.mkDerivation {
'';
buildPhase = ''
mv config/gitlab.yml.example config/gitlab.yml
# Building this requires yarn, node &c, so we just get it from the deb
ar p ${sources.gitlabDeb} data.tar.gz | gunzip > gitlab-deb-data.tar
# Work around unpacking deb containing binary with suid bit
tar -f gitlab-deb-data.tar --delete ./opt/gitlab/embedded/bin/ksu
tar -xf gitlab-deb-data.tar
rm gitlab-deb-data.tar
mv -v opt/gitlab/embedded/service/gitlab-rails/public/assets public
rm -rf opt # only directory in data.tar.gz
mv config/gitlab.yml config/gitlab.yml.example
rm -f config/secrets.yml
mv config config.dist
rm -r tmp
'';
installPhase = ''
rm -r tmp
mkdir -p $out/share
cp -r . $out/share/gitlab
ln -sf ${assets} $out/share/gitlab/public/assets
rm -rf $out/share/gitlab/log
ln -sf /run/gitlab/log $out/share/gitlab/log
ln -sf /run/gitlab/uploads $out/share/gitlab/public/uploads