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 }}"
关键注意事项
- 在GitHub Secrets中添加
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,对应IAM用户需拥有codebuild:StartBuild权限。 - CodeBuild项目需配置GitHub作为源代码提供商,并授权访问目标仓库。
- CodeBuild构建环境选择Ubuntu,Java版本指定Corretto 17(与原工作流一致)。
- 若需加速构建,可在CodeBuild项目配置中开启S3缓存,配合Buildspec中的缓存路径生效。
内容的提问来源于stack exchange,提问作者Kavi
相关产品推荐
相关产品推荐

