name: Automatic Deployment on: push: branches: - dev concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: environment: name: ๐ŸŒ Setup Environment runs-on: [self-hosted] outputs: target: ${{ steps.dev.outputs.target || steps.staging.outputs.target }} steps: - name: ๐Ÿ› ๏ธ Set Development Environment id: dev if: ${{github.ref_name == 'dev'}} run: | echo "target=dev" >> $GITHUB_OUTPUT - name: ๐Ÿš€ Set Staging Environment id: staging if: ${{github.ref_name == 'staging'}} run: | echo "target=staging" >> $GITHUB_OUTPUT build-base-image: name: ๐Ÿ—๏ธ Build Base Image runs-on: [self-hosted, dev] needs: [environment] steps: - name: ๐Ÿ” Checkout uses: actions/checkout@v4 - name: ๐Ÿณ Build Docker Image run: docker build -t edr-${{needs.environment.outputs.target}} . deploy-service: name: ${{ matrix.display_name }} runs-on: [self-hosted, dev] needs: [build-base-image, environment] strategy: fail-fast: false matrix: include: - service: freight-api env_file: .env.freight-api display_name: ๐Ÿšš Deploy Freight API Service - service: passenger-api env_file: .env.passenger-api display_name: ๐Ÿง‘โ€๐Ÿฆฒ Deploy Passenger API Service steps: - name: ๐Ÿ” Checkout uses: actions/checkout@v4 - name: ๐Ÿ“‹ Copy ${{ matrix.service }} Environment run: cp ~/environment/edr/${{needs.environment.outputs.target}}/${{ matrix.env_file }} .env - name: ๐Ÿš€ Start ${{ matrix.service }} Service run: docker compose --project-name="edr-${{needs.environment.outputs.target}}" up -d --force-recreate ${{ matrix.service }} --build cleanup: name: ๐Ÿงน Cleanup Docker Resources runs-on: [self-hosted] needs: - deploy-service if: always() # Run even if previous jobs fail steps: - name: ๐Ÿ—‘๏ธ Remove unused Docker resources run: | echo "๐Ÿงน Cleaning up Docker resources..." # Remove all stopped containers docker container prune -f # Remove unused images (both dangling and unreferenced) docker image prune -a -f echo "โœ… Docker cleanup completed!"