summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Wittig <max.wittig@siemens.com>2020-10-12 21:52:33 +0200
committerGitHub <noreply@github.com>2020-10-12 21:52:33 +0200
commit3a38c6d78ceaed1116ebbdd8e5cded60c99c6f95 (patch)
treee5285dece164fe826412e93c7e1f5753ad6890e9
parentbc178898776d2d61477ff773248217adfac81f56 (diff)
parentf4e79501f1be1394873042dd65beda49e869afb8 (diff)
downloadgitlab-3a38c6d78ceaed1116ebbdd8e5cded60c99c6f95.tar.gz
Merge pull request #1202 from python-gitlab/fix/cli-binary-data
fix(cli): write binary data to stdout buffer
-rw-r--r--docs/cli-usage.rst6
-rw-r--r--gitlab/v4/cli.py8
-rw-r--r--tools/functional/cli/test_cli_artifacts.py52
-rw-r--r--tools/functional/conftest.py30
-rw-r--r--tools/functional/fixtures/docker-compose.yml17
5 files changed, 107 insertions, 6 deletions
diff --git a/docs/cli-usage.rst b/docs/cli-usage.rst
index 10fd73a..d66d738 100644
--- a/docs/cli-usage.rst
+++ b/docs/cli-usage.rst
@@ -313,6 +313,12 @@ Define the status of a commit (as would be done from a CI tool for example):
--target-url http://server/build/123 \
--description "Jenkins build succeeded"
+Download the artifacts zip archive of a job:
+
+.. code-block:: console
+
+ $ gitlab project-job artifacts --id 10 --project-id 1 > artifacts.zip
+
Use sudo to act as another user (admin only):
.. code-block:: console
diff --git a/gitlab/v4/cli.py b/gitlab/v4/cli.py
index 51416f1..6172f93 100644
--- a/gitlab/v4/cli.py
+++ b/gitlab/v4/cli.py
@@ -85,11 +85,7 @@ class GitlabCLI(object):
try:
project = self.gl.projects.get(int(self.args["project_id"]), lazy=True)
data = project.exports.get().download()
- if hasattr(sys.stdout, "buffer"):
- # python3
- sys.stdout.buffer.write(data)
- else:
- sys.stdout.write(data)
+ sys.stdout.buffer.write(data)
except Exception as e:
cli.die("Impossible to download the export", e)
@@ -440,5 +436,7 @@ def run(gl, what, action, args, verbose, output, fields):
printer.display(get_dict(data, fields), verbose=verbose, obj=data)
elif isinstance(data, str):
print(data)
+ elif isinstance(data, bytes):
+ sys.stdout.buffer.write(data)
elif hasattr(data, "decode"):
print(data.decode())
diff --git a/tools/functional/cli/test_cli_artifacts.py b/tools/functional/cli/test_cli_artifacts.py
new file mode 100644
index 0000000..27d5d74
--- /dev/null
+++ b/tools/functional/cli/test_cli_artifacts.py
@@ -0,0 +1,52 @@
+import subprocess
+import sys
+import textwrap
+import time
+from io import BytesIO
+from zipfile import is_zipfile
+
+import pytest
+
+
+content = textwrap.dedent(
+ """\
+ test-artifact:
+ script: echo "test" > artifact.txt
+ artifacts:
+ untracked: true
+ """
+)
+data = {
+ "file_path": ".gitlab-ci.yml",
+ "branch": "master",
+ "content": content,
+ "commit_message": "Initial commit",
+}
+
+
+@pytest.mark.skipif(sys.version_info < (3, 8), reason="I am the walrus")
+def test_cli_artifacts(capsysbinary, gitlab_config, gitlab_runner, project):
+ project.files.create(data)
+
+ while not (jobs := project.jobs.list(scope="success")):
+ time.sleep(0.5)
+
+ job = project.jobs.get(jobs[0].id)
+ cmd = [
+ "gitlab",
+ "--config-file",
+ gitlab_config,
+ "project-job",
+ "artifacts",
+ "--id",
+ str(job.id),
+ "--project-id",
+ str(project.id),
+ ]
+
+ with capsysbinary.disabled():
+ artifacts = subprocess.check_output(cmd)
+ assert isinstance(artifacts, bytes)
+
+ artifacts_zip = BytesIO(artifacts)
+ assert is_zipfile(artifacts_zip)
diff --git a/tools/functional/conftest.py b/tools/functional/conftest.py
index 0cca3e3..675dba9 100644
--- a/tools/functional/conftest.py
+++ b/tools/functional/conftest.py
@@ -132,6 +132,36 @@ def gl(gitlab_config):
return instance
+@pytest.fixture(scope="session")
+def gitlab_runner(gl):
+ container = "gitlab-runner-test"
+ runner_name = "python-gitlab-runner"
+ token = "registration-token"
+ url = "http://gitlab"
+
+ docker_exec = ["docker", "exec", container, "gitlab-runner"]
+ register = [
+ "register",
+ "--run-untagged",
+ "--non-interactive",
+ "--registration-token",
+ token,
+ "--name",
+ runner_name,
+ "--url",
+ url,
+ "--clone-url",
+ url,
+ "--executor",
+ "shell",
+ ]
+ unregister = ["unregister", "--name", runner_name]
+
+ yield check_output(docker_exec + register).decode()
+
+ check_output(docker_exec + unregister).decode()
+
+
@pytest.fixture(scope="module")
def group(gl):
"""Group fixture for group API resource tests."""
diff --git a/tools/functional/fixtures/docker-compose.yml b/tools/functional/fixtures/docker-compose.yml
index 687eeaa..a0794d6 100644
--- a/tools/functional/fixtures/docker-compose.yml
+++ b/tools/functional/fixtures/docker-compose.yml
@@ -1,4 +1,9 @@
version: '3'
+
+networks:
+ gitlab-network:
+ name: gitlab-network
+
services:
gitlab:
image: '${GITLAB_IMAGE}:${GITLAB_TAG}'
@@ -9,7 +14,7 @@ services:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.test'
gitlab_rails['initial_root_password'] = '5iveL!fe'
- gitlab_rails['initial_shared_runners_registration_token'] = 'sTPNtWLEuSrHzoHP8oCU'
+ gitlab_rails['initial_shared_runners_registration_token'] = 'registration-token'
registry['enable'] = false
nginx['redirect_http_to_https'] = false
nginx['listen_port'] = 80
@@ -29,3 +34,13 @@ services:
ports:
- '8080:80'
- '2222:22'
+ networks:
+ - gitlab-network
+
+ gitlab-runner:
+ image: gitlab/gitlab-runner:latest
+ container_name: 'gitlab-runner-test'
+ depends_on:
+ - gitlab
+ networks:
+ - gitlab-network