You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub与AWS CodeBuild集成:复用GitHub Secrets的Buildspec配置

问题背景

我的项目及测试用例存储于GitHub仓库,已创建test.yaml工作流文件,开发者向main分支推送代码或创建PR时,会触发GitHub Actions执行测试。但依赖AWS托管数据库的端到端(E2E)测试场景无法通过,因此计划创建AWS CodeBuild项目并与GitHub集成,在AWS环境中运行测试。

核心疑问

所有密钥和变量均存储在GitHub Secrets中,不想在AWS Secrets Manager中重复创建,能否直接复用?请指导编写AWS Buildspec.yaml文件?

当前GitHub Actions的test.yaml配置(基于Gradle)

name: Karate Test Workflow

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up Java
        uses: actions/setup-java@v1
        with:
          java-version: '17'

      - name: Cache Gradle packages
        uses: actions/cache@v2
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: ${{ runner.os }}-gradle

      - name: Grant execute permission for gradlew
        run: chmod +x karatetest/gradlew

      - name: Build and run Karate tests
        working-directory: ./karatetest
        env:
          KARATE_OPTIONS: ${{ vars.KARATE_OPTIONS }}
          KARATE_ENV: ${{ vars.ENV }}
          TEST_API_URL: ${{ secrets.APIURL }}
          CONNECT_TIMEOUT: ${{ vars.CONNECT_TIMEOUT }}
          READ_TIMEOUT: ${{ vars.KARATE_READTIMEOUT }}
          RETRY_COUNT: ${{ vars.KARATE_RETRYCOUNT }}
          RETRY_INTERVAL: ${{vars.RETRYINTERVAL }}
          TEST_USERNAME: ${{ secrets.DATAINGEST_DB_USERNAME }}
          TEST_PASSWORD: ${{ secrets.DATAINGEST_DB_PASSWORD }}
          TEST_URL: ${{ secrets.DATAINGEST_SERVER_URL }}
          TEST_DRIVER_CLASS_NAME: ${{ secrets.DRIVERCLASSNAME }}
          TEST_BOOTSTRAP_SERVERS: ${{ secrets.KAFKA_SERVER }}
          TEST_GROUP_ID: ${{ vars.GROUPID }}
          TEST_API_USERNAME: ${{ secrets.API_USERNAME }}
          TEST_API_PASSWORD: ${{ secrets.API_PASSWORD }}
          TEST_NBS_URL: ${{ vars.NBS_URL }}
          TEST_WRONGAPIURL: ${{ secrets.WRONGAPIURL }}
        run: |
          ./gradlew test \
            -Dkarate.options="$KARATE_OPTIONS" \
            -Dkarate.env="$KARATE_ENV" \
            -Dtest.apiurl="$TEST_API_URL" \
            -DconnectTimeout="$CONNECT_TIMEOUT" \
            -DreadTimeout="$READ_TIMEOUT" \
            -DretryCount="$RETRY_COUNT" \
            -DretryInterval="$RETRY_INTERVAL" \
            -Dtest.username="$TEST_USERNAME" \
            -Dtest.password="$TEST_PASSWORD" \
            -Dtest.url="$TEST_URL" \
            -Dtest.driverClassName="$TEST_DRIVER_CLASS_NAME" \
            -Dtest.bootstrapServers="$TEST_BOOTSTRAP_SERVERS" \
            -Dtest.groupId="$TEST_GROUP_ID" \
            -Dtest.apiusername="$TEST_API_USERNAME" \
            -Dtest.apipassword="$TEST_API_PASSWORD" \
            -Dtest.nbsurl="$TEST_NBS_URL" \
            -Dtest.wrongapiurl="$TEST_WRONGAPIURL"

      - name: Upload Karate Test Report
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: karate-report
          retention-days: 1
          path: |
           ./karatetest/build/cucumber-html-reports/
           ./karatetest/build/karate-reports

解决方案

能否复用GitHub Secrets?

可以直接复用,但需通过GitHub Actions触发AWS CodeBuild的方式传递Secrets和变量——CodeBuild本身无法直接读取GitHub Secrets,因此需要由GitHub Actions先读取自身的Secrets/变量,再传递给CodeBuild执行。

适配的AWS Buildspec.yaml文件

以下是匹配你现有Gradle测试流程的Buildspec.yaml,核心覆盖环境变量配置、依赖准备、测试执行及报告生成:

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto17
    commands:
      # 给gradlew添加执行权限
      - chmod +x karatetest/gradlew

  pre_build:
    commands:
      # 提示缓存Gradle依赖(需配合CodeBuild缓存配置生效)
      - echo "Preparing Gradle cache..."
      - mkdir -p ~/.gradle/caches

  build:
    commands:
      - cd karatetest
      - ./gradlew test \
          -Dkarate.options="$KARATE_OPTIONS" \
          -Dkarate.env="$KARATE_ENV" \
          -Dtest.apiurl="$TEST_API_URL" \
          -DconnectTimeout="$CONNECT_TIMEOUT" \
          -DreadTimeout="$READ_TIMEOUT" \
          -DretryCount="$RETRY_COUNT" \
          -DretryInterval="$RETRY_INTERVAL" \
          -Dtest.username="$TEST_USERNAME" \
          -Dtest.password="$TEST_PASSWORD" \
          -Dtest.url="$TEST_URL" \
          -Dtest.driverClassName="$TEST_DRIVER_CLASS_NAME" \
          -Dtest.bootstrapServers="$TEST_BOOTSTRAP_SERVERS" \
          -Dtest.groupId="$TEST_GROUP_ID" \
          -Dtest.apiusername="$TEST_API_USERNAME" \
          -Dtest.apipassword="$TEST_API_PASSWORD" \
          -Dtest.nbsurl="$TEST_NBS_URL" \
          -Dtest.wrongapiurl="$TEST_WRONGAPIURL"

artifacts:
  # 上传测试报告到CodeBuild工件存储
  files:
    - karatetest/build/cucumber-html-reports/**/*
    - karatetest/build/karate-reports/**/*
  discard-paths: no

cache:
  paths:
    - ~/.gradle/caches/**/*

调整GitHub Actions工作流,触发CodeBuild并传递变量

修改原test.yaml,将测试步骤替换为触发CodeBuild的逻辑,同时传递所有Secrets和变量:

name: Karate Test Workflow

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  trigger-codebuild:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: your-aws-region # 替换为你的AWS区域,如us-east-1

      - name: Trigger AWS CodeBuild
        run: |
          aws codebuild start-build \
            --project-name your-codebuild-project-name \ # 替换为你的CodeBuild项目名
            --environment-variables-override \
              name=KARATE_OPTIONS,value="${{ vars.KARATE_OPTIONS }}" \
              name=KARATE_ENV,value="${{ vars.ENV }}" \
              name=TEST_API_URL,value="${{ secrets.APIURL }}" \
              name=CONNECT_TIMEOUT,value="${{ vars.CONNECT_TIMEOUT }}" \
              name=READ_TIMEOUT,value="${{ vars.KARATE_READTIMEOUT }}" \
              name=RETRY_COUNT,value="${{ vars.KARATE_RETRYCOUNT }}" \
              name=RETRY_INTERVAL,value="${{ vars.RETRYINTERVAL }}" \
              name=TEST_USERNAME,value="${{ secrets.DATAINGEST_DB_USERNAME }}" \
              name=TEST_PASSWORD,value="${{ secrets.DATAINGEST_DB_PASSWORD }}" \
              name=TEST_URL,value="${{ secrets.DATAINGEST_SERVER_URL }}" \
              name=TEST_DRIVER_CLASS_NAME,value="${{ secrets.DRIVERCLASSNAME }}" \
              name=TEST_BOOTSTRAP_SERVERS,value="${{ secrets.KAFKA_SERVER }}" \
              name=TEST_GROUP_ID,value="${{ vars.GROUPID }}" \
              name=TEST_API_USERNAME,value="${{ secrets.API_USERNAME }}" \
              name=TEST_API_PASSWORD,value="${{ secrets.API_PASSWORD }}" \
              name=TEST_NBS_URL,value="${{ vars.NBS_URL }}" \
              name=TEST_WRONGAPIURL,value="${{ secrets.WRONGAPIURL }}"

关键注意事项

  1. 在GitHub Secrets中添加AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,对应IAM用户需拥有codebuild:StartBuild权限。
  2. CodeBuild项目需配置GitHub作为源代码提供商,并授权访问目标仓库。
  3. CodeBuild构建环境选择Ubuntu,Java版本指定Corretto 17(与原工作流一致)。
  4. 若需加速构建,可在CodeBuild项目配置中开启S3缓存,配合Buildspec中的缓存路径生效。

内容的提问来源于stack exchange,提问作者Kavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:35:02