176 أسطر
5.5 KiB
YAML
176 أسطر
5.5 KiB
YAML
name: CI/CD - Ghaymah Cloud
|
|
|
|
on:
|
|
push:
|
|
branches: [main, staging]
|
|
pull_request:
|
|
branches: [main, staging]
|
|
|
|
env:
|
|
DOCKERHUB_REPOSITORY: ${{ secrets.DOCKERHUB_REPOSITORY }}
|
|
|
|
jobs:
|
|
build-and-push:
|
|
name: Build and Push to Docker Hub
|
|
runs-on: ubuntu-latest
|
|
if: github.event_name == 'push'
|
|
outputs:
|
|
environment: ${{ steps.env.outputs.environment }}
|
|
image_uri: ${{ steps.image.outputs.image_uri }}
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v5.0.0
|
|
|
|
|
|
- name: Set deployment environment
|
|
id: env
|
|
run: |
|
|
if [ "${{ github.ref_name }}" = "main" ]; then
|
|
echo "environment=production" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "environment=staging" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3.6.0
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
|
|
- name: Build and push Docker image
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: ./nodeapp
|
|
push: true
|
|
tags: |
|
|
docker.io/${{ secrets.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_REPOSITORY }}:production
|
|
docker.io/${{ secrets.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_REPOSITORY }}:staging
|
|
docker.io/${{ secrets.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_REPOSITORY }}:${{ github.sha }}
|
|
|
|
- name: Set deployment image
|
|
id: image
|
|
run: |
|
|
IMAGE_BASE="docker.io/${{ secrets.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_REPOSITORY }}"
|
|
if [ "${{ steps.env.outputs.environment }}" = "production" ]; then
|
|
echo "image_uri=${IMAGE_BASE}:production" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "image_uri=${IMAGE_BASE}:staging" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
build:
|
|
name: Build Docker Image
|
|
runs-on: ubuntu-latest
|
|
if: github.event_name == 'pull_request'
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v5.0.0
|
|
|
|
- name: Build Docker image
|
|
run: docker build ./nodeapp
|
|
|
|
deploy-staging:
|
|
name: Deploy to Staging
|
|
runs-on: ubuntu-latest
|
|
needs: build-and-push
|
|
if: github.event_name == 'push' && github.ref_name == 'staging'
|
|
environment:
|
|
name: staging
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v5.0.0
|
|
|
|
- name: Install Ghaymah CLI
|
|
run: curl -sSL https://cli.ghaymah.systems/install.sh | bash
|
|
|
|
- name: Login to Ghaymah
|
|
run: $HOME/ghaymah/bin/gy auth login --email "${{ secrets.GHAYMAH_EMAIL }}" --password "${{ secrets.GHAYMAH_PW }}"
|
|
|
|
- name: Create Ghaymah configuration
|
|
working-directory: nodeapp
|
|
env:
|
|
IMAGE_URI: ${{ needs.build-and-push.outputs.image_uri }}
|
|
PROJECT_ID: ${{ secrets.GHAYMAH_PROJECT_ID }}
|
|
APP_ID: ${{ secrets.GHAYMAH_APP_ID_STAGING }}
|
|
PULL_SECRET: ${{ secrets.DOCKERHUB_PULL_SECRET_NAME }}
|
|
run: |
|
|
jq -n \
|
|
--arg id "${APP_ID}" \
|
|
--arg name "nodeapp-staging" \
|
|
--arg projectId "${PROJECT_ID}" \
|
|
--arg image "${IMAGE_URI}" \
|
|
--arg pullSecret "${PULL_SECRET}" \
|
|
'{
|
|
id: $id,
|
|
name: $name,
|
|
projectId: $projectId,
|
|
ports: [{ expose: true, number: 5000 }],
|
|
publicAccess: {
|
|
enabled: true,
|
|
domain: "auto"
|
|
},
|
|
resourceTier: "t1",
|
|
container: {
|
|
image: $image,
|
|
pullSecretName: $pullSecret
|
|
}
|
|
}' > .ghaymah.json
|
|
|
|
cat .ghaymah.json
|
|
|
|
- name: Deploy to Ghaymah
|
|
working-directory: nodeapp
|
|
run: $HOME/ghaymah/bin/gy resource app launch --env staging
|
|
|
|
deploy-production:
|
|
name: Deploy to Production
|
|
runs-on: ubuntu-latest
|
|
needs: build-and-push
|
|
if: github.event_name == 'push' && github.ref_name == 'main'
|
|
environment:
|
|
name: production
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v5.0.0
|
|
|
|
- name: Install Ghaymah CLI
|
|
run: curl -sSL https://cli.ghaymah.systems/install.sh | bash
|
|
|
|
- name: Login to Ghaymah
|
|
run: $HOME/ghaymah/bin/gy auth login --email "${{ secrets.GHAYMAH_EMAIL }}" --password "${{ secrets.GHAYMAH_PW }}"
|
|
|
|
- name: Create Ghaymah configuration
|
|
working-directory: nodeapp
|
|
env:
|
|
IMAGE_URI: ${{ needs.build-and-push.outputs.image_uri }}
|
|
PROJECT_ID: ${{ secrets.GHAYMAH_PROJECT_ID }}
|
|
APP_ID: ${{ secrets.GHAYMAH_APP_ID_PRODUCTION }}
|
|
PULL_SECRET: ${{ secrets.DOCKERHUB_PULL_SECRET_NAME }}
|
|
run: |
|
|
jq -n \
|
|
--arg id "${APP_ID}" \
|
|
--arg name "nodeapp-production" \
|
|
--arg projectId "${PROJECT_ID}" \
|
|
--arg image "${IMAGE_URI}" \
|
|
--arg pullSecret "${PULL_SECRET}" \
|
|
'{
|
|
id: $id,
|
|
name: $name,
|
|
projectId: $projectId,
|
|
ports: [{ expose: true, number: 5000 }],
|
|
publicAccess: {
|
|
enabled: true,
|
|
domain: "auto"
|
|
},
|
|
resourceTier: "t1",
|
|
container: {
|
|
image: $image,
|
|
pullSecretName: $pullSecret
|
|
}
|
|
}' > .ghaymah.json
|
|
|
|
cat .ghaymah.json
|
|
|
|
- name: Deploy to Ghaymah
|
|
working-directory: nodeapp
|
|
run: $HOME/ghaymah/bin/gy resource app launch --env production
|