dev 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #!/bin/bash
  2. # devctl is an utility script for automating some development tasks and actions.
  3. # To find out what options are available, run it without any arguments.
  4. # Text styles
  5. RED='\033[0;31m'
  6. BOLD=$(tput bold)
  7. NORMAL=$(tput sgr0)
  8. # Docker aliases
  9. misago_run="docker-compose run --rm misago"
  10. # Define dev paths
  11. # Those are paths to dirs and files created for dev project
  12. dev_paths=(
  13. "./avatargallery"
  14. "./devproject"
  15. "./media"
  16. "./static"
  17. "./theme"
  18. "./userdata"
  19. "./cron.txt"
  20. "./manage.py"
  21. )
  22. # Required ports
  23. # Some tasks test for those ports before continuing
  24. port_django=8000
  25. port_postgresql=5432
  26. required_ports=($port_postgresql)
  27. # Default superuser
  28. username="Admin"
  29. password="password"
  30. # Some commond shorthands
  31. docker_stop() {
  32. docker-compose stop
  33. }
  34. docker_rebuild() {
  35. docker_stop
  36. docker-compose build --no-cache
  37. }
  38. docker_down() {
  39. docker_stop
  40. docker-compose down --remove-orphans
  41. }
  42. error() {
  43. echo -e "${RED}Error:${NORMAL} $1"
  44. }
  45. wait_for_db() {
  46. export PGPASSWORD=$POSTGRES_PASSWORD
  47. RETRIES=10
  48. until psql -h $POSTGRES_HOST -U $POSTGRES_USER -d $POSTGRES_DB -c "select 1" > /dev/null 2>&1 || [ $RETRIES -eq 0 ]; do
  49. echo "Waiting for postgres server, $((RETRIES--)) remaining attempts..."
  50. sleep 5
  51. done
  52. }
  53. # Commands
  54. intro() {
  55. echo
  56. echo
  57. echo "Development project:"
  58. echo
  59. echo " ${BOLD}init${NORMAL} initialize new dev project for development, do nothing if project already exists."
  60. echo " ${BOLD}clear${NORMAL} if dev project exists, delete it's files and destroy docker containers."
  61. echo " ${BOLD}rebuild${NORMAL} rebuild docker containers (uses --no-cache)."
  62. echo
  63. echo "Testing:"
  64. echo
  65. echo " ${BOLD}test${NORMAL} run tests suite."
  66. echo " ${BOLD}test module${NORMAL} run tests suite in specified python module, eg. misago.users."
  67. echo
  68. }
  69. invalid_option() {
  70. echo -e "Invalid option: ${RED}$1${NORMAL}"
  71. echo "Please run this script without any arguments to see the list of available options."
  72. exit 1
  73. }
  74. # Initialize new dev project
  75. init() {
  76. for dev_path in "${dev_paths[@]}"; do
  77. if [ -e $dev_path ]; then
  78. error "Dev project already exists, or was not deleted completely."
  79. echo
  80. echo "Please use \"clear\" option to clear any pissible remaining files and try again."
  81. exit 1
  82. fi
  83. done
  84. for port in "${required_ports[@]}"; do
  85. nc "127.0.0.1" "$port" < /dev/null
  86. if [[ $? = "0" ]]; then
  87. if [[ $port = $port_django ]]; then
  88. error "Django application appears to already be running on http://127.0.0.1:8000"
  89. elif [[ $port = $port_postgresql ]]; then
  90. error "PostgreSQL appears to already be running on port $port."
  91. fi
  92. exit 1
  93. fi
  94. done
  95. docker_rebuild
  96. docker-compose run --rm misago ./dev init_in_docker
  97. }
  98. # Initialization step that has to occur inside docker
  99. init_in_docker() {
  100. wait_for_db
  101. # initialize django project
  102. python misago/bin/misago-start-devproject.py
  103. # move items of interest up one level
  104. mv devproject/devproject devproject_tmp
  105. mv devproject/avatargallery ./avatargallery
  106. mv devproject/media ./media
  107. mv devproject/userdata ./userdata
  108. mv devproject/manage.py ./manage.py
  109. rm -rf devproject
  110. mv devproject_tmp devproject
  111. # migrate the DB
  112. python manage.py migrate
  113. # create superuser Admin with password "password"
  114. python manage.py createsuperuser --username $username --email admin@example.com --password $password
  115. echo
  116. echo "================================================================================"
  117. echo
  118. echo "You can now start the development server using:"
  119. echo
  120. echo " docker-compose up"
  121. echo
  122. echo "Running server will be available in the browser under the http://127.0.0.1:8000 address."
  123. echo
  124. echo "Default superuser has been created with following credentials:"
  125. echo
  126. echo "Username: $username"
  127. echo "Password: $password"
  128. echo
  129. echo "To see development project configuration see files in the \"devproject\" directory."
  130. echo
  131. }
  132. # Clear existing dev project
  133. clear() {
  134. echo -e "${RED}Warning:${NORMAL} You are going clear current development project."
  135. echo
  136. will_delete_files=false
  137. for dev_path in "${dev_paths[@]}"; do
  138. if [ -e $dev_path ]; then
  139. will_delete_files=true
  140. fi
  141. done
  142. if [[ $will_delete_files = true ]]; then
  143. echo "Following files and directories will be deleted:"
  144. for dev_path in "${dev_paths[@]}"; do
  145. if [ -e $dev_path ]; then
  146. echo " $dev_path"
  147. fi
  148. done
  149. echo
  150. fi
  151. echo "This will also stop and remove docker containers used by this project."
  152. echo
  153. echo "Enter \"y\" to confirm:"
  154. read confirmation
  155. if [[ $confirmation = "y" ]]; then
  156. for dev_path in "${dev_paths[@]}"; do
  157. if [ -e $dev_path ]; then
  158. echo "Removing $dev_path"
  159. rm -rf $dev_path
  160. fi
  161. done
  162. docker-compose stop
  163. docker-compose down
  164. exit 0
  165. else
  166. echo "Operation canceled."
  167. exit 0
  168. fi
  169. }
  170. # Rebuild docker containers
  171. rebuild() {
  172. docker_rebuild
  173. exit 0
  174. }
  175. # Run tests suite
  176. test() {
  177. $misago_run runtests.py $1
  178. docker_stop
  179. exit 0
  180. }
  181. # Command dispatcher
  182. if [[ $1 ]]; then
  183. if [[ $1 = "init" ]]; then
  184. init
  185. elif [[ $1 = "init_in_docker" ]]; then
  186. init_in_docker
  187. elif [[ $1 = "clear" ]]; then
  188. clear
  189. elif [[ $1 = "rebuild" ]]; then
  190. rebuild
  191. elif [[ $1 = "test" ]]; then
  192. test $2
  193. else
  194. invalid_option $1
  195. fi
  196. else
  197. intro
  198. fi