Skip to content

Instantly share code, notes, and snippets.

@mannyanebi
Created June 30, 2023 15:14
Show Gist options
  • Select an option

  • Save mannyanebi/0bf4f4e394ce967bc4c6db3700210c67 to your computer and use it in GitHub Desktop.

Select an option

Save mannyanebi/0bf4f4e394ce967bc4c6db3700210c67 to your computer and use it in GitHub Desktop.

Revisions

  1. mannyanebi created this gist Jun 30, 2023.
    136 changes: 136 additions & 0 deletions prod_pipeline.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,136 @@
    name: Prod Headless-Typescript

    on:
    push:
    branches: [main]
    pull_request:
    branches: [main]

    jobs:
    build-test-job:

    runs-on: ubuntu-latest

    strategy:
    max-parallel: 4
    matrix:
    node-version: [14.17.5]
    # node-version: [14.x, 16.x]

    steps:
    - name: Checkout repository
    uses: actions/checkout@v2

    - name: Set up Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v3
    with:
    node-version: ${{ matrix.node-version }}
    cache: 'yarn'

    - name: Install Dependencies
    run: yarn --prefer-offline

    - name: Make build .env file
    uses: SpicyPizza/[email protected]
    with:
    envkey_NEXT_PUBLIC_BASE_URL: ${{ secrets.PROD_NEXT_PUBLIC_BASE_URL }}
    envkey_NEXT_PUBLIC_PHOTO_URL: ${{ secrets.PROD_NEXT_PUBLIC_PHOTO_URL }}
    envkey_NEXT_PUBLIC_ENVIRONMENT_PROTOCOL: ${{ secrets.PROD_NEXT_PUBLIC_ENVIRONMENT_PROTOCOL }}
    envkey_NEXT_PUBLIC_DEV_HOSTNAME: ${{ secrets.PROD_NEXT_PUBLIC_DEV_HOSTNAME }}
    envkey_NEXT_PUBLIC_USER_IMAGE_PLACEHOLDER: ${{ secrets.PROD_NEXT_PUBLIC_USER_IMAGE_PLACEHOLDER }}
    envkey_NEXT_PUBLIC_PUSHER_KEY: ${{ secrets.PROD_NEXT_PUBLIC_PUSHER_KEY }}
    envkey_NEXT_PUBLIC_PAYMENT_API_MODE: ${{ secrets.PROD_NEXT_PUBLIC_PAYMENT_API_MODE }}
    envkey_NEXT_PUBLIC_PAYSTACK_TEST_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_PAYSTACK_TEST_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_PAYSTACK_LIVE_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_PAYSTACK_LIVE_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_FLUTTERWAVE_TEST_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_FLUTTERWAVE_TEST_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_FLUTTERWAVE_LIVE_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_FLUTTERWAVE_LIVE_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_CLARITY_ID: ${{ secrets.PROD_NEXT_PUBLIC_CLARITY_ID }}
    file_name: .env.production
    fail_on_empty: true

    - name: Build
    run: yarn build

    deploy-job:
    runs-on: ubuntu-latest
    needs: [build-test-job] # will be fired if and only if build-test-job is passed.
    if: ${{ github.event_name == 'push' }} # will be fired if the trigger event is a push event.

    strategy:
    max-parallel: 4
    matrix:
    node-version: [14.17.5]

    steps:
    - name: Checkout repository
    uses: actions/checkout@v2

    - name: Set up Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v3
    with:
    node-version: ${{ matrix.node-version }}
    cache: 'yarn'

    - name: Install Dependencies
    run: yarn --prefer-offline

    - name: Make build .env file
    uses: SpicyPizza/[email protected]
    with:
    envkey_NEXT_PUBLIC_BASE_URL: ${{ secrets.PROD_NEXT_PUBLIC_BASE_URL }}
    envkey_NEXT_PUBLIC_PHOTO_URL: ${{ secrets.PROD_NEXT_PUBLIC_PHOTO_URL }}
    envkey_NEXT_PUBLIC_ENVIRONMENT_PROTOCOL: ${{ secrets.PROD_NEXT_PUBLIC_ENVIRONMENT_PROTOCOL }}
    envkey_NEXT_PUBLIC_DEV_HOSTNAME: ${{ secrets.PROD_NEXT_PUBLIC_DEV_HOSTNAME }}
    envkey_NEXT_PUBLIC_USER_IMAGE_PLACEHOLDER: ${{ secrets.PROD_NEXT_PUBLIC_USER_IMAGE_PLACEHOLDER }}
    envkey_NEXT_PUBLIC_PUSHER_KEY: ${{ secrets.PROD_NEXT_PUBLIC_PUSHER_KEY }}
    envkey_NEXT_PUBLIC_PAYMENT_API_MODE: ${{ secrets.PROD_NEXT_PUBLIC_PAYMENT_API_MODE }}
    envkey_NEXT_PUBLIC_PAYSTACK_TEST_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_PAYSTACK_TEST_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_PAYSTACK_LIVE_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_PAYSTACK_LIVE_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_FLUTTERWAVE_TEST_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_FLUTTERWAVE_TEST_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_FLUTTERWAVE_LIVE_PUBLIC_KEY: ${{ secrets.PROD_NEXT_PUBLIC_FLUTTERWAVE_LIVE_PUBLIC_KEY }}
    envkey_NEXT_PUBLIC_CLARITY_ID: ${{ secrets.PROD_NEXT_PUBLIC_CLARITY_ID }}
    file_name: .env.production
    fail_on_empty: true

    - name: Build
    run: yarn build

    - name: Copy repository contents via scp to remote server
    uses: appleboy/[email protected]
    env:
    HOST: ${{ secrets.PRODHTS_HOSTNAME }}
    USERNAME: ${{ secrets.PRODHTS_USERNAME }}
    PORT: 22
    KEY: ${{ secrets.PRODHTS_SSHKEY }}
    with:
    source: "."
    target: "~/headless-typescript"

    - name: Executing remote command
    uses: appleboy/ssh-action@master
    with:
    HOST: ${{ secrets.PRODHTS_HOSTNAME }}
    USERNAME: ${{ secrets.PRODHTS_USERNAME }}
    PORT: 22
    KEY: ${{ secrets.PRODHTS_SSHKEY }}

    script: |
    pm2 restart headless-typescript
    slack-notify:
    runs-on: ubuntu-latest
    needs: [ deploy-job ]
    if: ${{ always() }}

    steps:
    - name: Slack Notification
    uses: rtCamp/action-slack-notify@v2
    env:
    SLACK_WEBHOOK: ${{ secrets.DEV_SLACK_BUILD_WEBHOOK }}
    SLACK_CHANNEL: cicd-headless
    SLACK_COLOR: ${{ needs.deploy-job.result }} # or a specific color like 'green' or '#ff00ff'
    SLACK_ICON: https://avatars.githubusercontent.com/u/83184026?s=200&v=4
    SLACK_USERNAME: Deployment Bot
    SLACK_MESSAGE: '${{ github.repository }} Deployment ${{ github.run_number }} to ${{ github.workflow }} ended in a ${{ needs.deploy-job.result }} :rocket:'
    SLACK_TITLE: Message