diff --git a/lib/publish.js b/lib/publish.js index d2384766..d7d80042 100644 --- a/lib/publish.js +++ b/lib/publish.js @@ -1,8 +1,9 @@ +const {promisify} = require('util'); +const stream = require('stream'); const {createReadStream} = require('fs'); -const {resolve} = require('path'); +const {resolve, basename} = require('path'); const {stat} = require('fs-extra'); const {isPlainObject} = require('lodash'); -const FormData = require('form-data'); const urlJoin = require('url-join'); const got = require('got'); const debug = require('debug')('semantic-release:gitlab'); @@ -57,26 +58,29 @@ module.exports = async (pluginConfig, context) => { debug('file filepath: %o', filepath); // Uploaded assets to the project - const form = new FormData(); - form.append('file', createReadStream(file)); - - const uploadEndpoint = urlJoin(gitlabApiUrl, `/projects/${encodedRepoId}/uploads`); + const encodedFileName = encodeURIComponent(basename(path)); + const uploadEndpoint = urlJoin( + gitlabApiUrl, + `/projects/${encodedRepoId}/packages/generic/${encodedFileName}/${encodedGitTag}/${encodedFileName}?select=package_file` + ); debug('POST-ing the file %s to %s', file, uploadEndpoint); let response; + const pipe = promisify(stream.pipeline); try { - response = await got.post(uploadEndpoint, {...apiOptions, body: form}).json(); + const uploadStream = got.stream.put(uploadEndpoint, {...apiOptions}); + await pipe(createReadStream(file), uploadStream, new stream.PassThrough()); } catch (error) { logger.error('An error occurred while uploading %s to the GitLab project uploads API:\n%O', file, error); throw error; } - const {url, alt} = response; + const file_name = encodedFileName - assetsList.push({label, alt, url, type, filepath}); + assetsList.push({label, file_name, uploadEndpoint, type, filepath}); - logger.log('Uploaded file: %s', url); + logger.log('Uploaded file: %s', uploadEndpoint); }) ); } @@ -91,10 +95,10 @@ module.exports = async (pluginConfig, context) => { description: notes && notes.trim() ? notes : gitTag, milestones, assets: { - links: assetsList.map(({label, alt, url, type, filepath}) => { + links: assetsList.map(({label, file_name, uploadEndpoint, type, filepath}) => { return { - name: label || alt, - url: urlJoin(gitlabUrl, repoId, url), + name: label || file_name, + url: uploadEndpoint, link_type: type, filepath, };