You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by gi...@apache.org on 2020/12/29 13:23:34 UTC

[buildstream] 01/03: Add initial `bst push` command

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch bst-push
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 94560778e68f399655a7417559e0a18077a7ac57
Author: Sam Thursfield <sa...@codethink.co.uk>
AuthorDate: Thu Jul 13 16:43:46 2017 +0000

    Add initial `bst push` command
    
    This is mainly useful for testing artifact caches and such. Most users
    will hopefully be able to make use of artifact caches populated by
    automated build machines, but right now it's unlikely that most people
    will be pushing artifacts around.
---
 buildstream/_frontend/main.py | 31 +++++++++++++++++++++++++++++++
 buildstream/_pipeline.py      | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/buildstream/_frontend/main.py b/buildstream/_frontend/main.py
index 79adf11..aaf625e 100644
--- a/buildstream/_frontend/main.py
+++ b/buildstream/_frontend/main.py
@@ -209,6 +209,37 @@ def track(app, target, variant, deps, except_):
 
 
 ##################################################################
+#                           Push Command                         #
+##################################################################
+@cli.command(short_help="Push a built artifact")
+@click.option('--variant',
+              help='A variant of the specified target')
+@click.option('--deps', '-d', default='none',
+              type=click.Choice(['none', 'all']),
+              help='The dependencies to fetch (default: plan)')
+@click.argument('target')
+@click.pass_obj
+def push(app, target, variant, deps):
+    """Push a built artifact to the configured remote artifact cache.
+
+    Specify `--deps` to control which artifacts to push:
+
+    \b
+        none:  No dependencies, just the element itself
+        all:   All dependencies
+    """
+    app.initialize(target, variant)
+    try:
+        to_push = app.pipeline.deps_elements(deps)
+        app.pipeline.push(app.scheduler, to_push)
+        click.echo("")
+    except _BstError as e:
+        click.echo("")
+        click.echo("ERROR: {}".format(e))
+        sys.exit(-1)
+
+
+##################################################################
 #                           Show Command                         #
 ##################################################################
 @cli.command(short_help="Show elements in the pipeline")
diff --git a/buildstream/_pipeline.py b/buildstream/_pipeline.py
index 64ce4d6..dc71afa 100644
--- a/buildstream/_pipeline.py
+++ b/buildstream/_pipeline.py
@@ -630,6 +630,43 @@ class Pipeline():
 
         self.open_workspace(scheduler, workspace_dir, source_index, no_checkout,
                             track, False)
+    # push()
+    #
+    # Pushes elements in the pipeline
+    #
+    # Args:
+    #    scheduler (Scheduler): The scheduler to run this pipeline on
+    #    elements (list): List of elements to push
+    #
+    def push(self, scheduler, elements):
+
+        if not self.artifacts.can_push():
+            self.message(self.target, MessageType.FAIL, "Not configured for pushing artifacts")
+
+        plan = elements
+        self.assert_consistent(plan)
+        self.session_elements = len(plan)
+
+        push = PushQueue()
+        push.enqueue(plan)
+        queues = [push]
+
+        self.message(self.target, MessageType.START, "Pushing {} artifacts".format(len(plan)))
+        elapsed, status = scheduler.run(queues)
+        pushed = len(push.processed_elements)
+
+        if status == SchedStatus.ERROR:
+            self.message(self.target, MessageType.FAIL, "Push failed", elapsed=elapsed)
+            raise PipelineError()
+        elif status == SchedStatus.TERMINATED:
+            self.message(self.target, MessageType.WARN,
+                         "Terminated after pushing {} elements".format(pushed),
+                         elapsed=elapsed)
+            raise PipelineError()
+        else:
+            self.message(self.target, MessageType.SUCCESS,
+                         "Pushed {} complete".format(pushed),
+                         elapsed=elapsed)
 
     # remove_elements():
     #