Deploy DSpace #1866
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # DSpace Docker deploy on dataquest servers | |
| name: Deploy DSpace | |
| on: | |
| workflow_call: | |
| inputs: | |
| DEV_MACHINE: | |
| required: false | |
| type: string | |
| default: 'dev-6' | |
| INSTANCE: | |
| required: false | |
| type: string | |
| default: '8563' | |
| IMPORT: | |
| required: false | |
| default: true | |
| type: boolean | |
| ERASE_DB: | |
| required: false | |
| default: false | |
| type: boolean | |
| workflow_dispatch: | |
| inputs: | |
| INSTANCE: | |
| required: true | |
| default: '8563' | |
| type: choice | |
| options: | |
| - '8563' | |
| IMPORT: | |
| required: true | |
| default: true | |
| type: boolean | |
| ERASE_DB: | |
| required: false | |
| default: false | |
| type: boolean | |
| DEV_MACHINE: | |
| required: false | |
| type: string | |
| default: 'dev-6' | |
| jobs: | |
| deploy-3: | |
| if: inputs.INSTANCE == '*' || inputs.INSTANCE == '8563' | |
| runs-on: dspace-${{inputs.DEV_MACHINE}}-dep-1 | |
| timeout-minutes: 10 | |
| env: | |
| INSTANCE: '8563' | |
| CONFIG_PATH: /opt/dspace-envs/${{inputs.INSTANCE}} | |
| ENVFILE: /opt/dspace-envs/${{inputs.INSTANCE}}/.env | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: ./.github/actions/erase-db | |
| if: inputs.ERASE_DB | |
| with: | |
| INSTANCE: ${{ env.INSTANCE }} | |
| NAME: dspace-${{ env.INSTANCE }} | |
| - name: deploy to ${{inputs.DEV_MACHINE}} | |
| working-directory: build-scripts/run/ | |
| run: | | |
| ./start.sh dspace-$INSTANCE | |
| cd ../.. | |
| # use customized docker-compose file for the `85` port because the server is exposed with the namespace `repository` | |
| # `/repository/server` | |
| docker compose --env-file $ENVFILE -p dspace-$INSTANCE -f docker/docker-compose.yml -f docker/docker-compose-rest.yml -f $CONFIG_PATH/docker-compose-rest.yml -f $CONFIG_PATH/docker-compose.yml up -d --no-build | |
| import-3: | |
| runs-on: dspace-${{inputs.DEV_MACHINE}}-dep-1 | |
| if: inputs.IMPORT | |
| timeout-minutes: 120 | |
| needs: deploy-3 | |
| env: | |
| INSTANCE: ${{inputs.INSTANCE}} | |
| CONFIG_PATH: /opt/dspace-envs/ | |
| steps: | |
| - name: vanilla import | |
| env: | |
| FNAME: old_dump.sql | |
| run: | | |
| export DATADIR=$CONFIG_PATH/${{inputs.INSTANCE}}/dump/$FNAME | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| export DDBNAME=dspacedb${{inputs.INSTANCE}} | |
| docker stop $DNAME || true | |
| echo "=====" | |
| # echo Starting vanilla import DB | |
| docker cp $DATADIR $DDBNAME:/tmp/ | |
| # Create dspace5 user as subgroup of dspace and prepare database | |
| docker exec $DDBNAME /bin/bash -c " | |
| dropdb -U dspace -p 10563 dspace || true && | |
| createdb -U dspace -p 10563 --owner=dspace --encoding=UNICODE dspace && | |
| psql -p 10563 -U dspace -d dspace -c \" | |
| DO \\\$\\\$ | |
| BEGIN | |
| -- Create dspace5 role if it doesn't exist | |
| IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'dspace5') THEN | |
| CREATE ROLE dspace5; | |
| GRANT dspace5 TO dspace; | |
| ALTER ROLE dspace5 LOGIN; | |
| ALTER ROLE dspace5 INHERIT; | |
| END IF; | |
| -- Create postgres role if it doesn't exist | |
| IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'postgres') THEN | |
| CREATE ROLE postgres; | |
| GRANT postgres TO dspace; | |
| ALTER ROLE postgres LOGIN; | |
| ALTER ROLE postgres INHERIT; | |
| ALTER ROLE postgres SUPERUSER; | |
| ALTER ROLE postgres CREATEDB; | |
| ALTER ROLE postgres CREATEROLE; | |
| END IF; | |
| END | |
| \\\$\\\$; | |
| -- Create pgcrypto extension if it doesn't exist (required by DSpace) | |
| CREATE EXTENSION IF NOT EXISTS pgcrypto; | |
| \" && | |
| psql -p 10563 -U dspace -d dspace -f /tmp/$FNAME && | |
| rm /tmp/$FNAME | |
| " | |
| echo "=====" | |
| docker start $DNAME | |
| - uses: actions/checkout@v4 | |
| - name: cleanup database duplicates | |
| run: | | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| export DDBNAME=dspacedb${{inputs.INSTANCE}} | |
| echo "Stopping DSpace container before database cleanup..." | |
| docker stop $DNAME || true | |
| echo "Waiting for connections to close..." | |
| sleep 5 | |
| echo "Cleaning up duplicate entries after data import..." | |
| chmod +x ./build-scripts/run/cleanup-db-duplicates.sh | |
| ./build-scripts/run/cleanup-db-duplicates.sh ${{inputs.INSTANCE}} | |
| echo "Terminating any remaining database connections..." | |
| docker exec $DDBNAME /bin/bash -c "psql -p 10563 -U dspace -d postgres -c \" | |
| SELECT pg_terminate_backend(pid) FROM pg_locks WHERE locktype = 'advisory'; | |
| \"" | |
| echo "Waiting for connections and locks to fully terminate..." | |
| sleep 15 | |
| - name: run database migration | |
| run: | | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| echo "Starting DSpace container for migration..." | |
| docker start $DNAME | |
| echo "Waiting longer for DSpace to be fully ready and locks to clear..." | |
| sleep 20 | |
| echo "Running DSpace database migration..." | |
| # docker exec $DNAME /bin/bash -c "cd /dspace/bin && ./dspace database migrate ignored" | |
| # | |
| # echo "Waiting for DSpace to be ready..." | |
| # sleep 10 | |
| # | |
| # - name: create administrator | |
| # run: | | |
| # export DNAME=dspace${{inputs.INSTANCE}} | |
| # echo "Creating DSpace administrator..." | |
| # docker exec $DNAME /bin/bash -c "cd /dspace/bin && ./dspace create-administrator -e test@test.edu -f admin -l user -p admin -c en -o dataquest" | |
| # | |
| # - name: restart dspace container | |
| # run: | | |
| # export DNAME=dspace${{inputs.INSTANCE}} | |
| # echo "Restarting DSpace container..." | |
| # docker restart $DNAME | |
| # sleep 60 | |
| # | |
| # - name: dspace healthcheck | |
| # run: | | |
| # export DNAME=dspace${{inputs.INSTANCE}} | |
| # echo "dspace healthcheck:" | |
| # docker exec $DNAME /bin/bash -c "cd /dspace/bin && ./dspace healthcheck -v" |