# Batch 3: ACC Cron Services Migration to CircleCI

Migration of 2 ACC cron services from Jenkins to CircleCI pipelines.

## Services Migrated

### 1. tbi-acc-cron-service
- **Technology**: PHP 8.0 + Lumen Framework
- **Namespace**: access
- **Environments**: dev, uat
- **Version**: 7.1.6
- **Entry Point**: public/index.php
- **Base Image**: tbi-php-80:latest
- **Features**: Composer dependencies, PHPUnit tests, Lumen framework

### 2. tbi-acc-package-cron
- **Technology**: PHP 7.3 + Apache + Oracle Instant Client
- **Namespace**: access
- **Environments**: dev, prod
- **Version**: 1.4.1
- **Entry Point**: index.php
- **Base Image**: php:7.3-apache
- **Special**: Oracle Instant Client 21.1, OCI8, PDO_OCI extensions

## Migration Summary

### Files Created Per Service

Each service includes:

```
dev/[service-name]/
├── .circleci/
│   └── config.yml                    # CircleCI pipeline
├── docker/
│   └── Dockerfile                    # Docker build configuration
├── scripts/
│   ├── deploy-services.sh            # Deployment automation
│   └── setup-kubectl.sh              # kubectl setup
├── charts/[service-name]/
│   ├── Chart.yaml                    # Helm chart metadata
│   └── templates/
│       ├── deployment.yaml           # Kubernetes deployment
│       ├── service.yaml              # Kubernetes service
│       ├── secrets.yaml              # Secrets management
│       ├── ingress.yaml              # Ingress configuration
│       ├── hpa.yaml                  # Horizontal Pod Autoscaler
│       └── pdb.yaml                  # Pod Disruption Budget
└── README.md                         # Service documentation
```

## Key Differences Between Services

### tbi-acc-cron-service (PHP 8.0)
- Modern Lumen framework
- Multi-stage Docker build with Composer
- Includes lint and test job in pipeline
- Composer dependency management
- PHPUnit test suite

### tbi-acc-package-cron (PHP 7.3)
- Legacy cron scripts
- Oracle Instant Client integration
- Single-stage Docker build
- No test suite (legacy code)
- Direct PHP script execution

## CircleCI Pipeline Patterns

### tbi-acc-cron-service Pipeline
```yaml
workflows:
  build-test-deploy:
    jobs:
      - lint-and-test          # PHP 8.0, Composer, PHPUnit
      - build-and-push         # Docker build with multi-stage
      - deploy-to-k8s          # Helm deployment
```

### tbi-acc-package-cron Pipeline
```yaml
workflows:
  build-deploy:
    jobs:
      - build-and-push         # Docker build with Oracle client
      - deploy-to-k8s          # Helm deployment
```

## Docker Build Strategies

### PHP 8.0 Lumen (Multi-stage)
```dockerfile
# Stage 1: Composer dependencies
FROM composer:2.3.7 AS composer
COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist

# Stage 2: Production image
FROM tbi-php-80:latest
COPY --from=composer /app /data/websites/
CMD ["php", "public/index.php"]
```

### PHP 7.3 Oracle (Single-stage)
```dockerfile
FROM php:7.3-apache

# Install Oracle Instant Client
RUN curl -O oracle-client.zip && unzip && configure

# Install PHP extensions
RUN pecl install oci8-2.2.0
RUN docker-php-ext-install pdo_oci mysqli

CMD ["apache2-foreground"]
```

## Environment Configuration

### tbi-acc-cron-service
- **dev**: AWS dev account, dev cluster
- **uat**: AWS dev account, uat cluster

### tbi-acc-package-cron
- **dev**: AWS dev account, dev cluster
- **prod**: AWS prod account, tbi-prod cluster

## Required CircleCI Contexts

### aws-dev (for dev/uat)
- AWS_ACCOUNT_ID: 594765360358
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- CLUSTER_NAME: dev or uat
- GITHUB_TOKEN

### aws-prod (for prod)
- AWS_ACCOUNT_ID: 489176460030
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- CLUSTER_NAME: tbi-prod
- GITHUB_TOKEN

## Next Steps

### For tbi-acc-cron-service

1. **Copy files to service repository**:
```bash
cd ~/Desktop/git-code/tbi-code/tbi-acc-cron-service
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-cron-service/.circleci .
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-cron-service/docker .
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-cron-service/scripts .
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-cron-service/charts .
```

2. **Commit and push**:
```bash
git checkout -b circleci-migration
git add .circleci/ docker/ scripts/ charts/
git commit -m "Add CircleCI pipeline configuration

- Add CircleCI config with lint, test, build, and deploy jobs
- Add multi-stage Dockerfile for PHP 8.0 Lumen
- Add deployment scripts for dev and uat environments
- Add Helm charts for Kubernetes deployment
"
git push origin circleci-migration
```

3. **Create values and secrets in tbi-environments**:
```bash
cd ~/Desktop/git-code/tbi-code/tbi-environments

# Create dev values
cat > dev/values/tbi-acc-cron-service.yaml << 'EOF'
name: tbi-acc-cron-service
ingress_enabled: false
image: IMAGE_TO_REPLACE
group: access
node_env: development
port: 80
targetPort: 8000
replicaCount: 1

resources:
  requests:
    memory: "256Mi"
    cpu: "100m"
  limits:
    memory: "512Mi"
    cpu: "500m"

autoscaling:
  minReplicas: 1
  maxReplicas: 3
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 70

pdb:
  minAvailable: 1
EOF

# Create uat values
cp dev/values/tbi-acc-cron-service.yaml uat/values/tbi-acc-cron-service.yaml
sed -i '' 's/node_env: development/node_env: uat/' uat/values/tbi-acc-cron-service.yaml

# Create dev secrets (encrypted with SOPS)
cat > dev/secrets/secrets.tbi-acc-cron-service.yaml << 'EOF'
configs:
    APP_ENV: development
    APP_DEBUG: "true"
    # Add your environment variables here
EOF

# Encrypt secrets
sops -e -i dev/secrets/secrets.tbi-acc-cron-service.yaml

# Create uat secrets
cp dev/secrets/secrets.tbi-acc-cron-service.yaml uat/secrets/
sops -d dev/secrets/secrets.tbi-acc-cron-service.yaml | \
  sed 's/development/uat/' | \
  sops -e /dev/stdin > uat/secrets/secrets.tbi-acc-cron-service.yaml

# Update requirements.yaml
echo "  - name: tbi-acc-cron-service
    version: 7.1.6
    repository: https://tbi-charts.s3.amazonaws.com" >> dev/requirements.yaml

echo "  - name: tbi-acc-cron-service
    version: 7.1.6
    repository: https://tbi-charts.s3.amazonaws.com" >> uat/requirements.yaml

git add dev/values/tbi-acc-cron-service.yaml
git add uat/values/tbi-acc-cron-service.yaml
git add dev/secrets/secrets.tbi-acc-cron-service.yaml
git add uat/secrets/secrets.tbi-acc-cron-service.yaml
git add dev/requirements.yaml uat/requirements.yaml
git commit -m "Add tbi-acc-cron-service configuration for dev and uat"
git push origin master
```

### For tbi-acc-package-cron

1. **Copy files to service repository**:
```bash
cd ~/Desktop/git-code/tbi-code/tbi-acc-package-cron
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-package-cron/.circleci .
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-package-cron/docker .
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-package-cron/scripts .
cp -r ~/Desktop/git-code/tbi-code/tbi-devops-environments/dev/tbi-acc-package-cron/charts .
```

2. **Commit and push**:
```bash
git checkout -b circleci-migration
git add .circleci/ docker/ scripts/ charts/
git commit -m "Add CircleCI pipeline configuration

- Add CircleCI config with build and deploy jobs
- Add Dockerfile with PHP 7.3 and Oracle Instant Client 21.1
- Add deployment scripts for dev and prod environments
- Add Helm charts for Kubernetes deployment
"
git push origin circleci-migration
```

3. **Create values and secrets in tbi-environments**:
```bash
cd ~/Desktop/git-code/tbi-code/tbi-environments

# Create dev values
cat > dev/values/tbi-acc-package-cron.yaml << 'EOF'
name: tbi-acc-package-cron
ingress_enabled: false
image: IMAGE_TO_REPLACE
group: access
node_env: development
port: 80
targetPort: 80
replicaCount: 1

resources:
  requests:
    memory: "512Mi"
    cpu: "200m"
  limits:
    memory: "1Gi"
    cpu: "1000m"

autoscaling:
  minReplicas: 1
  maxReplicas: 2
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 70

pdb:
  minAvailable: 1
EOF

# Create prod values
cp dev/values/tbi-acc-package-cron.yaml prod/values/tbi-acc-package-cron.yaml
sed -i '' 's/node_env: development/node_env: production/' prod/values/tbi-acc-package-cron.yaml

# Create dev secrets (encrypted with SOPS)
cat > dev/secrets/secrets.tbi-acc-package-cron.yaml << 'EOF'
configs:
    ORACLE_HOST: oracle-host
    ORACLE_PORT: "1521"
    ORACLE_SID: ORCL
    ORACLE_USER: username
    ORACLE_PASSWORD: password
    # Add your Oracle and other environment variables here
EOF

# Encrypt secrets
sops -e -i dev/secrets/secrets.tbi-acc-package-cron.yaml

# Create prod secrets
cp dev/secrets/secrets.tbi-acc-package-cron.yaml prod/secrets/
# Update prod secrets with production values and re-encrypt

# Update requirements.yaml
echo "  - name: tbi-acc-package-cron
    version: 1.4.1
    repository: https://tbi-charts.s3.amazonaws.com" >> dev/requirements.yaml

echo "  - name: tbi-acc-package-cron
    version: 1.4.1
    repository: https://tbi-charts.s3.amazonaws.com" >> prod/requirements.yaml

git add dev/values/tbi-acc-package-cron.yaml
git add prod/values/tbi-acc-package-cron.yaml
git add dev/secrets/secrets.tbi-acc-package-cron.yaml
git add prod/secrets/secrets.tbi-acc-package-cron.yaml
git add dev/requirements.yaml prod/requirements.yaml
git commit -m "Add tbi-acc-package-cron configuration for dev and prod"
git push origin master
```

## Testing the Pipelines

### tbi-acc-cron-service
1. Merge PR to dev branch
2. CircleCI will: lint → test → build → deploy to dev
3. Verify deployment: `kubectl get pods -n access | grep tbi-acc-cron-service`
4. Merge to uat branch for UAT deployment

### tbi-acc-package-cron
1. Merge PR to dev branch
2. CircleCI will: build → deploy to dev
3. Verify deployment: `kubectl get pods -n access | grep tbi-acc-package-cron`
4. Merge to prod branch for production deployment

## Verification Commands

```bash
# Check pod status
kubectl get pods -n access -l app=tbi-acc-cron-service
kubectl get pods -n access -l app=tbi-acc-package-cron

# Check deployment
kubectl describe deployment tbi-acc-cron-service -n access
kubectl describe deployment tbi-acc-package-cron -n access

# Check logs
kubectl logs -n access -l app=tbi-acc-cron-service --tail=100
kubectl logs -n access -l app=tbi-acc-package-cron --tail=100

# Check Helm release
helm list -n access | grep tbi-acc
```

## Rollback Procedure

If issues occur:

```bash
# Rollback to previous version
helm rollback tbi-acc-cron-service -n access
helm rollback tbi-acc-package-cron -n access

# Or deploy specific version
helm upgrade --install tbi-acc-cron-service \
  tbi-charts/tbi-acc-cron-service \
  --version 7.1.6-previous-build \
  -n access
```

## Migration Checklist

- [x] Create CircleCI pipeline configurations
- [x] Create Dockerfiles with appropriate base images
- [x] Create deployment scripts
- [x] Create Helm charts
- [x] Create service documentation
- [ ] Copy files to service repositories
- [ ] Create values and secrets in tbi-environments
- [ ] Test dev deployments
- [ ] Test uat/prod deployments
- [ ] Update Jenkins to disable old pipelines
- [ ] Monitor production deployments

## Notes

- **tbi-acc-cron-service** uses PHP 8.0 with modern Lumen framework
- **tbi-acc-package-cron** requires PHP 7.3 for Oracle Instant Client compatibility
- Both services deploy to the `access` namespace
- Oracle client installation adds ~500MB to image size
- Consider upgrading tbi-acc-package-cron to PHP 8.x in future (requires Oracle client update)

## Support

For issues or questions:
- CircleCI: Check pipeline logs in CircleCI dashboard
- Kubernetes: Check pod logs and events
- Helm: Check release status and history
- Contact DevOps team for assistance
