175 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			YAML
		
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			YAML
		
	
	
	
name: OpenTofu Apply
 | 
						|
on:
 | 
						|
  push:
 | 
						|
    branches: [main]
 | 
						|
    paths:
 | 
						|
      - 'infrastructure/**'
 | 
						|
  workflow_dispatch:
 | 
						|
    inputs:
 | 
						|
      environment:
 | 
						|
        description: '部署环境'
 | 
						|
        required: true
 | 
						|
        default: 'dev'
 | 
						|
        type: choice
 | 
						|
        options:
 | 
						|
          - dev
 | 
						|
          - staging
 | 
						|
          - production
 | 
						|
      provider:
 | 
						|
        description: '云服务商'
 | 
						|
        required: true
 | 
						|
        default: 'oracle-cloud'
 | 
						|
        type: choice
 | 
						|
        options:
 | 
						|
          - oracle-cloud
 | 
						|
          - huawei-cloud
 | 
						|
          - google-cloud
 | 
						|
          - digitalocean
 | 
						|
          - aws
 | 
						|
 | 
						|
env:
 | 
						|
  TOFU_VERSION: "1.10.6"
 | 
						|
 | 
						|
jobs:
 | 
						|
  apply:
 | 
						|
    runs-on: ubuntu-latest
 | 
						|
    environment: ${{ github.event.inputs.environment || 'dev' }}
 | 
						|
    
 | 
						|
    steps:
 | 
						|
      - name: Checkout code
 | 
						|
        uses: actions/checkout@v4
 | 
						|
        
 | 
						|
      - name: Setup OpenTofu
 | 
						|
        uses: opentofu/setup-opentofu@v1
 | 
						|
        with:
 | 
						|
          tofu_version: ${{ env.TOFU_VERSION }}
 | 
						|
          
 | 
						|
      - name: Configure credentials
 | 
						|
        run: |
 | 
						|
          PROVIDER="${{ github.event.inputs.provider || 'oracle-cloud' }}"
 | 
						|
          echo "Setting up credentials for $PROVIDER"
 | 
						|
          
 | 
						|
          case "$PROVIDER" in
 | 
						|
            "oracle-cloud")
 | 
						|
              mkdir -p ~/.oci
 | 
						|
              echo "${{ secrets.OCI_PRIVATE_KEY }}" > ~/.oci/oci_api_key.pem
 | 
						|
              chmod 600 ~/.oci/oci_api_key.pem
 | 
						|
              ;;
 | 
						|
            "huawei-cloud")
 | 
						|
              export HW_ACCESS_KEY="${{ secrets.HW_ACCESS_KEY }}"
 | 
						|
              export HW_SECRET_KEY="${{ secrets.HW_SECRET_KEY }}"
 | 
						|
              ;;
 | 
						|
            "google-cloud")
 | 
						|
              echo "${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}" > /tmp/gcp-key.json
 | 
						|
              export GOOGLE_APPLICATION_CREDENTIALS="/tmp/gcp-key.json"
 | 
						|
              ;;
 | 
						|
            "digitalocean")
 | 
						|
              export DIGITALOCEAN_TOKEN="${{ secrets.DO_TOKEN }}"
 | 
						|
              ;;
 | 
						|
            "aws")
 | 
						|
              export AWS_ACCESS_KEY_ID="${{ secrets.AWS_ACCESS_KEY_ID }}"
 | 
						|
              export AWS_SECRET_ACCESS_KEY="${{ secrets.AWS_SECRET_ACCESS_KEY }}"
 | 
						|
              ;;
 | 
						|
          esac
 | 
						|
                    
 | 
						|
      - name: Create terraform.tfvars
 | 
						|
        run: |
 | 
						|
          ENV="${{ github.event.inputs.environment || 'dev' }}"
 | 
						|
          cd infrastructure/environments/$ENV
 | 
						|
          cat > terraform.tfvars << EOF
 | 
						|
          environment = "$ENV"
 | 
						|
          project_name = "mgmt"
 | 
						|
          owner = "ben"
 | 
						|
          
 | 
						|
          # Oracle Cloud 配置
 | 
						|
          oci_config = {
 | 
						|
            tenancy_ocid     = "${{ secrets.OCI_TENANCY_OCID }}"
 | 
						|
            user_ocid        = "${{ secrets.OCI_USER_OCID }}"
 | 
						|
            fingerprint      = "${{ secrets.OCI_FINGERPRINT }}"
 | 
						|
            private_key_path = "~/.oci/oci_api_key.pem"
 | 
						|
            region           = "ap-seoul-1"
 | 
						|
          }
 | 
						|
          
 | 
						|
          # 华为云配置
 | 
						|
          huawei_config = {
 | 
						|
            access_key = "${{ secrets.HW_ACCESS_KEY }}"
 | 
						|
            secret_key = "${{ secrets.HW_SECRET_KEY }}"
 | 
						|
            region     = "cn-north-4"
 | 
						|
          }
 | 
						|
          
 | 
						|
          # Google Cloud 配置
 | 
						|
          gcp_config = {
 | 
						|
            project_id   = "${{ secrets.GCP_PROJECT_ID }}"
 | 
						|
            region       = "asia-northeast3"
 | 
						|
            zone         = "asia-northeast3-a"
 | 
						|
            credentials  = "/tmp/gcp-key.json"
 | 
						|
          }
 | 
						|
          
 | 
						|
          # DigitalOcean 配置
 | 
						|
          do_config = {
 | 
						|
            token  = "${{ secrets.DO_TOKEN }}"
 | 
						|
            region = "sgp1"
 | 
						|
          }
 | 
						|
          
 | 
						|
          # AWS 配置
 | 
						|
          aws_config = {
 | 
						|
            access_key = "${{ secrets.AWS_ACCESS_KEY_ID }}"
 | 
						|
            secret_key = "${{ secrets.AWS_SECRET_ACCESS_KEY }}"
 | 
						|
            region     = "ap-northeast-1"
 | 
						|
          }
 | 
						|
          EOF
 | 
						|
                    
 | 
						|
      - name: OpenTofu Init
 | 
						|
        run: |
 | 
						|
          PROVIDER="${{ github.event.inputs.provider || 'oracle-cloud' }}"
 | 
						|
          cd infrastructure/providers/$PROVIDER
 | 
						|
          tofu init
 | 
						|
                    
 | 
						|
      - name: OpenTofu Plan
 | 
						|
        run: |
 | 
						|
          ENV="${{ github.event.inputs.environment || 'dev' }}"
 | 
						|
          PROVIDER="${{ github.event.inputs.provider || 'oracle-cloud' }}"
 | 
						|
          cd infrastructure/providers/$PROVIDER
 | 
						|
          tofu plan \
 | 
						|
            -var-file="../../../environments/$ENV/terraform.tfvars" \
 | 
						|
            -out=tfplan
 | 
						|
                      
 | 
						|
      - name: OpenTofu Apply
 | 
						|
        run: |
 | 
						|
          PROVIDER="${{ github.event.inputs.provider || 'oracle-cloud' }}"
 | 
						|
          cd infrastructure/providers/$PROVIDER
 | 
						|
          tofu apply -auto-approve tfplan
 | 
						|
                    
 | 
						|
      - name: Save State
 | 
						|
        run: |
 | 
						|
          ENV="${{ github.event.inputs.environment || 'dev' }}"
 | 
						|
          PROVIDER="${{ github.event.inputs.provider || 'oracle-cloud' }}"
 | 
						|
          cd infrastructure/providers/$PROVIDER
 | 
						|
          
 | 
						|
          # 这里可以配置远程状态存储
 | 
						|
          # 例如上传到 S3, GCS, 或其他存储
 | 
						|
          echo "State saved locally for now"
 | 
						|
                    
 | 
						|
      - name: Generate Inventory
 | 
						|
        run: |
 | 
						|
          ENV="${{ github.event.inputs.environment || 'dev' }}"
 | 
						|
          PROVIDER="${{ github.event.inputs.provider || 'oracle-cloud' }}"
 | 
						|
          cd infrastructure/providers/$PROVIDER
 | 
						|
          
 | 
						|
          # 生成 Ansible 动态清单
 | 
						|
          tofu output -json > ../../../configuration/inventories/$ENV/$PROVIDER-inventory.json
 | 
						|
                    
 | 
						|
      - name: Trigger Ansible Deployment
 | 
						|
        uses: actions/github-script@v7
 | 
						|
        with:
 | 
						|
          script: |
 | 
						|
            github.rest.actions.createWorkflowDispatch({
 | 
						|
              owner: context.repo.owner,
 | 
						|
              repo: context.repo.repo,
 | 
						|
              workflow_id: 'ansible-deploy.yml',
 | 
						|
              ref: 'main',
 | 
						|
              inputs: {
 | 
						|
                environment: '${{ github.event.inputs.environment || "dev" }}',
 | 
						|
                provider: '${{ github.event.inputs.provider || "oracle-cloud" }}'
 | 
						|
              }
 | 
						|
            });             |