Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add pr body as release notes #6

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
69 changes: 35 additions & 34 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,35 +1,36 @@
android:
components:
- build-tools-28.0.3
- android-28
- extra-google-google_play_services
- extra-google-m2repository
- extra-android-m2repository
- sys-img-x86-android-26
- sys-img-armeabi-v7a-android-17
android:
components:
- build-tools-28.0.3
- android-28
- extra-google-google_play_services
- extra-google-m2repository
- extra-android-m2repository
- sys-img-x86-android-26
- sys-img-armeabi-v7a-android-17
language: android
notifications:
slack: "argila:bXGzFxqVuwbq5AC2pbP4J2yq"
script:
- "./gradlew build"
- echo $TRAVIS_COMMIT_MESSAGE
- log=$(git log $TRAVIS_COMMIT_RANGE --oneline)
- echo $'**Change log:**<br/>'${log//$'\n'/<br/>}
before_deploy:
- "git fetch --tags"
- "echo $TRAVIS_COMMIT_MESSAGE"
- "log=$(git log $TRAVIS_COMMIT_RANGE --oneline)"
- "export TAG=$'v'$TRAVIS_COMMIT_MESSAGE"
- "export BODY=$'**Change log:**<br/>'${log//$'\\n'/<br/>}"
deploy:
- provider: releases
api_key:
secure: TZVw75NsfqF9MYBzyBvV1Inx1EXQWZcBuyQzczLXueuZprIHlXo9jJ6gdxO5GaJC5KABbQiXP1fcDieS/CEvYEVfjqy4191gdcBhQ54/cGyF/qJX4e52FwU+5ufqSegv3MY1tmACwlEFFbRXwZ9aR/uaPa9hMGTC0QsxdNpAf4m5HHkp3HGoA24m+Dj1uoH5woNhNQPIC33KS1QkYxTWYm+RzjHzkF7E4hLETVECfX2/vhL8KMLUi+b8aRzHunDOXzi09BMR3SnODHYb8pjrVwOxazDMHMKyWzKdt19CSnV94+SqRuti+NYqrBaWb3YYR+I3PLHkNgdhJUhh4ucAzE/qhMnlwIjKsOYki6BNl4j2KMPzJsmo8IkdIoq5VQY9naAx83gMa7VUqWae6lSvHeNyTLyt3/GnDcnu3j00l0LqV/O8IwyHln4BFNOyd794NeiocrIvDNJPYNg9n5BsiEOaaleS7slF8x/KoJVoi4+ymuxrISGfylLUwfsh5T8b/HnR2VNMuryHrb5xOMmongvEORySfl/gpNHihW060IdgmwdI7WYKKI2nXpKLgxWSUppVOP7JxeRUw7TIHHbQ95gXZmg9Qvckf4wITmk1fJd2wV6pO4xK82Jqh42BC5Uc+DWFl90hpZAm6tHv6BE0O4tY7ZzdBxiwP30cCQrZYa4=
body: $BODY
file: sample/build/outputs/apk/debug/sample-debug.apk
skip_cleanup: true
on:
tags: true
repo: Andati/BriskPesa


notifications:
slack: argila:bXGzFxqVuwbq5AC2pbP4J2yq
script:
- "./gradlew build"
- log=`python scripts/cicd.py $GITHUB_API_KEY $TRAVIS_REPO_SLUG`
- echo ${log//$'\n'/<br/>}
- python --version
before_deploy:
- export BODY=${log//$'\n'/<br/>}
deploy:
- provider: releases
api_key:
secure: TZVw75NsfqF9MYBzyBvV1Inx1EXQWZcBuyQzczLXueuZprIHlXo9jJ6gdxO5GaJC5KABbQiXP1fcDieS/CEvYEVfjqy4191gdcBhQ54/cGyF/qJX4e52FwU+5ufqSegv3MY1tmACwlEFFbRXwZ9aR/uaPa9hMGTC0QsxdNpAf4m5HHkp3HGoA24m+Dj1uoH5woNhNQPIC33KS1QkYxTWYm+RzjHzkF7E4hLETVECfX2/vhL8KMLUi+b8aRzHunDOXzi09BMR3SnODHYb8pjrVwOxazDMHMKyWzKdt19CSnV94+SqRuti+NYqrBaWb3YYR+I3PLHkNgdhJUhh4ucAzE/qhMnlwIjKsOYki6BNl4j2KMPzJsmo8IkdIoq5VQY9naAx83gMa7VUqWae6lSvHeNyTLyt3/GnDcnu3j00l0LqV/O8IwyHln4BFNOyd794NeiocrIvDNJPYNg9n5BsiEOaaleS7slF8x/KoJVoi4+ymuxrISGfylLUwfsh5T8b/HnR2VNMuryHrb5xOMmongvEORySfl/gpNHihW060IdgmwdI7WYKKI2nXpKLgxWSUppVOP7JxeRUw7TIHHbQ95gXZmg9Qvckf4wITmk1fJd2wV6pO4xK82Jqh42BC5Uc+DWFl90hpZAm6tHv6BE0O4tY7ZzdBxiwP30cCQrZYa4=
release_notes: "$BODY"
file: sample/build/outputs/apk/debug/sample-debug.apk
skip_cleanup: true
on:
tags: true
repo: Andati/BriskPesa
after_deploy:
- python scripts/confluence.py $ATLASSIAN_EMAIL $ATLASSIAN_TOKEN $GITHUB_API_KEY $TRAVIS_REPO_SLUG
env:
global:
- secure: 1s70r8zZNAsAHI7fctsEdBTWAAvmiDtvK2tThC+2RBxEJnKZqSFzDkLC1LvM1tX8ufN/dD0y6oBdKhOkxlFaiVci/ow+sUZbTx4PBP1/NsleMwk+muK732MQBiMFz4a7Tcwc6tY8OZYovBrPlcbEuZ/UJroinxMJucUOiPUTMmZbvK6XKBOm+8+jH4zIQjhOskJCE81SoZxaQwVpZ0Dur61nPxevLPlrw27Dz6pGON/leTegWa1LhTbD5Yn4t/tcHCxqgn5SEXjgUt+I4EK4+4WkKhn3hACtLo8q2N5BC8+fXdAoR2EbrCxyX4/zcfDpqwtzvkAzdv4Stfy7miCo29bWGDdufvFXxP/oNHS08HYU1Qkg8F2o3egAMvEbA397QSqC2WjFtgJ06UA/DC6JB5nC/slokaoGKllLq8YJfFP5979a6l8rHmk7uFwRNdSx9NqN0lqIu8ByqqmHhG3ju7Z4HSpxUxWdeK7rV4G04545Xp+u5oJc7MWM8wBTHG/8FaQgrE0/+qw3m8zbsmAT7zhJl0qbug4mF7MPx+om8ViFRH/mlneyOScKnioQt3vfWsxy4oheICxAH6a3LHB9R6RWaKn8VzrWuL5wKIYGk/zttX41fZ+YAIS4DUEQ04DG3FL2l0ztr20a4bYdcdXaZ+QxKSYDaW63oylB9Z957K0=
- secure: S2K63SyyYxAZZR5W1EiX8Sv5FcNjJwzOlIyOcOY2LGx1TR8IYj7aD0zV9PUcS0PLePJYTeQdRXhftx+C34Or1a66VFnVNUQSLEazDkQXIYG9agd727YIdOghq6othttNFGB9PQUgyE6AZ81jmUNT064B3bFm/lXxK4bfV4sHdO6ZUO09jByYXIZbEyxvtwoM9vJaH4rrQPJeBwfVxpsH7QLVfsb3pgN9yj4uqhleeOHaHHvNQVevZdxG9K82lNxEQnp1lkYYJymlLcnKwNBsFArHNqwtKHkAhQ7pneclt+uojXp0qKHi4A2pnBJwHPVA483QopJQxTb/mwPQSCpW/R4tZmgfa1IUJF/Zcc/MjlXIWsF7hr8ZFw90h6j7Wa61gf8OnT/kYNPtmYo6/n0wWwN0ZEVdUmFBcyBF6LRn1tMKyIbjNK5O7fx4G1KqP3senfuyvPoTqmBwq/FDQELKIUD/lSeT1He8Wq0mepuEW5G3xKj98KPHUlZTYhFt8J1Tbl/b+Gea/93btY8iAB1Fvg1mbYW1rOEkPU9rfNjMeY/jNDeaZhxoNn9oI5sCzQ61FEugqZaodoEbpooTPniyhWRc+JJmadJaErk99u2f3zEVywfcPEcGbIawZ9g4nyxCMhosxXdRrBCvv6T/u010AKycgaNw7ghR0iwkpPUKV1Q=
- secure: b6tts5l57ga98XglOGSaKtq7+sMVannkMXI4qZwXQJzslRL1GJ8Qrm3gk/iYcyHNFqmuWM53g/GyFm3NASRNKz9YyXSEfY22Smka34+2aePKkzlNG9R+I0BzNiAqStC0FP29ry6Nbkumpi2TmYpK90g9YTx+DLgqCQY4zoujIPMeZO1Kvy5H9BZhSCiyi7ncjkfYJcZ0MbKUwYLPR07F0Ql9zKmcHNNKJtXAryw+POVqk3jc8Oopj50ZpNZwHRyXY8afRON4gqwOzEq/z9m3DdcZC7sFUt5lv2F/G/YR8nIeL9G5OV9WMfI0HJbUbi4RjNpn7p6528GlxXrL/gXIVzfu5Am3Bg/W3rmvQY6x9PrkTb3Tb8nWwcOHlOtmzHbpqFmh2AmILW7whvWVOTS6UCaoWpwylFnlD/r9uSajrUX+nVuKDhgFJ904tpFBQ5mc+d9IpRrbKTLIxdgpVCMsyxGutWH+znxDMvFNi9h0K3ji07vKA7/r9RcyKMQwVz5nixwMAA7z7D2KZ0SVa/tanVdtfer3YuTm9TpkzDjJInybSOSpM7oVtkoetTKOTVdjNrV6+QKqKXryMpl2IS1Z+weHcNkTC2kuZrf4iaWcvk2GM/uFAeGmFtgj812olP8uAakqiKhylVaFV8uI1lDb2BjYftngZpmc7fVOTo9t7g0=
57 changes: 57 additions & 0 deletions scripts/cicd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import requests
import sys
import json
from datetime import datetime, timedelta

GraphQL_URL = "https://api.github.com/graphql"
PERIOD = 150 #days

if len(sys.argv) < 3:
print("Usage: python %s GITHUB_API_KEY REPO_SLUG" % sys.argv[0])
exit(0)

GITHUB_API_KEY = sys.argv[1]
REPO_SLUG = sys.argv[2]
headers = {"Authorization": "Bearer " + GITHUB_API_KEY, "content-type": "application/json"}

date_since = (datetime.today() - timedelta(days=PERIOD)).strftime("%Y-%m-%d")

query = """
{
search(query: "repo:%s is:pr is:merged merged:>%s", type: ISSUE, last: 100) {
edges {
node {
... on PullRequest {
url
title
bodyText
createdAt
mergedAt
}
}
}
}
}
""" % (REPO_SLUG, date_since)

def cleanBodyText(body):
res = "";
for i in range(len(body)):
if(body[i]=='\n'):
if len(res)>1 and res[len(res)-1] != '\n':
res += body[i]
else:
res += body[i]
return res

response = requests.post(GraphQL_URL, data=json.dumps({'query':query}), headers=headers)
if response.status_code == 200:
json_response = response.json()
edges = json_response['data']['search']['edges']
if len(edges) == 0:
print "No PR found given the search params: " + REPO_SLUG
for edge in edges:
print cleanBodyText(edge['node']['bodyText'])
else:
print "Error code returned " + str(response.status_code)

145 changes: 145 additions & 0 deletions scripts/confluence.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
import json
import requests
import sys
from requests.auth import HTTPBasicAuth
from datetime import datetime

if len(sys.argv) < 5:
print("Usage: python %s ATLASSIAN_EMAIL ATLASSIAN_TOKEN GITHUB_API_KEY REPO_SLUG" % sys.argv[0])
exit(0)

BASE_URL = "https://smartregister.atlassian.net/wiki/rest/api/content"
GraphQL_URL = "https://api.github.com/graphql"
ATLASSIAN_EMAIL = sys.argv[1]
ATLASSIAN_TOKEN = sys.argv[2]
GITHUB_API_KEY = sys.argv[3]

REPO_SLUG = sys.argv[4]
(OWNER_NAME, REPO_NAME) = REPO_SLUG.split("/")

BASIC_AUTH = HTTPBasicAuth(ATLASSIAN_EMAIL, ATLASSIAN_TOKEN)

def get_page_json(page_id, expand = False):
if expand:
suffix = "?expand=" + expand
else:
suffix = ""

url=BASE_URL + "/" + page_id + suffix
response = requests.get(url, auth=BASIC_AUTH)
if response.status_code == 200:
json_body = json.loads(response.text)
return json_body
else:
print "Error code returned " + str(response.status_code)

def get_page_info(page_id):
url = '{base}/{page_id}'.format(
base = BASE_URL,
page_id = page_id)
response = requests.get(url, auth = BASIC_AUTH)
if response.status_code == 200:
return json.loads(response.text)
else:
print "Error code returned " + str(response.status_code)

def update_page(page_id, html):
info = get_page_info(page_id)
version = int(info['version']['number']) + 1

data = {
'id' : str(page_id),
'type' : 'page',
'title' : info['title'],
'version' : {'number' : version},
'body' : {
'storage' :
{
'representation' : 'storage',
'value' : str(html),
}
}
}

data = json.dumps(data)
url = '{base}/{page_id}'.format(base = BASE_URL, page_id = page_id)

response = requests.put(
url,
data = data,
headers = { 'Content-Type' : 'application/json' },
auth = BASIC_AUTH
)
if response.status_code == 200:
return json.loads(response.text)
else:
print "Error code returned " + str(response.status_code)

def insert_row_to_page(current_content, new_html):
# find last occurrence of </tbody>
body = current_content['body']['storage']['value']
k = body.rfind("</tbody>")
return body[:k] + new_html + body[k:]


def get_release_details():
headers = {"Authorization": "Bearer " + GITHUB_API_KEY, "content-type": "application/json"}
query = """
{
repository(owner: "%s", name: "%s") {
releases(last: 1) {
edges{
node{
tagName
publishedAt
description
releaseAssets(first: 1) {
nodes {
downloadUrl
}
}
}
}
}
}
}
""" % (OWNER_NAME, REPO_NAME)

response = requests.post(GraphQL_URL, data=json.dumps({'query':query}), headers=headers)
if response.status_code == 200:
json_response = response.json()
if json_response['data']['repository'] == None:
print "Exception encountered: " + response.text
return None
tag_name = json_response['data']['repository']['releases']['edges'][0]['node']['tagName']
published_at = json_response['data']['repository']['releases']['edges'][0]['node']['publishedAt']
description = json_response['data']['repository']['releases']['edges'][0]['node']['description']
download_url = json_response['data']['repository']['releases']['edges'][0]['node']['releaseAssets']['nodes'][0]['downloadUrl']
return {"published_at":published_at, "description":description, "download_url":download_url, "tag_name":tag_name}
else:
print "Error code returned " + str(response.status_code)

def suffix(day):
return 'th' if 11<=day<=13 else {1:'st',2:'nd',3:'rd'}.get(day%10, 'th')

def custom_strftime(format, t):
return t.strftime(format).replace('{S}', str(t.day) + suffix(t.day))

current_content = get_page_json("1245380625", "body.storage")
#print current_content

release_details = get_release_details()
if release_details == None:
exit(0)

published_at = datetime.strptime(release_details["published_at"], "%Y-%m-%dT%H:%M:%SZ")

if release_details["description"] == None:
release_details["description"] = ""

new_html = '<tr><td><p><a href="'+ release_details["download_url"] +'">'+ release_details["tag_name"] +'</a></p></td><td><p>'+ custom_strftime('%b {S}, %Y', published_at) +'</p></td><td><p>'+ release_details["description"] +'</p></td></tr>'
print new_html

res = update_page("1245380625", insert_row_to_page(current_content, new_html))
#print(res)