How to automate Open edX deployments using Github Actions
Tags: actionshackathon21, python, django, devops
Published: 2021-11-19 21:12:33


## Introduction
### What is Open edX® ?
Open edX is an open-source platform you can use to create and host online courses. It was originally developed in 2012 by MIT and Harvard University and has since been adopted by organizations of all shapes and sizes to power a wide range of online learning use cases.
It has been used by organizations and universities like Microsoft, IBM, MIT, and ASU.

### How do we handle deployments by default in Open edX ?
We use Ansible to provision and maintain our platform. If you are not familiar with Ansible, it's an open source Devops tool that automates the software provisioning and configuration. It building blocks are:
- Ansible **Playbooks** which has 1 or multiple roles. Imaging Playbook as full instructions on how to install your software, it's components and how the set them up to work properly.
- Ansible **Roles**. Each component in your stack has it's own role. for example if your are using Django, Nginx and MySQL in your application, each one of them has it's own role.
- **Variables**. Each role has it's own variables. For example you should provide variables for MySQL role to define root username and password.

### What is the workflow to change a variable ?
We have our playbooks, roles and their variables in a GitHub repo. Variables are divided to 2 different files [`vars.yml`](https://github.com/cubitetech/openedx-actions-demo/blob/main/edx-configs/vars.yml) and [`passwords.yml`](https://github.com/cubitetech/openedx-actions-demo/blob/main/edx-configs/passwords.yml). Passwords file is encrypted using Ansible Vault.
To change a variable and deploy it to the Open edX server we need to:
1- Pull the Github repo that has Open edX variables on a local machone
2- Change one or multiple variables
3- Push the changes back to the Github repo
4- Deploy new variables to the server from an Ansible Control node. Here we pass new `vars.yml` and `passwords.yml` to ansible-playbook command, Something like:

```bash
ansible-playbook /edx/app/edx_ansible/edx_ansible/playbooks/openedx_native.yml --vault-password-file ~/.ansible_vault_pass.txt -i ./ansible-configs/inventory -e@./edx-configs/vars.yml -e@./edx-configs/passwords.yml
```
![Default Deployment Workflow](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5qkokpd9eg5i18wwiv3s.png)

### My Workflow
#### How GitHub actions can help to automate manual deployments
**Problem**
Steps 3 and 4 are where things can get complicated. As you see in the previous diagram these steps are manual and it can become really time consuming and tedious if you need to make multiple deployments to the same server or even to a cluster of servers.
**Solution**
Ideal solution will be to trigger new deployment to our server or servers as as soon as we push a new change to the GitHub repo. GitHub actions can do that for us. We can create a workflow that
- Checks out our repo in a job
    - Using `actions/checkout@v2` action
- Install Ansible and all necessary libraries for a deployment
- Installs Open edX SSH key in it and adds it's key as known host
    - Using `shimataro/ssh-key-action@v2` action
- Deploys new variables using Ansible
- Restart all the services in Open edX to apply changes
![Github Actions Workflow](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9yt2ntutznwph957dy8n.png)

#### Let's See how it works 
One of the variables in the `vars.yml` file is [`EDXAPP_PLATFORM_NAME`](https://github.com/cubitetech/openedx-actions-demo/blob/main/edx-configs/vars.yml#L16) and we use it's value in template in multiple places like the footer.
![Footer](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3v6q91730jxch1qhnwo.png)
Now let's change it's value to `Cubite Technologies` and commit the change. It should trigger GitHub action to deploy this new value to our server via Ansible.
 
{% youtube bcDjaql30XM %}
 
### Submission Category: 

- Maintainer Must-Haves
- DIY Deployments


### Yaml File or Link to Code

{% github https://github.com/cubitetech/openedx-actions-demo %}


### Additional Resources / Info

To learn more about Open edX check [their website](https://open.edx.org)