name: CI/CD Pipeline on: push env: CARGO_TARGET: x86_64-unknown-linux-musl SSH_HOST: ${{ secrets.SSH_HOST }} SSH_USER: ${{ secrets.SSH_USER }} SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} jobs: test-frontend: runs-on: ubuntu-latest container: rust:latest steps: - name: Setup Environment run: | apt-get update -qq && apt-get install -y -qq sshpass musl musl-tools sqlite3 curl gnupg && mkdir -p /etc/apt/keyrings | curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && apt-get update && apt-get install nodejs -y && apt-get install npm -y - uses: actions/checkout@v3 - name: Run Test DB Script run: ./test_db.sh - name: Build run: | cargo build cd frontend && npm install && npm run build - name: Install dependencies run: cd frontend && npm install - name: Install Playwright Browsers run: cd frontend && npx playwright install --with-deps - name: Run Playwright tests run: cd frontend && npx playwright test --workers 1 - uses: actions/upload-artifact@v3 if: always() with: name: playwright-report path: frontend/playwright-report/ retention-days: 30 test-backend: runs-on: ubuntu-latest container: rust:latest steps: - name: Setup Environment run: | apt-get update -qq && apt-get install -y -qq sshpass musl musl-tools sqlite3 curl gnupg && mkdir -p /etc/apt/keyrings | curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && apt-get update && apt-get install nodejs -y && apt-get install npm -y - name: Checkout uses: actions/checkout@v3 - name: Run Test DB Script run: ./test_db.sh - name: Build run: | cargo build cd frontend && npm install && npm run build - name: Run Tests run: cargo test --verbose deploy-staging: runs-on: ubuntu-latest container: rust:latest needs: [test_frontend, test_backend] if: github.ref == 'refs/heads/staging' steps: - name: Setup Environment run: | rustup target add $CARGO_TARGET apt-get update -qq && apt-get install -y -qq pkg-config sshpass musl musl-tools sqlite3 curl gnupg libssl-dev # Handling NodeSource GPG key curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key -o nodesource.gpg.key if [ -f /etc/apt/keyrings/nodesource.gpg ]; then rm /etc/apt/keyrings/nodesource.gpg fi gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg nodesource.gpg.key # Adding NodeSource repository echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list # Installing Node.js and npm apt-get update apt-get install nodejs -y apt-get install npm -y - name: Checkout uses: actions/checkout@v3 - name: Run Test DB Script run: ./test_db.sh - name: Build run: | cargo build --release --target $CARGO_TARGET strip target/$CARGO_TARGET/release/rot cd frontend && npm install && npm run build - name: Deploy to Staging run: | mkdir ~/.ssh ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa scp target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/home/k004373/rowing-staging/rot-updating scp staging-diff.sql $SSH_USER@$SSH_HOST:/home/k004373/rowing-staging/ scp -r static $SSH_USER@$SSH_HOST:/home/k004373/rowing-staging/ scp -r templates $SSH_USER@$SSH_HOST:/home/k004373/rowing-staging/ scp -r svelte $SSH_USER@$SSH_HOST:/home/k004373/rowing-staging/ ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop rotstaging' ssh $SSH_USER@$SSH_HOST 'rm /home/k004373/rowing-staging/db.sqlite && cp /home/k004373/rowing/db.sqlite /home/k004373/rowing-staging/db.sqlite && mkdir -p /home/k004373/rowing-staging/svelte/build && mkdir -p /home/k004373/rowing-staging/data-ergo/thirty && mkdir -p /home/k004373/rowing-staging/data-ergo/dozen && sqlite3 /home/k004373/rowing-staging/db.sqlite < /home/k004373/rowing-staging/staging-diff.sql' ssh $SSH_USER@$SSH_HOST 'mv /home/k004373/rowing-staging/rot-updating /home/k004373/rowing-staging/rot' ssh $SSH_USER@$SSH_HOST 'sudo systemctl start rotstaging' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} SSH_HOST: ${{ secrets.SSH_HOST }} SSH_USER: ${{ secrets.SSH_USER }} deploy-main: runs-on: ubuntu-latest container: rust:latest needs: [test_frontend, test_backend] if: github.ref == 'refs/heads/main' steps: - name: Setup Environment run: | rustup target add $CARGO_TARGET apt-get update -qq && apt-get install -y -qq pkg-config sshpass musl musl-tools sqlite3 curl gnupg libssl-dev && mkdir -p /etc/apt/keyrings | curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && apt-get update && apt-get install nodejs -y && apt-get install npm -y - name: Checkout uses: actions/checkout@v3 - name: Run Test DB Script run: ./test_db.sh - name: Build run: | cargo build --release --target $CARGO_TARGET strip target/$CARGO_TARGET/release/rot cd frontend && npm install && npm run build - name: Deploy to Main run: | mkdir ~/.ssh ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa scp target/$CARGO_TARGET/release/rot $SSH_USER@$SSH_HOST:/home/k004373/rowing/rot-updating scp -r static $SSH_USER@$SSH_HOST:/home/k004373/rowing/ scp -r templates $SSH_USER@$SSH_HOST:/home/k004373/rowing/ scp -r svelte $SSH_USER@$SSH_HOST:/home/k004373/rowing/ ssh $SSH_USER@$SSH_HOST 'mkdir -p /home/k004373/rowing/svelte/build && mkdir -p /home/k004373/rowing/data-ergo/thirty && mkdir -p /home/k004373/rowing/data-ergo/dozen' ssh $SSH_USER@$SSH_HOST 'sudo systemctl stop rot' ssh $SSH_USER@$SSH_HOST 'mv /home/k004373/rowing/rot-updating /home/k004373/rowing/rot' ssh $SSH_USER@$SSH_HOST 'sudo systemctl start rot' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} SSH_HOST: ${{ secrets.SSH_HOST }} SSH_USER: ${{ secrets.SSH_USER }}