As I mentioned in the earlier post, I was recently working on a private project. We had to fetch a single GitHub file from a private Github repository without hardcoding the token or setting it as an environment variable. I could not easily find a ready solution. So prepared one.
I am posting the solution here so that you can make use of it if you ever come across such scenarios.
Step one:
Initially I had to find a way to fetch and store Github token in a secure place. So, AWS SSM came to rescue.
Navigate to Github -> Login -> Settings -> Developer settings -> Personal access tokens -> Generate new token -> Give it a Name -> repo access -> Generate Token -> Copy
Navigate AWS Systems Manager -> Parameter Store -> Create new parameter -> Give it a name (SSM_PARAMETER_NAME)
Step two:
Create a helper class to fetch the SSM Parameter
import json
import boto3
class Parameters:
params = None
def __init__(self):
self.get_all_params()
@classmethod
def get_all_params(cls):
if cls.params is None:
cls.params = cls.get_params_from_ssm()
return cls.params
@staticmethod
def get_params_from_ssm():
ssm_param = 'SSM_PARAMETER_NAME'
parameters = boto3.client('ssm').get_parameter(
Name=ssm_param,
WithDecryption=True
)
return json.loads(parameters['Parameter']['Value'])
@classmethod
def get_param(cls, param):
if cls.params is None:
cls.params = cls.get_params_from_ssm()
return Parameters.params[param]
Step three:
Define a function to fetch the file from Github
import requests
from helpers.parameters import Parameters
def fetch_github_file(repo, branch, path):
"""
Fetch raw file from Private GitHub repo, branch and path.
:param repo: (str) Repository name
:param branch: (str) Repository branch name
:param path: (str) File path
:return: (str) File content
"""
org = 'YOUR_ORG_NAME'
token = Parameters.get_param('github')['token']
headers = {'Authorization': 'token {}'.format(token)}
url = 'https://raw.githubusercontent.com/{org}/{repo}/{branch}/{path}'.format(
org=org,
repo=repo,
branch=branch,
path=path
)
res = requests.get(url, headers=headers)
return res.text
Step four:
Fetch the file using the below function call
file_content = fetch_github_file('REPO_NAME', 'BRANCH', 'FILE_PATH')