blob: 332277ef8ba32ef52685df02d258f3693895ec04 [file] [log] [blame]
Eric Anderson4f4cedf2017-12-14 16:51:14 -08001#!/bin/bash
2# Copyright 2017, gRPC Authors All rights reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16set -e
17
18if [ $# -ne 2 ]; then
19 cat <<EOF
20Usage: $0 PROFILEID DIR
21 PROFILEID The Sonatype profile to use for staging repository
22 Obtain profile ID from https://oss.sonatype.org:
23 * Build Promotion > Staging Profiles
24 * Select profile based on name (e.g., 'io.grpc')
25 * Copy hex identifier from URL after "#stagingProfiles;"
26 DIR Directory to upload to Sonatype as a new staging repository
27
28~/.config/sonatype-upload: Configuration file for Sonatype username and password
29 USERNAME=yourusername
30 PASSWORD=yourpass
31
32Sonatype provides a "user token" that is a randomly generated username/password.
33It does allow access to your account, however. You can create one via:
34 * Log in to https://oss.sonatype.org
35 * Click your username at the top right and click to Profile
36 * Change the drop-down from "Summary" to "User Token"
37 * Click "Access User Token"
38EOF
39 exit 1
40fi
41
42PROFILE_ID="$1"
43DIR="$2"
44if [ -z "$DIR" ]; then
45 echo "Must specify non-empty directory name"
46 exit 1
47fi
48
49[ -f "$CONF" ] && . "$CONF"
50
51if [ -z "$USERNAME" -o -z "$PASSWORD" ]; then
52 # TODO(ejona86): if people would use it, could prompt for values to avoid
53 # having passwords in plain-text.
54 echo "You must create '$CONF' with keys USERNAME and PASSWORD" >&2
55 exit 1
56fi
57
58CONF="$HOME/.config/sonatype-upload"
59STAGING_URL="https://oss.sonatype.org/service/local/staging"
60
61# We go through the effort of using deloyByRepositoryId/ because it is
62# _substantially_ faster to upload files than deploy/maven2/. When using
63# deploy/maven2/ a repository is implicitly created, but the response doesn't
64# provide its name.
65
66USERPASS="$USERNAME:$PASSWORD"
67
68# https://oss.sonatype.org/nexus-staging-plugin/default/docs/index.html
69#
70# Example returned data:
71# <promoteResponse>
72# <data>
73# <stagedRepositoryId>iogrpc-1082</stagedRepositoryId>
74# <description>Release upload</description>
75# </data>
76# </promoteResponse>
77echo "Creating staging repo"
78REPOID="$(
79 XML="
80 <promoteRequest>
81 <data>
82 <description>Release upload</description>
83 </data>
84 </promoteRequest>"
85 curl -s -X POST -d "$XML" -u "$USERPASS" -H "Content-Type: application/xml" \
86 "$STAGING_URL/profiles/$PROFILE_ID/start" |
87 grep stagedRepositoryId |
88 sed 's/.*<stagedRepositoryId>\(.*\)<\/stagedRepositoryId>.*/\1/'
89 )"
90echo "Repository id: $REPOID"
91
92for X in $(cd "$DIR" && find -type f | cut -b 3-); do
93 echo "Uploading $X"
94 curl -T "$DIR/$X" -u "$USERPASS" -H "Content-Type: application/octet-stream" \
95 "$STAGING_URL/deployByRepositoryId/$REPOID/$X"
96done
97
98echo "Closing staging repo"
99XML="
100<promoteRequest>
101 <data>
102 <stagedRepositoryId>$REPOID</stagedRepositoryId>
103 <description>Auto-close via upload script</description>
104 </data>
105</promoteRequest>"
106curl -X POST -d "$XML" -u "$USERPASS" -H "Content-Type: application/xml" \
107 "$STAGING_URL/profiles/$PROFILE_ID/finish"