Deploy DSpace #2187
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: 60 | |
| 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 --remove-orphans | |
| playwright-after-deploy3: | |
| needs: deploy-3 | |
| if: '!inputs.IMPORT' | |
| uses: ./.github/workflows/playwright-tests.yml | |
| secrets: inherit | |
| playwright-after-import3: | |
| needs: import-3 | |
| if: inputs.IMPORT | |
| uses: ./.github/workflows/playwright-tests.yml | |
| secrets: inherit | |
| import-3: | |
| runs-on: dspace-${{inputs.DEV_MACHINE}}-dep-1 | |
| if: inputs.IMPORT | |
| timeout-minutes: 900 | |
| needs: deploy-3 | |
| env: | |
| INSTANCE: ${{inputs.INSTANCE}} | |
| CONFIG_PATH: /opt/dspace-envs/ | |
| FNAME: old_dump.sql | |
| DBROLEFNAME: setup-db-roles.sql | |
| SYNCSEQFNAME: sync-sequences.sql | |
| CLEANUPDBFNAME: cleanup-db-duplicates.sql | |
| steps: | |
| - name: vanilla import | |
| run: | | |
| export DATADIR=$CONFIG_PATH/${{inputs.INSTANCE}}/dump/$FNAME | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| export DDBNAME=dspacedb${{inputs.INSTANCE}} | |
| export DBROLESETUP=$CONFIG_PATH/${{inputs.INSTANCE}}/$DBROLEFNAME | |
| docker stop $DNAME || true | |
| echo "=====" | |
| # echo Starting vanilla import DB | |
| docker cp $DATADIR $DDBNAME:/tmp/$FNAME | |
| echo "Copying script for setup db roles to container..." | |
| docker cp $DBROLESETUP $DDBNAME:/tmp/$DBROLEFNAME | |
| # Create database, import dump, setup roles and extensions, then cleanup | |
| 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 -f /tmp/$FNAME && | |
| psql -p 10563 -U dspace -d dspace -f /tmp/$DBROLEFNAME && | |
| rm /tmp/$FNAME /tmp/$DBROLEFNAME | |
| " | |
| echo "=====" | |
| docker start $DNAME | |
| - uses: actions/checkout@v4 | |
| - name: cleanup database duplicates | |
| run: | | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| export DDBNAME=dspacedb${{inputs.INSTANCE}} | |
| export CLEANUPDB=$CONFIG_PATH/${{inputs.INSTANCE}}/$CLEANUPDBFNAME | |
| echo "Stopping DSpace container before database cleanup..." | |
| docker stop $DNAME || true | |
| echo "Waiting for connections to close..." | |
| sleep 5 | |
| echo "Copying cleanup db duplicates script to database container..." | |
| docker cp $CLEANUPDB $DDBNAME:/tmp/$CLEANUPDBFNAME | |
| echo "Cleaning up duplicate entries after data import..." | |
| docker exec $DDBNAME /bin/bash -c " | |
| psql -p 10563 -U dspace -d dspace -f /tmp/$CLEANUPDBFNAME | |
| rm /tmp/$CLEANUPDBFNAME | |
| " | |
| echo "Waiting for connections and locks to fully terminate..." | |
| sleep 15 | |
| - name: run database migration | |
| run: | | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| export DDBNAME=dspacedb${{inputs.INSTANCE}} | |
| export SYNCSEQSETUP=$CONFIG_PATH/${{inputs.INSTANCE}}/$SYNCSEQFNAME | |
| 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 "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 "Copying sequence synchronization script to database container..." | |
| docker cp $SYNCSEQSETUP $DDBNAME:/tmp/$SYNCSEQFNAME | |
| echo "Synchronizing database sequences before migration..." | |
| docker exec $DDBNAME /bin/bash -c "psql -p 10563 -U dspace -d dspace -f /tmp/$SYNCSEQFNAME" | |
| 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: restart dspace container | |
| run: | | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| echo "Restarting DSpace container..." | |
| docker restart $DNAME | |
| sleep 60 | |
| - 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 dspace.admin.dev@dataquest.sk -f admin -l user -p admin -c en -o dataquest" | |
| - name: rebuild discovery index and run oai import | |
| run: | | |
| export DNAME=dspace${{inputs.INSTANCE}} | |
| echo "Rebuilding discovery index..." | |
| docker exec $DNAME /bin/bash -c "/dspace/bin/dspace index-discovery -b" | |
| echo "Running OAI import..." | |
| docker exec $DNAME /bin/bash -c "/dspace/bin/dspace oai import -c" |