diff --git a/.github/workflows/cicd.yaml b/.github/workflows/cicd.yaml index 0f98de1..624f1c2 100644 --- a/.github/workflows/cicd.yaml +++ b/.github/workflows/cicd.yaml @@ -1,4 +1,4 @@ -name: Deploy Weather App to Ghaymah +name: Auto Deploy to Ghaymah on: push: @@ -9,111 +9,94 @@ on: env: IMAGE_NAME: weather-app DOCKER_USERNAME: ahmedgamalyousef + APP_NAME: weather-app + APP_PORT: 5000 jobs: - test: - # name: Test Application + build-test-deploy: + # name: Build, Test & Deploy # runs-on: ubuntu-latest steps: - - name: Checkout code + # Step 1: Checkout code + - name: Checkout repository uses: actions/checkout@v4 - # - name: Set up Node.js + # # Step 2: Set up Node.js (if your app needs it) + # - name: Setup Node.js # uses: actions/setup-node@v4 # with: # node-version: '18' # cache: 'npm' + # # Step 3: Install dependencies and test # - name: Install dependencies # run: npm install # - name: Run tests # run: npm test - build-and-push: - name: Build and Push Docker Image - runs-on: ubuntu-latest - needs: test - if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' - - steps: - - name: Checkout code - uses: actions/checkout@v4 - + # Step 4: Set up Docker Buildx - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to Docker Hub + # Step 5: Login to Docker Hub + - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Extract version from commit + # Step 6: Extract version from git commit + - name: Get version from commit id: version run: | SHORT_SHA=$(git rev-parse --short HEAD) - echo "VERSION=${SHORT_SHA}" >> $GITHUB_OUTPUT - echo "Using version: ${SHORT_SHA}" + TIMESTAMP=$(date +%Y%m%d%H%M%S) + echo "VERSION=${SHORT_SHA}-${TIMESTAMP}" >> $GITHUB_OUTPUT + echo "IMAGE_TAG=${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:${SHORT_SHA}-${TIMESTAMP}" >> $GITHUB_OUTPUT + echo "🔨 Building version: ${SHORT_SHA}-${TIMESTAMP}" + # Step 7: Build and push Docker image - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: true tags: | - ${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }} + ${{ steps.version.outputs.IMAGE_TAG }} ${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:latest cache-from: type=gha cache-to: type=gha,mode=max + labels: | + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.revision=${{ github.sha }} - - name: Save version info - run: | - echo "${{ steps.version.outputs.VERSION }}" > version.txt - echo "Built image: ${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}" - - deploy: - name: Deploy to Ghaymah - runs-on: ubuntu-latest - needs: build-and-push - if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Download version info - uses: actions/download-artifact@v4 - with: - name: version-info - path: ./ - - - name: Read version - id: version - run: | - VERSION=$(cat version.txt) - echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT - echo "Deploying version: ${VERSION}" - + # Step 8: Install Ghaymah CLI - name: Install Ghaymah CLI run: | + echo "📥 Installing Ghaymah CLI..." curl -fsSL https://cli.ghaymah.systems/install.sh | sh - echo "${{ secrets.GHAYMAH_CONFIG }}" > ~/.ghaymah/config.yaml + echo "✅ Ghaymah CLI installed" - - name: Create Ghaymah configuration + # Step 9: Configure Ghaymah + - name: Configure Ghaymah deployment + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' run: | + echo "⚙️ Creating Ghaymah configuration..." + + # Create .ghaymah.json configuration cat > .ghaymah.json << EOF { "container": { - "image": "docker.io/${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}", + "image": "${{ steps.version.outputs.IMAGE_TAG }}", "pullSecretName": "" }, - "name": "${{ vars.APP_NAME || 'weather-app' }}", + "name": "${{ env.APP_NAME }}", "ports": [ { "expose": true, - "number": ${{ vars.APP_PORT || 5000 }} + "number": ${{ env.APP_PORT }} } ], "projectId": "${{ secrets.GHAYMAH_PROJECT_ID }}", @@ -125,29 +108,55 @@ jobs: "resourceTier": "t1" } EOF + + echo "✅ Configuration file created" + cat .ghaymah.json + # Step 10: Deploy to Ghaymah - name: Deploy to Ghaymah + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' run: | + echo "🚀 Deploying to Ghaymah..." + + # Deploy the application gy resource app launch - env: - GHAYMAH_ACCESS_TOKEN: ${{ secrets.GHAYMAH_ACCESS_TOKEN }} + + echo "✅ Deployment command completed" - - name: Wait for deployment and health check + # Step 11: Wait and verify deployment + - name: Verify deployment + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' run: | echo "⏳ Waiting for deployment to become ready..." - sleep 60 - APP_URL="https://${{ vars.APP_NAME || 'weather-app' }}.hosted.ghaymah.systems" - echo "🌐 Application URL: $APP_URL" + sleep 45 - # Health check (optional) + APP_URL="https://${{ env.APP_NAME }}.hosted.ghaymah.systems" + echo "🌐 Your updated app is available at: $APP_URL" + + # Try to check if app is responding + echo "🔍 Checking application health..." if command -v curl > /dev/null; then - echo "🔍 Performing health check..." - curl -f --retry 5 --retry-delay 10 "$APP_URL" || echo "⚠️ Health check failed, but deployment completed" + for i in {1..6}; do + if curl -s -f --max-time 10 "$APP_URL" > /dev/null; then + echo "✅ Application is healthy and responding!" + break + else + echo "⏱️ Attempt $i: Application not ready yet, waiting 10 seconds..." + sleep 10 + fi + done fi - - name: Notify deployment + # Step 12: Deployment summary + - name: Deployment summary + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' run: | - echo "🎉 Deployment completed successfully!" - echo "📱 App: ${{ vars.APP_NAME || 'weather-app' }}" - echo "🐳 Image: ${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.VERSION }}" - echo "🌐 URL: https://${{ vars.APP_NAME || 'weather-app' }}.hosted.ghaymah.systems" \ No newline at end of file + echo "" + echo "🎉 DEPLOYMENT SUCCESSFUL!" + echo "================================" + echo "📱 Application: ${{ env.APP_NAME }}" + echo "🐳 Image: ${{ steps.version.outputs.IMAGE_TAG }}" + echo "🌐 URL: https://${{ env.APP_NAME }}.hosted.ghaymah.systems" + echo "🔗 Commit: ${{ github.sha }}" + echo "👤 Triggered by: ${{ github.actor }}" + echo "================================" \ No newline at end of file