Since I moved to orgmode I have been trying to make this work with most of my environnment. Since I work with gitlab on a daily basis I thought I would start there first.
Libraries
Org Parse
- Git Repo: https://github.com/karlicoss/orgparse
- Docs : https://orgparse.readthedocs.io/
Org Format
Convert stuff : pypandoc
Python for Gitlab
- Git Repo : https://github.com/python-gitlab/python-gitlab
- Doc : https://python-gitlab.readthedocs.io/en/stable/
Command Line framework
- Git: https://github.com/pallets/click/
- Doc: https://click.palletsprojects.com/
- quick tutorial : video
Others
Gitlab Token : Docs
Scope - what are we building
Let’s automate most of the work that is redudant with gitlab.
-
Users
- Create, update, delete, list
- Add to specific project
- Affect task
- Onboard
-
Create issues based an org file.
But more specifically 2 things are a priority right now :
- onboard users
- publish issues from a project file
Onboarding
The way I have implemented onboarding is simply to create have an onboard project (actually 2, one for internal onboarding, and one for contractor onboarding), where users get added and affected an “Welcome” issue describing for them the onboarding process.
So a first crude version of our onboarding function will look like this :
-
identify is user is internal or external (to define which onboarding process they belong too)
-
then add the user (user was created first) to the onboarding project ( I have hard coded the project id - yeah, it’s bad, we’ll fix that later )
-
then create an issue (turn out you need to create and assign the issue, else the user does not get the email properly)
-
then make the issue confidential
So it give something like that.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
def onboard_user(username, external, template_file): """onboard users""" project_id = 34 # TODO: move to a config file if external: project_id = 24 user = add_user_to_project(username, project_id) issue_content = org.issue_from_template('onboarding',template_file) issue = create_and_assign_project_issue(project_id, issue_content, username) issue.confidential = True issue.save() print("Onboarded user", username) return user
But before we can onboard anyone we need to create the users and authorize with the API
For now, it’s happening from the command line.
Next step will be to migrate that interactive command line and mostly to be managed from an org file, where I can add user, save them as contacts, and batch update the creation and onboarding of anyone.
But let’s see for now the creation of a users :
1 2 3 4 5 6 7
def create_user(name, username, email, password): """create user""" user = gl.users.create({'name':name, 'username':username, 'email': email, 'password': password}) print("Created user:", user.username)
Not too hard.
It will notify the user of its creation and we are good.
That’s it for now.
-
What’s next?
It took me a while to gather all the info to get started, but once you’re there it’s pretty straightforward.
So the next step, for an other post, will be how to dispatch a new issue from org mode