diff --git a/.github/workflows/CD_dev.yml b/.github/workflows/CD_dev.yml new file mode 100644 index 0000000..1a1c142 --- /dev/null +++ b/.github/workflows/CD_dev.yml @@ -0,0 +1,384 @@ +name: dev + +on: + push: + branches: + - dev + +jobs: + # JOB to run change detection + detectChanges: + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + CD: ${{ steps.filter.outputs.CD }} + images: ${{ steps.filter.outputs.images }} + imagesFiles: ${{ steps.filter.outputs.images_files }} + server: ${{ steps.filter.outputs.server }} + replServer: ${{ steps.filter.outputs.replServer }} + app: ${{ steps.filter.outputs.app }} + serviceWorker: ${{ steps.filter.outputs.serviceWorker }} + dependencies: ${{ steps.filter.outputs.dependencies }} + public: ${{ steps.filter.outputs.public }} + deployOption: ${{ steps.filter.outputs.deployOption }} + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: dev + list-files: 'csv' + filters: | + CD: + - '.github/workflows/CD_dev.yml' + images: + - added|modified: 'app/res/img/**' + server: + - 'server/**' + replServer: + - 'replServer/**' + app: + - 'app/**' + serviceWorker: + - 'serviceWorker/**' + dependencies: + - 'package.json' + public: + - 'public/**' + deployOption: + - '.deploy' + + + buildApp: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Setting up bun + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: oven-sh/setup-bun@v1 + + + - name: Installing runner dependencies + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building app" + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdApp --if-present + + - name: "Uploading files to remote" + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "public/dist" + target: /var/www/html/valentine/dev/_${{github.sha}} + overwrite: true + + buildServer: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building server" + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdServer --if-present + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "server" + target: /var/www/html/valentine/dev/_${{github.sha}} + overwrite: true + + buildReplServer: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building repl server" + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdReplServer --if-present + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "replServer" + target: /var/www/html/valentine/dev/_${{github.sha}} + overwrite: true + + + buildServiceWorker: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building service worker" + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdSw --if-present + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + # todo service worker dist + passphrase: ${{ secrets.PASSPHRASE }} + source: "public/sw.js" + target: /var/www/html/valentine/dev/_${{github.sha}} + overwrite: true + + compressImages: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 100 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + with: + lfs: "true" + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm i image-web -g + + - name: Setting environment variables + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: allenevans/set-env@v2.0.0 + with: + UV_THREADPOOL_SIZE: '1' # otherwise may take up too much memory and cause action to be canceled. + + + - name: Debug log + run: "echo eval `node -e \"let a = JSON.parse(fs.readFileSync('package.json').toString()).scripts.compressImages.split(' '); let i = a.indexOf('image-web'); assert(i !== -1); assert(a[0] === 'image-web' || (a[0] === 'npx' && (a[1] === 'image-web' || ((a[1] === '--yes' || a[1] === '-y') && a[2] === 'image-web')))); let inp = require('process').argv[1]; if (inp !== undefined && inp !== '') a[i + 1] = inp; console.log(a.join(' ') + (a.includes('--legacyLogs') ? '' : ' --legacyLogs'));\" \"${{ needs.detectChanges.outputs.imagesFiles }}\"`" + + - name: "Compressing images" + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + # replace the input of the compressImage command (hopefully using image-web) with the image diffs of this commit. Also add legacyLogs option + run: "eval `node -e \"let a = JSON.parse(fs.readFileSync('package.json').toString()).scripts.compressImages.split(' '); let i = a.indexOf('image-web'); assert(i !== -1); assert(a[0] === 'image-web' || (a[0] === 'npx' && (a[1] === 'image-web' || ((a[1] === '--yes' || a[1] === '-y') && a[2] === 'image-web')))); let inp = require('process').argv[1]; if (inp !== undefined && inp !== '') a[i + 1] = inp; console.log(a.join(' ') + (a.includes('--legacyLogs') ? '' : ' --legacyLogs'));\" \"${{ needs.detectChanges.outputs.imagesFiles }}\"`" + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "public/res/img/dist" + target: /var/www/html/valentine/dev/_${{github.sha}} + overwrite: true + + + uploadPublicAssets: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.public == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Upload public files + if: ${{ needs.detectChanges.outputs.public == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "public" + target: /var/www/html/valentine/dev/_${{github.sha}} + overwrite: true + + dependencies: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Upload dependency declaration + if: ${{ needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "package.json" + target: /var/www/html/valentine/dev + overwrite: true + + - name: Installing dependencies on remote + if: ${{ needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + script: | + cd /var/www/html/valentine/dev + source ~/.nvm/nvm.sh + nvm use default + npx -y pnpm update + + deploy: + runs-on: ubuntu-latest + needs: [detectChanges, buildApp, buildServer, buildReplServer, buildServiceWorker, compressImages, uploadPublicAssets, dependencies] + if: always() + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.deployOption == 'true' }} + uses: actions/checkout@master + + - name: Upload deploy option files + if: ${{ needs.detectChanges.outputs.deployOption == 'true' }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: ".deploy" + target: /var/www/html/valentine/dev + overwrite: true + + + - name: Moving files from temp storage + if: ${{ (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.images == 'true') || (needs.detectChanges.outputs.server == 'true') || (needs.detectChanges.outputs.replServer == 'true') || (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.serviceWorker == 'true') || (needs.detectChanges.outputs.public == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + # https://unix.stackexchange.com/a/182155/431792 + script: | + cp -rlf /var/www/html/valentine/dev/_${{github.sha}}/* /var/www/html/valentine/dev + rm -r /var/www/html/valentine/dev/_${{github.sha}} + + + - name: Restarting server + if: ${{ (needs.detectChanges.outputs.deployOption == 'true') || (needs.detectChanges.outputs.server == 'true') || (needs.detectChanges.outputs.replServer == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + script: | + cd /var/www/html/valentine/dev + source ~/.nvm/nvm.sh + nvm use default + npx wait-on ecosystem.config.js + node pm2Reload.js \ No newline at end of file diff --git a/.github/workflows/CD_master.yml b/.github/workflows/CD_master.yml new file mode 100644 index 0000000..6afe8e4 --- /dev/null +++ b/.github/workflows/CD_master.yml @@ -0,0 +1,384 @@ +name: master + +on: + push: + branches: + - master + +jobs: + # JOB to run change detection + detectChanges: + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + CD: ${{ steps.filter.outputs.CD }} + images: ${{ steps.filter.outputs.images }} + imagesFiles: ${{ steps.filter.outputs.images_files }} + server: ${{ steps.filter.outputs.server }} + replServer: ${{ steps.filter.outputs.replServer }} + app: ${{ steps.filter.outputs.app }} + serviceWorker: ${{ steps.filter.outputs.serviceWorker }} + dependencies: ${{ steps.filter.outputs.dependencies }} + public: ${{ steps.filter.outputs.public }} + deployOption: ${{ steps.filter.outputs.deployOption }} + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v2 + id: filter + with: + base: master + list-files: 'csv' + filters: | + CD: + - '.github/workflows/CD_master.yml' + images: + - added|modified: 'app/res/img/**' + server: + - 'server/**' + replServer: + - 'replServer/**' + app: + - 'app/**' + serviceWorker: + - 'serviceWorker/**' + dependencies: + - 'package.json' + public: + - 'public/**' + deployOption: + - '.deploy' + + + buildApp: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Setting up bun + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: oven-sh/setup-bun@v1 + + + - name: Installing runner dependencies + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building app" + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdApp --if-present + + - name: "Uploading files to remote" + if: ${{ (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "public/dist" + target: /var/www/html/valentine/master/_${{github.sha}} + overwrite: true + + buildServer: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building server" + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdServer --if-present + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.server == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "server" + target: /var/www/html/valentine/master/_${{github.sha}} + overwrite: true + + buildReplServer: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building repl server" + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdReplServer --if-present + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.replServer == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "replServer" + target: /var/www/html/valentine/master/_${{github.sha}} + overwrite: true + + + buildServiceWorker: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npx -y pnpm i + + # - name: set environment variables + # uses: allenevans/set-env@v2.0.0 + # with: + # GOOGLE_MAPS_API_KEY: '${{ secrets.MAPS_API_KEY }}' + + - name: "Building service worker" + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm run buildProdSw --if-present + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.serviceWorker == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + # todo service worker dist + passphrase: ${{ secrets.PASSPHRASE }} + source: "public/sw.js" + target: /var/www/html/valentine/master/_${{github.sha}} + overwrite: true + + compressImages: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 100 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + with: + lfs: "true" + + - name: Setting up node + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/setup-node@master + with: + node-version: '20.x' + + - name: Installing runner dependencies + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + run: npm i image-web -g + + - name: Setting environment variables + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: allenevans/set-env@v2.0.0 + with: + UV_THREADPOOL_SIZE: '1' # otherwise may take up too much memory and cause action to be canceled. + + - name: Debug log + run: "echo eval `node -e \"let a = JSON.parse(fs.readFileSync('package.json').toString()).scripts.compressImages.split(' '); let i = a.indexOf('image-web'); assert(i !== -1); assert(a[0] === 'image-web' || (a[0] === 'npx' && (a[1] === 'image-web' || ((a[1] === '--yes' || a[1] === '-y') && a[2] === 'image-web')))); let inp = require('process').argv[1]; if (inp !== undefined && inp !== '') a[i + 1] = inp; console.log(a.join(' ') + (a.includes('--legacyLogs') ? '' : ' --legacyLogs'));\" \"${{ needs.detectChanges.outputs.imagesFiles }}\"`" + + + - name: "Compressing images" + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + # replace the input of the compressImage command (hopefully using image-web) with the image diffs of this commit. Also add legacyLogs option + run: "eval `node -e \"let a = JSON.parse(fs.readFileSync('package.json').toString()).scripts.compressImages.split(' '); let i = a.indexOf('image-web'); assert(i !== -1); assert(a[0] === 'image-web' || (a[0] === 'npx' && (a[1] === 'image-web' || ((a[1] === '--yes' || a[1] === '-y') && a[2] === 'image-web')))); let inp = require('process').argv[1]; if (inp !== undefined && inp !== '') a[i + 1] = inp; console.log(a.join(' ') + (a.includes('--legacyLogs') ? '' : ' --legacyLogs'));\" \"${{ needs.detectChanges.outputs.imagesFiles }}\"`" + + - name: "Uploading files to remote" + if: ${{ needs.detectChanges.outputs.images == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "public/res/img/dist" + target: /var/www/html/valentine/master/_${{github.sha}} + overwrite: true + + + uploadPublicAssets: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.public == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Upload public files + if: ${{ needs.detectChanges.outputs.public == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "public" + target: /var/www/html/valentine/master/_${{github.sha}} + overwrite: true + + dependencies: + runs-on: ubuntu-latest + needs: [detectChanges] + timeout-minutes: 15 + + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: actions/checkout@master + + - name: Upload dependency declaration + if: ${{ needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: "package.json" + target: /var/www/html/valentine/master + overwrite: true + + - name: Installing dependencies on remote + if: ${{ needs.detectChanges.outputs.dependencies == 'true' || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + script: | + cd /var/www/html/valentine/master + source ~/.nvm/nvm.sh + nvm use default + npx -y pnpm update + + deploy: + runs-on: ubuntu-latest + needs: [detectChanges, buildApp, buildServer, buildReplServer, buildServiceWorker, compressImages, uploadPublicAssets, dependencies] + if: always() + timeout-minutes: 15 + + steps: + - name: "checkout" + if: ${{ needs.detectChanges.outputs.deployOption == 'true' }} + uses: actions/checkout@master + + - name: Upload deploy option files + if: ${{ needs.detectChanges.outputs.deployOption == 'true' }} + uses: appleboy/scp-action@v0.1.1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + source: ".deploy" + target: /var/www/html/valentine/master + overwrite: true + + + - name: Moving files from temp storage + if: ${{ (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.images == 'true') || (needs.detectChanges.outputs.server == 'true') || (needs.detectChanges.outputs.replServer == 'true') || (needs.detectChanges.outputs.app == 'true') || (needs.detectChanges.outputs.serviceWorker == 'true') || (needs.detectChanges.outputs.public == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + # https://unix.stackexchange.com/a/182155/431792 + script: | + cp -rlf /var/www/html/valentine/master/_${{github.sha}}/* /var/www/html/valentine/master + rm -r /var/www/html/valentine/master/_${{github.sha}} + + + - name: Restarting server + if: ${{ (needs.detectChanges.outputs.deployOption == 'true') || (needs.detectChanges.outputs.server == 'true') || (needs.detectChanges.outputs.replServer == 'true') || (needs.detectChanges.outputs.dependencies == 'true') || (needs.detectChanges.outputs.CD == 'true') }} + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + passphrase: ${{ secrets.PASSPHRASE }} + script: | + cd /var/www/html/valentine/master + source ~/.nvm/nvm.sh + nvm use default + npx wait-on ecosystem.config.js + node pm2Reload.js \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..fcea0e4 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,27 @@ +name: CI + +on: pull_request + +jobs: + + CI: + name: CI + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - name: "Checkout" + uses: actions/checkout@master + - name: "Setup node" + uses: actions/setup-node@master + with: + node-version: '16.x' + + - name: Installing runner dependencies + run: npm i + + - name: "Building" + run: npm run build --if-present + + - name: "Testing" + run: npm test --if-present \ No newline at end of file diff --git a/.gitignore b/.gitignore index 53dc8c5..e5b6cf7 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,4 @@ pugBody.gen.ts .env -.github/workflows +# .github/workflows