From 3f6fc9a9660f686cae549eeb2d6f96ad56be564c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Veyret?= <stephane@neptura.org>
Date: Tue, 12 May 2020 13:50:36 +0200
Subject: [PATCH] Publish links to the release binaries

Closes #1411
---
 .gitlab/releaser/releaselinks.py | 28 ++++++++++++++++++++++++++++
 .gitlab/releaser/releaser.py     |  9 ++++++++-
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 .gitlab/releaser/releaselinks.py

diff --git a/.gitlab/releaser/releaselinks.py b/.gitlab/releaser/releaselinks.py
new file mode 100644
index 000000000..72800697e
--- /dev/null
+++ b/.gitlab/releaser/releaselinks.py
@@ -0,0 +1,28 @@
+import json
+import os
+import urllib.request
+
+from projectapi import ProjectApi
+
+class ReleaseLinks(ProjectApi):
+    '''
+    Release links API.
+    '''
+    def __init__(self):
+        ProjectApi.__init__(self, '/releases/{}/assets/links'.format(os.environ['CI_COMMIT_TAG']))
+
+    def create_artifact(self, artifact):
+        '''
+        Create the link for the given artifact.
+        :param artifact: The artifact data.
+        :type artifact: dict
+        '''
+        send_data = {
+            'name': '{} {} - {}'.format(artifact['category'], artifact['arch'], artifact['type']),
+            'filepath': '/binaries/{}'.format(artifact['name']),
+            'url': artifact['url']
+        }
+        send_data_serialized = json.dumps(send_data).encode('utf-8')
+        request = self.build_request(data=send_data_serialized, method='POST')
+        request.add_header('Content-Type', 'application/json')
+        urllib.request.urlopen(request)
diff --git a/.gitlab/releaser/releaser.py b/.gitlab/releaser/releaser.py
index dca044561..34fb1e197 100644
--- a/.gitlab/releaser/releaser.py
+++ b/.gitlab/releaser/releaser.py
@@ -6,6 +6,7 @@ import os
 from binartifact import BinArtifact
 from job import Job
 from placeholder import PlaceHolder
+from releaselinks import ReleaseLinks
 from releasenote import ReleaseNote
 from releasewikipage import ReleaseWikiPage
 from sourceartifact import SourceArtifact
@@ -48,9 +49,11 @@ class Releaser:
         releaseNote = ReleaseNote()
         current_message = releaseNote.get_message()
         artifacts_list = []
+        binArtifacts = self._get_bin_artifacts()
+        releaseLinks = ReleaseLinks()
 
         # Get releases
-        artifacts_list += self._get_bin_artifacts()
+        artifacts_list += binArtifacts
         artifacts_list.sort()
         artifacts_list += list(map(lambda e: SourceArtifact(e), self.source_ext))
 
@@ -65,6 +68,10 @@ class Releaser:
         })
         releaseNote.send_note(title_line + note)
 
+        # Publish binaries as links
+        for binArtifact in binArtifacts:
+            releaseLinks.create_artifact(binArtifact.to_dict())
+
         print('Pre-release published')
 
     def publish_release(self):
-- 
GitLab