Merge branch 'airavata-3230'
diff --git a/dev-tools/ansible/django.yml b/dev-tools/ansible/django.yml
index cdd26ae..0d90bfa 100644
--- a/dev-tools/ansible/django.yml
+++ b/dev-tools/ansible/django.yml
@@ -35,6 +35,8 @@
       when: inventory_hostname == groups['django_' +  ansible_hostname][0]
     - role: letsencrypt
       when: inventory_hostname == groups['django_' +  ansible_hostname][0]
+    - role: django_setup
+      when: inventory_hostname == groups['django_' +  ansible_hostname][0]
 
 # Create a django virtual host
 - hosts: django
diff --git a/dev-tools/ansible/roles/django/tasks/main.yml b/dev-tools/ansible/roles/django/tasks/main.yml
index 5c8f6d2..37ded3e 100644
--- a/dev-tools/ansible/roles/django/tasks/main.yml
+++ b/dev-tools/ansible/roles/django/tasks/main.yml
@@ -77,25 +77,35 @@
 #   when: not docker_result.can_talk_to_docker
 #   run_once: true
 
-- name: build Docker image for building the JS
+- name: build airavata-django-portal Docker image
   local_action:
     module: docker_image
-    path: "{{ airavata_django_portal_tempdir.path }}/scripts/docker-build/"
-    name: airavata-django-build
+    path: "{{ airavata_django_portal_tempdir.path }}/"
+    name: airavata-django-portal
     force: true
     # source: build
   run_once: true
 
-- name: build Django JS code in Docker container
+- name: create Docker container so we can copy built files out of it
   local_action:
     module: docker_container
-    name: ansible-airavata-django-build
-    image: airavata-django-build
-    cleanup: true
-    detach: false
+    # Don't need to start the container, just create it
+    state: present
+    name: ansible-airavata-django-portal
+    image: airavata-django-portal
     volumes:
-    - "{{ airavata_django_portal_tempdir.path }}:/code"
-    - "{{ lookup('env', 'HOME') }}/.npm:/root/.npm"
+      - "{{ airavata_django_portal_tempdir.path }}/django_airavata/settings_local.py.sample:/code/django_airavata/settings_local.py"
+  run_once: true
+
+- name: copy built JS files from Docker container
+  local_action: command docker cp ansible-airavata-django-portal:/code/. {{ airavata_django_portal_tempdir.path }}
+  run_once: true
+
+- name: remove Docker container
+  local_action:
+    module: docker_container
+    state: absent
+    name: ansible-airavata-django-portal
   run_once: true
 
 - name: rsync build Django code to {{ airavata_django_checkout }}
@@ -240,3 +250,10 @@
   become: yes
   notify:
     - restart uwsgi
+
+- name: remove Django portal clone temp directory
+  local_action:
+    module: file
+    state: absent
+    path: "{{ airavata_django_portal_tempdir.path }}"
+  run_once: true
diff --git a/dev-tools/ansible/roles/django_setup/tasks/main.yml b/dev-tools/ansible/roles/django_setup/tasks/main.yml
index 297e568..a689d29 100644
--- a/dev-tools/ansible/roles/django_setup/tasks/main.yml
+++ b/dev-tools/ansible/roles/django_setup/tasks/main.yml
@@ -49,5 +49,15 @@
 # sudo curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
 # sudo yum install nodejs
 
-# TODO: disable package-lock.json creation for the pga user
-# npm config set package-lock false
+# Install yarn
+- name: Add yarn yum repository on CentOS
+  get_url:
+    url: "https://dl.yarnpkg.com/rpm/yarn.repo"
+    dest: "/etc/yum.repos.d/yarn.repo"
+  become: yes
+  when: ansible_distribution == 'CentOS'
+
+- name: Install yarn (RedHat)
+  yum: name=yarn state=latest update_cache=yes
+  become: yes
+  when: ansible_os_family == "RedHat"