proxygen
docker_builder.DockerFBCodeBuilder Class Reference
Inheritance diagram for docker_builder.DockerFBCodeBuilder:
fbcode_builder.FBCodeBuilder fbcode_builder.FBCodeBuilder fbcode_builder.FBCodeBuilder fbcode_builder.FBCodeBuilder

Public Member Functions

def setup (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def comment (self, comment)
 
def copy_local_repo (self, repo_dir, dest_name)
 
def debian_ccache_setup_steps (self)
 
def setup (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def comment (self, comment)
 
def copy_local_repo (self, repo_dir, dest_name)
 
def debian_ccache_setup_steps (self)
 
def setup (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def comment (self, comment)
 
def copy_local_repo (self, repo_dir, dest_name)
 
def debian_ccache_setup_steps (self)
 
def setup (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def comment (self, comment)
 
def copy_local_repo (self, repo_dir, dest_name)
 
def debian_ccache_setup_steps (self)
 
- Public Member Functions inherited from fbcode_builder.FBCodeBuilder
def __init__ (self, kwargs)
 
def __repr__ (self)
 
def option (self, name, default=None)
 
def has_option (self, name)
 
def add_option (self, name, value)
 
def render (self, steps)
 
def build (self, steps)
 
def setup (self)
 
def diagnostics (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def copy_local_repo (self, dir, dest_name)
 
def debian_deps (self)
 
def install_debian_deps (self)
 
def debian_ccache_setup_steps (self)
 
def github_project_workdir (self, project, path)
 
def fb_github_project_workdir (self, project_and_path, github_org='facebook')
 
def parallel_make (self, make_vars=None)
 
def make_and_install (self, make_vars=None)
 
def configure (self, name=None)
 
def autoconf_install (self, name)
 
def cmake_configure (self, name, cmake_path='..')
 
def cmake_install (self, name, cmake_path='..')
 
def fb_github_autoconf_install (self, project_and_path, github_org='facebook')
 
def fb_github_cmake_install (self, project_and_path, cmake_path='..', github_org='facebook')
 
def __init__ (self, kwargs)
 
def __repr__ (self)
 
def option (self, name, default=None)
 
def has_option (self, name)
 
def add_option (self, name, value)
 
def render (self, steps)
 
def build (self, steps)
 
def setup (self)
 
def diagnostics (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def copy_local_repo (self, dir, dest_name)
 
def debian_deps (self)
 
def install_debian_deps (self)
 
def debian_ccache_setup_steps (self)
 
def github_project_workdir (self, project, path)
 
def fb_github_project_workdir (self, project_and_path, github_org='facebook')
 
def parallel_make (self, make_vars=None)
 
def make_and_install (self, make_vars=None)
 
def configure (self, name=None)
 
def autoconf_install (self, name)
 
def cmake_configure (self, name, cmake_path='..')
 
def cmake_install (self, name, cmake_path='..')
 
def fb_github_autoconf_install (self, project_and_path, github_org='facebook')
 
def fb_github_cmake_install (self, project_and_path, cmake_path='..', github_org='facebook')
 
def __init__ (self, kwargs)
 
def __repr__ (self)
 
def option (self, name, default=None)
 
def has_option (self, name)
 
def add_option (self, name, value)
 
def render (self, steps)
 
def build (self, steps)
 
def setup (self)
 
def diagnostics (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def copy_local_repo (self, dir, dest_name)
 
def debian_deps (self)
 
def install_debian_deps (self)
 
def debian_ccache_setup_steps (self)
 
def github_project_workdir (self, project, path)
 
def fb_github_project_workdir (self, project_and_path, github_org='facebook')
 
def parallel_make (self, make_vars=None)
 
def make_and_install (self, make_vars=None)
 
def configure (self, name=None)
 
def autoconf_install (self, name)
 
def cmake_configure (self, name, cmake_path='..')
 
def cmake_install (self, name, cmake_path='..')
 
def fb_github_autoconf_install (self, project_and_path, github_org='facebook')
 
def fb_github_cmake_install (self, project_and_path, cmake_path='..', github_org='facebook')
 
def __init__ (self, kwargs)
 
def __repr__ (self)
 
def option (self, name, default=None)
 
def has_option (self, name)
 
def add_option (self, name, value)
 
def render (self, steps)
 
def build (self, steps)
 
def setup (self)
 
def diagnostics (self)
 
def step (self, name, actions)
 
def run (self, shell_cmd)
 
def workdir (self, dir)
 
def copy_local_repo (self, dir, dest_name)
 
def debian_deps (self)
 
def install_debian_deps (self)
 
def debian_ccache_setup_steps (self)
 
def github_project_workdir (self, project, path)
 
def fb_github_project_workdir (self, project_and_path, github_org='facebook')
 
def parallel_make (self, make_vars=None)
 
def make_and_install (self, make_vars=None)
 
def configure (self, name=None)
 
def autoconf_install (self, name)
 
def cmake_configure (self, name, cmake_path='..')
 
def cmake_install (self, name, cmake_path='..')
 
def fb_github_autoconf_install (self, project_and_path, github_org='facebook')
 
def fb_github_cmake_install (self, project_and_path, cmake_path='..', github_org='facebook')
 

Private Member Functions

def _user (self)
 
def _change_user (self)
 
def _render_impl (self, steps)
 
def _user (self)
 
def _change_user (self)
 
def _render_impl (self, steps)
 
def _user (self)
 
def _change_user (self)
 
def _render_impl (self, steps)
 
def _user (self)
 
def _change_user (self)
 
def _render_impl (self, steps)
 

Additional Inherited Members

- Public Attributes inherited from fbcode_builder.FBCodeBuilder
 options_used
 

Detailed Description

Definition at line 31 of file docker_builder.py.

Member Function Documentation

def docker_builder.DockerFBCodeBuilder._change_user (   self)
private
def docker_builder.DockerFBCodeBuilder._change_user (   self)
private

Definition at line 36 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), and folly.format().

36  def _change_user(self):
37  return ShellQuoted('USER {u}').format(u=self._user())
38 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder._change_user (   self)
private

Definition at line 36 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), and folly.format().

36  def _change_user(self):
37  return ShellQuoted('USER {u}').format(u=self._user())
38 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder._change_user (   self)
private

Definition at line 36 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), and folly.format().

36  def _change_user(self):
37  return ShellQuoted('USER {u}').format(u=self._user())
38 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder._render_impl (   self,
  steps 
)
private
def docker_builder.DockerFBCodeBuilder._render_impl (   self,
  steps 
)
private
def docker_builder.DockerFBCodeBuilder._render_impl (   self,
  steps 
)
private
def docker_builder.DockerFBCodeBuilder._render_impl (   self,
  steps 
)
private
def docker_builder.DockerFBCodeBuilder._user (   self)
private
def docker_builder.DockerFBCodeBuilder._user (   self)
private

Definition at line 33 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._user(), and fbcode_builder.FBCodeBuilder.option().

33  def _user(self):
34  return self.option('user', 'root')
35 
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder._user (   self)
private

Definition at line 33 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._user(), and fbcode_builder.FBCodeBuilder.option().

33  def _user(self):
34  return self.option('user', 'root')
35 
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder._user (   self)
private

Definition at line 33 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._user(), and fbcode_builder.FBCodeBuilder.option().

33  def _user(self):
34  return self.option('user', 'root')
35 
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.comment (   self,
  comment 
)

Definition at line 74 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder.comment(), and shell_quoting.shell_comment().

Referenced by fbcode_builder.FBCodeBuilder.diagnostics().

74  def comment(self, comment):
75  # This should not be a command since we don't want comment changes
76  # to invalidate the Docker build cache.
77  return shell_comment(comment)
78 
def shell_comment(c)
def docker_builder.DockerFBCodeBuilder.comment (   self,
  comment 
)

Definition at line 74 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder.comment(), and shell_quoting.shell_comment().

Referenced by fbcode_builder.FBCodeBuilder.diagnostics().

74  def comment(self, comment):
75  # This should not be a command since we don't want comment changes
76  # to invalidate the Docker build cache.
77  return shell_comment(comment)
78 
def shell_comment(c)
def docker_builder.DockerFBCodeBuilder.comment (   self,
  comment 
)

Definition at line 74 of file docker_builder.py.

References shell_quoting.shell_comment().

Referenced by docker_builder.DockerFBCodeBuilder.comment(), and fbcode_builder.FBCodeBuilder.diagnostics().

74  def comment(self, comment):
75  # This should not be a command since we don't want comment changes
76  # to invalidate the Docker build cache.
77  return shell_comment(comment)
78 
def shell_comment(c)
def docker_builder.DockerFBCodeBuilder.comment (   self,
  comment 
)

Definition at line 74 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder.comment(), and shell_quoting.shell_comment().

Referenced by fbcode_builder.FBCodeBuilder.diagnostics().

74  def comment(self, comment):
75  # This should not be a command since we don't want comment changes
76  # to invalidate the Docker build cache.
77  return shell_comment(comment)
78 
def shell_comment(c)
def docker_builder.DockerFBCodeBuilder.copy_local_repo (   self,
  repo_dir,
  dest_name 
)

Definition at line 79 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), docker_builder.DockerFBCodeBuilder.copy_local_repo(), folly.format(), fbcode_builder.FBCodeBuilder.option(), and utils.run_command().

79  def copy_local_repo(self, repo_dir, dest_name):
80  fd, archive_path = tempfile.mkstemp(
81  prefix='local_repo_{0}_'.format(dest_name),
82  suffix='.tgz',
83  dir=os.path.abspath(self.option('docker_context_dir')),
84  )
85  os.close(fd)
86  run_command('tar', 'czf', archive_path, '.', cwd=repo_dir)
87  return [
88  ShellQuoted('ADD {archive} {dest_name}').format(
89  archive=os.path.basename(archive_path), dest_name=dest_name
90  ),
91  # Docker permissions make very little sense... see also workdir()
92  ShellQuoted('USER root'),
93  ShellQuoted('RUN chown -R {u} {d}').format(
94  d=dest_name, u=self._user()
95  ),
96  self._change_user(),
97  ]
98 
def run_command(cmd, kwargs)
Definition: utils.py:26
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def copy_local_repo(self, repo_dir, dest_name)
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.copy_local_repo (   self,
  repo_dir,
  dest_name 
)

Definition at line 79 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), folly.format(), fbcode_builder.FBCodeBuilder.option(), and utils.run_command().

Referenced by docker_builder.DockerFBCodeBuilder.copy_local_repo(), and fbcode_builder.FBCodeBuilder.github_project_workdir().

79  def copy_local_repo(self, repo_dir, dest_name):
80  fd, archive_path = tempfile.mkstemp(
81  prefix='local_repo_{0}_'.format(dest_name),
82  suffix='.tgz',
83  dir=os.path.abspath(self.option('docker_context_dir')),
84  )
85  os.close(fd)
86  run_command('tar', 'czf', archive_path, '.', cwd=repo_dir)
87  return [
88  ShellQuoted('ADD {archive} {dest_name}').format(
89  archive=os.path.basename(archive_path), dest_name=dest_name
90  ),
91  # Docker permissions make very little sense... see also workdir()
92  ShellQuoted('USER root'),
93  ShellQuoted('RUN chown -R {u} {d}').format(
94  d=dest_name, u=self._user()
95  ),
96  self._change_user(),
97  ]
98 
def run_command(cmd, kwargs)
Definition: utils.py:26
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def copy_local_repo(self, repo_dir, dest_name)
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.copy_local_repo (   self,
  repo_dir,
  dest_name 
)

Definition at line 79 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), docker_builder.DockerFBCodeBuilder.copy_local_repo(), folly.format(), fbcode_builder.FBCodeBuilder.option(), and utils.run_command().

79  def copy_local_repo(self, repo_dir, dest_name):
80  fd, archive_path = tempfile.mkstemp(
81  prefix='local_repo_{0}_'.format(dest_name),
82  suffix='.tgz',
83  dir=os.path.abspath(self.option('docker_context_dir')),
84  )
85  os.close(fd)
86  run_command('tar', 'czf', archive_path, '.', cwd=repo_dir)
87  return [
88  ShellQuoted('ADD {archive} {dest_name}').format(
89  archive=os.path.basename(archive_path), dest_name=dest_name
90  ),
91  # Docker permissions make very little sense... see also workdir()
92  ShellQuoted('USER root'),
93  ShellQuoted('RUN chown -R {u} {d}').format(
94  d=dest_name, u=self._user()
95  ),
96  self._change_user(),
97  ]
98 
def run_command(cmd, kwargs)
Definition: utils.py:26
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def copy_local_repo(self, repo_dir, dest_name)
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.copy_local_repo (   self,
  repo_dir,
  dest_name 
)

Definition at line 79 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), docker_builder.DockerFBCodeBuilder.copy_local_repo(), folly.format(), fbcode_builder.FBCodeBuilder.option(), and utils.run_command().

79  def copy_local_repo(self, repo_dir, dest_name):
80  fd, archive_path = tempfile.mkstemp(
81  prefix='local_repo_{0}_'.format(dest_name),
82  suffix='.tgz',
83  dir=os.path.abspath(self.option('docker_context_dir')),
84  )
85  os.close(fd)
86  run_command('tar', 'czf', archive_path, '.', cwd=repo_dir)
87  return [
88  ShellQuoted('ADD {archive} {dest_name}').format(
89  archive=os.path.basename(archive_path), dest_name=dest_name
90  ),
91  # Docker permissions make very little sense... see also workdir()
92  ShellQuoted('USER root'),
93  ShellQuoted('RUN chown -R {u} {d}').format(
94  d=dest_name, u=self._user()
95  ),
96  self._change_user(),
97  ]
98 
def run_command(cmd, kwargs)
Definition: utils.py:26
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def copy_local_repo(self, repo_dir, dest_name)
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps (   self)

Definition at line 102 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps(), folly.format(), fbcode_builder.FBCodeBuilder.option(), and docker_builder.DockerFBCodeBuilder.run().

103  source_ccache_tgz = self.option('ccache_tgz', '')
104  if not source_ccache_tgz:
105  logging.info('Docker ccache not enabled')
106  return []
107 
108  dest_ccache_tgz = os.path.join(
109  self.option('docker_context_dir'), 'ccache.tgz'
110  )
111 
112  try:
113  try:
114  os.link(source_ccache_tgz, dest_ccache_tgz)
115  except OSError:
116  logging.exception(
117  'Hard-linking {s} to {d} failed, falling back to copy'
118  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
119  )
120  shutil.copyfile(source_ccache_tgz, dest_ccache_tgz)
121  except Exception:
122  logging.exception(
123  'Failed to copy or link {s} to {d}, aborting'
124  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
125  )
126  raise
127 
128  return [
129  # Separate layer so that in development we avoid re-downloads.
130  self.run(ShellQuoted('apt-get install -yq ccache')),
131  ShellQuoted('ADD ccache.tgz /'),
132  ShellQuoted(
133  # Set CCACHE_DIR before the `ccache` invocations below.
134  'ENV CCACHE_DIR=/ccache '
135  # No clang support for now, so it's easiest to hardcode gcc.
136  'CC="ccache gcc" CXX="ccache g++" '
137  # Always log for ease of debugging. For real FB projects,
138  # this log is several megabytes, so dumping it to stdout
139  # would likely exceed the Travis log limit of 4MB.
140  #
141  # On a local machine, `docker cp` will get you the data. To
142  # get the data out from Travis, I would compress and dump
143  # uuencoded bytes to the log -- for Bistro this was about
144  # 600kb or 8000 lines:
145  #
146  # apt-get install sharutils
147  # bzip2 -9 < /tmp/ccache.log | uuencode -m ccache.log.bz2
148  'CCACHE_LOGFILE=/tmp/ccache.log'
149  ),
150  self.run(ShellQuoted(
151  # Future: Skipping this part made this Docker step instant,
152  # saving ~1min of build time. It's unclear if it is the
153  # chown or the du, but probably the chown -- since a large
154  # part of the cost is incurred at image save time.
155  #
156  # ccache.tgz may be empty, or may have the wrong
157  # permissions.
158  'mkdir -p /ccache && time chown -R nobody /ccache && '
159  'time du -sh /ccache && '
160  # Reset stats so `docker_build_with_ccache.sh` can print
161  # useful values at the end of the run.
162  'echo === Prev run stats === && ccache -s && ccache -z && '
163  # Record the current time to let travis_build.sh figure out
164  # the number of bytes in the cache that are actually used --
165  # this is crucial for tuning the maximum cache size.
166  'date +%s > /FBCODE_BUILDER_CCACHE_START_TIME && '
167  # The build running as `nobody` should be able to write here
168  'chown nobody /tmp/ccache.log'
169  )),
170  ]
171 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps (   self)

Definition at line 102 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps(), folly.format(), fbcode_builder.FBCodeBuilder.option(), and docker_builder.DockerFBCodeBuilder.run().

103  source_ccache_tgz = self.option('ccache_tgz', '')
104  if not source_ccache_tgz:
105  logging.info('Docker ccache not enabled')
106  return []
107 
108  dest_ccache_tgz = os.path.join(
109  self.option('docker_context_dir'), 'ccache.tgz'
110  )
111 
112  try:
113  try:
114  os.link(source_ccache_tgz, dest_ccache_tgz)
115  except OSError:
116  logging.exception(
117  'Hard-linking {s} to {d} failed, falling back to copy'
118  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
119  )
120  shutil.copyfile(source_ccache_tgz, dest_ccache_tgz)
121  except Exception:
122  logging.exception(
123  'Failed to copy or link {s} to {d}, aborting'
124  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
125  )
126  raise
127 
128  return [
129  # Separate layer so that in development we avoid re-downloads.
130  self.run(ShellQuoted('apt-get install -yq ccache')),
131  ShellQuoted('ADD ccache.tgz /'),
132  ShellQuoted(
133  # Set CCACHE_DIR before the `ccache` invocations below.
134  'ENV CCACHE_DIR=/ccache '
135  # No clang support for now, so it's easiest to hardcode gcc.
136  'CC="ccache gcc" CXX="ccache g++" '
137  # Always log for ease of debugging. For real FB projects,
138  # this log is several megabytes, so dumping it to stdout
139  # would likely exceed the Travis log limit of 4MB.
140  #
141  # On a local machine, `docker cp` will get you the data. To
142  # get the data out from Travis, I would compress and dump
143  # uuencoded bytes to the log -- for Bistro this was about
144  # 600kb or 8000 lines:
145  #
146  # apt-get install sharutils
147  # bzip2 -9 < /tmp/ccache.log | uuencode -m ccache.log.bz2
148  'CCACHE_LOGFILE=/tmp/ccache.log'
149  ),
150  self.run(ShellQuoted(
151  # Future: Skipping this part made this Docker step instant,
152  # saving ~1min of build time. It's unclear if it is the
153  # chown or the du, but probably the chown -- since a large
154  # part of the cost is incurred at image save time.
155  #
156  # ccache.tgz may be empty, or may have the wrong
157  # permissions.
158  'mkdir -p /ccache && time chown -R nobody /ccache && '
159  'time du -sh /ccache && '
160  # Reset stats so `docker_build_with_ccache.sh` can print
161  # useful values at the end of the run.
162  'echo === Prev run stats === && ccache -s && ccache -z && '
163  # Record the current time to let travis_build.sh figure out
164  # the number of bytes in the cache that are actually used --
165  # this is crucial for tuning the maximum cache size.
166  'date +%s > /FBCODE_BUILDER_CCACHE_START_TIME && '
167  # The build running as `nobody` should be able to write here
168  'chown nobody /tmp/ccache.log'
169  )),
170  ]
171 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps (   self)

Definition at line 102 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps(), folly.format(), fbcode_builder.FBCodeBuilder.option(), and docker_builder.DockerFBCodeBuilder.run().

103  source_ccache_tgz = self.option('ccache_tgz', '')
104  if not source_ccache_tgz:
105  logging.info('Docker ccache not enabled')
106  return []
107 
108  dest_ccache_tgz = os.path.join(
109  self.option('docker_context_dir'), 'ccache.tgz'
110  )
111 
112  try:
113  try:
114  os.link(source_ccache_tgz, dest_ccache_tgz)
115  except OSError:
116  logging.exception(
117  'Hard-linking {s} to {d} failed, falling back to copy'
118  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
119  )
120  shutil.copyfile(source_ccache_tgz, dest_ccache_tgz)
121  except Exception:
122  logging.exception(
123  'Failed to copy or link {s} to {d}, aborting'
124  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
125  )
126  raise
127 
128  return [
129  # Separate layer so that in development we avoid re-downloads.
130  self.run(ShellQuoted('apt-get install -yq ccache')),
131  ShellQuoted('ADD ccache.tgz /'),
132  ShellQuoted(
133  # Set CCACHE_DIR before the `ccache` invocations below.
134  'ENV CCACHE_DIR=/ccache '
135  # No clang support for now, so it's easiest to hardcode gcc.
136  'CC="ccache gcc" CXX="ccache g++" '
137  # Always log for ease of debugging. For real FB projects,
138  # this log is several megabytes, so dumping it to stdout
139  # would likely exceed the Travis log limit of 4MB.
140  #
141  # On a local machine, `docker cp` will get you the data. To
142  # get the data out from Travis, I would compress and dump
143  # uuencoded bytes to the log -- for Bistro this was about
144  # 600kb or 8000 lines:
145  #
146  # apt-get install sharutils
147  # bzip2 -9 < /tmp/ccache.log | uuencode -m ccache.log.bz2
148  'CCACHE_LOGFILE=/tmp/ccache.log'
149  ),
150  self.run(ShellQuoted(
151  # Future: Skipping this part made this Docker step instant,
152  # saving ~1min of build time. It's unclear if it is the
153  # chown or the du, but probably the chown -- since a large
154  # part of the cost is incurred at image save time.
155  #
156  # ccache.tgz may be empty, or may have the wrong
157  # permissions.
158  'mkdir -p /ccache && time chown -R nobody /ccache && '
159  'time du -sh /ccache && '
160  # Reset stats so `docker_build_with_ccache.sh` can print
161  # useful values at the end of the run.
162  'echo === Prev run stats === && ccache -s && ccache -z && '
163  # Record the current time to let travis_build.sh figure out
164  # the number of bytes in the cache that are actually used --
165  # this is crucial for tuning the maximum cache size.
166  'date +%s > /FBCODE_BUILDER_CCACHE_START_TIME && '
167  # The build running as `nobody` should be able to write here
168  'chown nobody /tmp/ccache.log'
169  )),
170  ]
171 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps (   self)

Definition at line 102 of file docker_builder.py.

References folly.format(), fbcode_builder.FBCodeBuilder.option(), and docker_builder.DockerFBCodeBuilder.run().

Referenced by docker_builder.DockerFBCodeBuilder.debian_ccache_setup_steps(), and fbcode_builder.FBCodeBuilder.install_debian_deps().

103  source_ccache_tgz = self.option('ccache_tgz', '')
104  if not source_ccache_tgz:
105  logging.info('Docker ccache not enabled')
106  return []
107 
108  dest_ccache_tgz = os.path.join(
109  self.option('docker_context_dir'), 'ccache.tgz'
110  )
111 
112  try:
113  try:
114  os.link(source_ccache_tgz, dest_ccache_tgz)
115  except OSError:
116  logging.exception(
117  'Hard-linking {s} to {d} failed, falling back to copy'
118  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
119  )
120  shutil.copyfile(source_ccache_tgz, dest_ccache_tgz)
121  except Exception:
122  logging.exception(
123  'Failed to copy or link {s} to {d}, aborting'
124  .format(s=source_ccache_tgz, d=dest_ccache_tgz)
125  )
126  raise
127 
128  return [
129  # Separate layer so that in development we avoid re-downloads.
130  self.run(ShellQuoted('apt-get install -yq ccache')),
131  ShellQuoted('ADD ccache.tgz /'),
132  ShellQuoted(
133  # Set CCACHE_DIR before the `ccache` invocations below.
134  'ENV CCACHE_DIR=/ccache '
135  # No clang support for now, so it's easiest to hardcode gcc.
136  'CC="ccache gcc" CXX="ccache g++" '
137  # Always log for ease of debugging. For real FB projects,
138  # this log is several megabytes, so dumping it to stdout
139  # would likely exceed the Travis log limit of 4MB.
140  #
141  # On a local machine, `docker cp` will get you the data. To
142  # get the data out from Travis, I would compress and dump
143  # uuencoded bytes to the log -- for Bistro this was about
144  # 600kb or 8000 lines:
145  #
146  # apt-get install sharutils
147  # bzip2 -9 < /tmp/ccache.log | uuencode -m ccache.log.bz2
148  'CCACHE_LOGFILE=/tmp/ccache.log'
149  ),
150  self.run(ShellQuoted(
151  # Future: Skipping this part made this Docker step instant,
152  # saving ~1min of build time. It's unclear if it is the
153  # chown or the du, but probably the chown -- since a large
154  # part of the cost is incurred at image save time.
155  #
156  # ccache.tgz may be empty, or may have the wrong
157  # permissions.
158  'mkdir -p /ccache && time chown -R nobody /ccache && '
159  'time du -sh /ccache && '
160  # Reset stats so `docker_build_with_ccache.sh` can print
161  # useful values at the end of the run.
162  'echo === Prev run stats === && ccache -s && ccache -z && '
163  # Record the current time to let travis_build.sh figure out
164  # the number of bytes in the cache that are actually used --
165  # this is crucial for tuning the maximum cache size.
166  'date +%s > /FBCODE_BUILDER_CCACHE_START_TIME && '
167  # The build running as `nobody` should be able to write here
168  'chown nobody /tmp/ccache.log'
169  )),
170  ]
171 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.run (   self,
  shell_cmd 
)

Definition at line 57 of file docker_builder.py.

References folly.format(), and docker_builder.DockerFBCodeBuilder.run().

57  def run(self, shell_cmd):
58  return ShellQuoted('RUN {cmd}').format(cmd=shell_cmd)
59 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.run (   self,
  shell_cmd 
)

Definition at line 57 of file docker_builder.py.

References folly.format(), and docker_builder.DockerFBCodeBuilder.run().

57  def run(self, shell_cmd):
58  return ShellQuoted('RUN {cmd}').format(cmd=shell_cmd)
59 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.run (   self,
  shell_cmd 
)

Definition at line 57 of file docker_builder.py.

References folly.format(), and docker_builder.DockerFBCodeBuilder.run().

57  def run(self, shell_cmd):
58  return ShellQuoted('RUN {cmd}').format(cmd=shell_cmd)
59 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.setup (   self)

Definition at line 39 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), folly.format(), fbcode_builder.FBCodeBuilder.install_debian_deps(), fbcode_builder.FBCodeBuilder.option(), docker_builder.DockerFBCodeBuilder.setup(), and docker_builder.DockerFBCodeBuilder.step().

39  def setup(self):
40  # Please add RPM-based OSes here as appropriate.
41  #
42  # To allow exercising non-root installs -- we change users after the
43  # system packages are installed. TODO: For users not defined in the
44  # image, we should probably `useradd`.
45  return self.step('Setup', [
46  # Docker's FROM does not understand shell quoting.
47  ShellQuoted('FROM {}'.format(self.option('os_image'))),
48  # /bin/sh syntax is a pain
49  ShellQuoted('SHELL ["/bin/bash", "-c"]'),
50  ] + self.install_debian_deps() + [self._change_user()])
51 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.setup (   self)

Definition at line 39 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), folly.format(), fbcode_builder.FBCodeBuilder.install_debian_deps(), fbcode_builder.FBCodeBuilder.option(), docker_builder.DockerFBCodeBuilder.setup(), and docker_builder.DockerFBCodeBuilder.step().

39  def setup(self):
40  # Please add RPM-based OSes here as appropriate.
41  #
42  # To allow exercising non-root installs -- we change users after the
43  # system packages are installed. TODO: For users not defined in the
44  # image, we should probably `useradd`.
45  return self.step('Setup', [
46  # Docker's FROM does not understand shell quoting.
47  ShellQuoted('FROM {}'.format(self.option('os_image'))),
48  # /bin/sh syntax is a pain
49  ShellQuoted('SHELL ["/bin/bash", "-c"]'),
50  ] + self.install_debian_deps() + [self._change_user()])
51 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.setup (   self)

Definition at line 39 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), folly.format(), fbcode_builder.FBCodeBuilder.install_debian_deps(), fbcode_builder.FBCodeBuilder.option(), and docker_builder.DockerFBCodeBuilder.step().

Referenced by fbcode_builder.FBCodeBuilder.build(), and docker_builder.DockerFBCodeBuilder.setup().

39  def setup(self):
40  # Please add RPM-based OSes here as appropriate.
41  #
42  # To allow exercising non-root installs -- we change users after the
43  # system packages are installed. TODO: For users not defined in the
44  # image, we should probably `useradd`.
45  return self.step('Setup', [
46  # Docker's FROM does not understand shell quoting.
47  ShellQuoted('FROM {}'.format(self.option('os_image'))),
48  # /bin/sh syntax is a pain
49  ShellQuoted('SHELL ["/bin/bash", "-c"]'),
50  ] + self.install_debian_deps() + [self._change_user()])
51 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.setup (   self)

Definition at line 39 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), folly.format(), fbcode_builder.FBCodeBuilder.install_debian_deps(), fbcode_builder.FBCodeBuilder.option(), docker_builder.DockerFBCodeBuilder.setup(), and docker_builder.DockerFBCodeBuilder.step().

39  def setup(self):
40  # Please add RPM-based OSes here as appropriate.
41  #
42  # To allow exercising non-root installs -- we change users after the
43  # system packages are installed. TODO: For users not defined in the
44  # image, we should probably `useradd`.
45  return self.step('Setup', [
46  # Docker's FROM does not understand shell quoting.
47  ShellQuoted('FROM {}'.format(self.option('os_image'))),
48  # /bin/sh syntax is a pain
49  ShellQuoted('SHELL ["/bin/bash", "-c"]'),
50  ] + self.install_debian_deps() + [self._change_user()])
51 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def option(self, name, default=None)
def docker_builder.DockerFBCodeBuilder.step (   self,
  name,
  actions 
)

Definition at line 52 of file docker_builder.py.

References folly.format(), and docker_builder.DockerFBCodeBuilder.step().

52  def step(self, name, actions):
53  assert '\n' not in name, 'Name {0} would span > 1 line'.format(name)
54  b = ShellQuoted('')
55  return [ShellQuoted('### {0} ###'.format(name)), b] + actions + [b]
56 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.step (   self,
  name,
  actions 
)

Definition at line 52 of file docker_builder.py.

References folly.format(), and docker_builder.DockerFBCodeBuilder.step().

52  def step(self, name, actions):
53  assert '\n' not in name, 'Name {0} would span > 1 line'.format(name)
54  b = ShellQuoted('')
55  return [ShellQuoted('### {0} ###'.format(name)), b] + actions + [b]
56 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.step (   self,
  name,
  actions 
)

Definition at line 52 of file docker_builder.py.

References folly.format(), and docker_builder.DockerFBCodeBuilder.step().

52  def step(self, name, actions):
53  assert '\n' not in name, 'Name {0} would span > 1 line'.format(name)
54  b = ShellQuoted('')
55  return [ShellQuoted('### {0} ###'.format(name)), b] + actions + [b]
56 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.step (   self,
  name,
  actions 
)

Definition at line 52 of file docker_builder.py.

References folly.format().

Referenced by fbcode_builder.FBCodeBuilder.autoconf_install(), fbcode_builder.FBCodeBuilder.cmake_install(), fbcode_builder.FBCodeBuilder.diagnostics(), fbcode_builder.FBCodeBuilder.github_project_workdir(), fbcode_builder.FBCodeBuilder.install_debian_deps(), docker_builder.DockerFBCodeBuilder.setup(), and docker_builder.DockerFBCodeBuilder.step().

52  def step(self, name, actions):
53  assert '\n' not in name, 'Name {0} would span > 1 line'.format(name)
54  b = ShellQuoted('')
55  return [ShellQuoted('### {0} ###'.format(name)), b] + actions + [b]
56 
def step(self, name, actions)
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.workdir (   self,
  dir 
)

Definition at line 60 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), and folly.format().

Referenced by fbcode_builder.FBCodeBuilder.github_project_workdir(), and docker_builder.DockerFBCodeBuilder.workdir().

60  def workdir(self, dir):
61  return [
62  # As late as Docker 1.12.5, this results in `build` being owned
63  # by root:root -- the explicit `mkdir` works around the bug:
64  # USER nobody
65  # WORKDIR build
66  ShellQuoted('USER root'),
67  ShellQuoted('RUN mkdir -p {d} && chown {u} {d}').format(
68  d=dir, u=self._user()
69  ),
70  self._change_user(),
71  ShellQuoted('WORKDIR {dir}').format(dir=dir),
72  ]
73 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.workdir (   self,
  dir 
)

Definition at line 60 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), folly.format(), and docker_builder.DockerFBCodeBuilder.workdir().

60  def workdir(self, dir):
61  return [
62  # As late as Docker 1.12.5, this results in `build` being owned
63  # by root:root -- the explicit `mkdir` works around the bug:
64  # USER nobody
65  # WORKDIR build
66  ShellQuoted('USER root'),
67  ShellQuoted('RUN mkdir -p {d} && chown {u} {d}').format(
68  d=dir, u=self._user()
69  ),
70  self._change_user(),
71  ShellQuoted('WORKDIR {dir}').format(dir=dir),
72  ]
73 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.workdir (   self,
  dir 
)

Definition at line 60 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), folly.format(), and docker_builder.DockerFBCodeBuilder.workdir().

60  def workdir(self, dir):
61  return [
62  # As late as Docker 1.12.5, this results in `build` being owned
63  # by root:root -- the explicit `mkdir` works around the bug:
64  # USER nobody
65  # WORKDIR build
66  ShellQuoted('USER root'),
67  ShellQuoted('RUN mkdir -p {d} && chown {u} {d}').format(
68  d=dir, u=self._user()
69  ),
70  self._change_user(),
71  ShellQuoted('WORKDIR {dir}').format(dir=dir),
72  ]
73 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271
def docker_builder.DockerFBCodeBuilder.workdir (   self,
  dir 
)

Definition at line 60 of file docker_builder.py.

References docker_builder.DockerFBCodeBuilder._change_user(), docker_builder.DockerFBCodeBuilder._user(), folly.format(), and docker_builder.DockerFBCodeBuilder.workdir().

60  def workdir(self, dir):
61  return [
62  # As late as Docker 1.12.5, this results in `build` being owned
63  # by root:root -- the explicit `mkdir` works around the bug:
64  # USER nobody
65  # WORKDIR build
66  ShellQuoted('USER root'),
67  ShellQuoted('RUN mkdir -p {d} && chown {u} {d}').format(
68  d=dir, u=self._user()
69  ),
70  self._change_user(),
71  ShellQuoted('WORKDIR {dir}').format(dir=dir),
72  ]
73 
Formatter< false, Args... > format(StringPiece fmt, Args &&...args)
Definition: Format.h:271

The documentation for this class was generated from the following file: