写点什么

GenDev 智能开发:Amazon Q Developer CLI 赋能 Jenkins 实现智能代码审核

  • 2025-07-02
    山东
  • 本文字数:6721 字

    阅读完需:约 22 分钟

前言

在现代软件开发中,自动化工具对于提高代码质量和开发效率至关重要。本文将介绍如何结合 Jenkins 和 Amazon Q Developer 构建自动化代码审核系统,为开发团队提供更高效的质量保障方案。

📢限时插播:Amazon Q Developer 来帮你做应用啦!

🌟10 分钟帮你构建智能番茄钟应用,1 小时搞定新功能拓展、测试优化、文档注程和部署

⏩快快点击进入《Agentic Al 帮你做应用 -- 从0到1打造自己的智能番茄钟》实验

免费体验企业级 AI 开发工具的真实效果吧

构建无限,探索启程!

Jenkins 作为广受欢迎的开源自动化服务器,凭借其强大的插件生态系统和灵活的配置能力,已成为 CI/CD 流程的核心工具。它能够自动执行构建、测试和部署等任务,与各种开发工具无缝集成。

Amazon Q Developer 是亚马逊云科技推出的 AI 驱动代码助手,能够智能分析代码,识别潜在问题,并提供改进建议。它不仅可以检测安全漏洞和性能瓶颈,还能确保代码符合最佳实践和团队规范。

通过整合这两款强大工具,我们可以在代码提交后自动触发全面的代码分析,帮助团队及早发现并解决问题,从而提升软件质量,加速开发流程。

如下图,在使用 Amazon Q Developer 构建企业自动化代码审核流程这篇博客中,我们已经介绍了 Gitlab CICD 与 Amazon Q Developer 的整合。从此架构图可以看出 Gitlab CI/CD 中的诸多概念和组件和 Jenkins 是类似的,Gitlab CI/CD 和 Jenkins CI/CD 可以复用同一个 Docker Image 完成 AI 代码审核。接下来我们将详细介绍如何结合 Jenkins 和 Amazon Q Developer 实现自动化代码审核。

1. 基础环境搭建

1.1 前提条件

  • 亚马逊云科技账户已启用 Amazon Q Developer

  • Git 代码仓库,本文采用 EC2 私有化部署 GitLab 以方便测试

  • Jenkins Server,采用 EC2 部署

  • 独立的 EC2 注册为 Jenkins Agent

  • S3 桶用于存储试验中需要的文件

注意:

  1. 本文使用的 EC2 实例皆为 t 系列性能突发实例,该实例仅适合用于测试,不能用于生产环境。

  2. 本文启动的服务皆采用 HTTP,生产环境中需要自行启用 HTTPS

1.2 Gitlab Server 搭建

配置:t3.large + 20 GB EBS(注意 Gitlab server 需要至少 8GB 运行内存,否则会有性能问题)

EC2 Usercode:

#!/bin/bashcd /rootdnf install docker -ysystemctl start dockersystemctl enable docker# 等待10s以使实例元数据服务可用sleep 10# 获取tokenTOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/  # 获取public dns namePUBLIC_HOSTNAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-hostname)# 运行GitLab容器,使用获取到的公共主机名docker run --detach \  --hostname gitlab.example.com \  --env GITLAB_OMNIBUS_CONFIG="external_url 'http://$PUBLIC_HOSTNAME'" \  --publish 443:443 --publish 80:80 --publish 122:22 \  --name gitlab \  --restart always \  --volume /srv/gitlab/config:/etc/gitlab \  --volume /srv/gitlab/logs:/var/log/gitlab \  --volume /srv/gitlab/data:/var/opt/gitlab \  --shm-size 256m \  gitlab/gitlab-ce:latest
复制代码

首次运行需要解锁(user 为 root):

sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
复制代码

在 gitlab server 中创建一个空的 project

1.3 Jenkins Server 搭建

配置:t3.medium + 20 GB EBS

EC2 Usercode:

#!/bin/bashcd /rootdnf install docker -ysystemctl start dockersystemctl enable docker
# docker 部署jenkins, 绑定host 80端口docker run -d \ --name jenkins \ -p 80:8080 \ -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ --restart=always \ jenkins/jenkins:lts
复制代码

首次访问需要解锁 Jenkins,运行以下命令获取初始管理员密码(user 为 root):

sudo docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
复制代码

注意:在 Jenkins Server 首次启动时选择安装推荐 plugin,在安装完成后只需手动安装一个额外的 Jenkins plugin: Gitlab plugin。

1.4 Jenkins Agent 搭建

配置:t3.medium,20 GB EBS

EC2 IAM role 需要包含的 policy:

AmazonS3FullAccessAmazonEC2ContainerRegistryFullAccess//本文采用SSM登陆EC2, 如采用ssh登陆也可省略此policyAmazonSSMManagedInstanceCore
复制代码

Userdata:

#!/bin/bashcd /root# 安装dockerdnf updatednf install docker -ysystemctl enable dockersystemctl start docker# 安装javadnf install java-17-amazon-corretto -y# 安装gitdnf install git -y# 创建目录mkdir jenkins
复制代码

1.5 构建 reviewer docker image 并上传到 private ECR

dockerfile:

# 基于Ubuntu 22.04FROM ubuntu:22.04# 避免交互式提示ENV DEBIAN_FRONTEND=noninteractive# 安装必要的软件包RUN apt-get update && \    apt-get install -y \    curl \    git \    jq \    python3 \    python3-pip \    apt-transport-https \    ca-certificates \    gnupg \    lsb-release \    software-properties-common \    sudo && \    rm -rf /var/lib/apt/lists/*# 安装AWS CLIRUN pip3 install --no-cache-dir awscli requests# 安装Amazon Q CLIRUN curl --proto '=https' --tlsv1.2 -sSf https://desktop-release.q.us-east-1.amazonaws.com/latest/amazon-q.deb -o amazon-q.deb && \    apt-get update && \    apt-get install -y ./amazon-q.deb && \    rm amazon-q.deb && \    rm -rf /var/lib/apt/lists/*
复制代码

按照以上 dockerfile 构建 docker image 并上传到 private ECR

#<123456789012>替换为自己的account IDdocker build -t amazon-test-image#登陆docker container进行测试, 退出容器自动删除docker run -it --rm amazon-test-image bash# 登录到 ECRaws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <123456789012>.dkr.ecr.us-east-1.amazonaws.com# 创建仓库aws ecr create-repository --repository-name my-app --region us-east-1# 标记镜像docker tag my-app:latest <123456789012>.dkr.ecr.us-east-1.amazonaws.com/my-app:latest# 推送镜像docker push <123456789012>.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
复制代码

1.6 S3 存储桶

主要分为两个 S3 存储桶:

  1. 存储 Amazon Q Developer CLI 的凭据,参考使用 Amazon Q Developer 构建企业自动化代码审核流程 2.3.1

  2. 存储代码审核要求文件以及 py,Amazon Q Developer CLI 会读取审核要求以及运行此 python 脚本推送审核报告到 Gitlab [代码仓库]

2. 配置 Jenkins Agent 和 Pipeline script

2.1 注册 EC2 为 Jenkins Agent

在 Jenkins 控制台选择创建 Node,如下图:

Node 配置参数可以按照下图进行配置,其中 Labels 中多个 label 用空格区分:

配置连接,点击已创建的 Node,选中 Status,按照提示在 Jenkins Agent EC2 上运行如下命令:

注意测试时后台运行 agent.jar 或将其注册为 linux 服务:

nohup java -jar agent.jar -url http://ec2-11-111-11-111.ap-northeast-1.compute.amazonaws.com/ -secret {your secret} -name "jenkins-agent01" -webSocket -workDir "/root/jenkins" &
复制代码

Jenkins Agent 连接成功,则会显示如下状态:

2.2 配置 Pipeline script

在 Jenkins 主页面左侧点击 New Item,创建 Pipeline

其中 Triggers 部分需要配置 gitlab webhook trigger,如下图进行配置:

Pipeline 部分填入如下 script,注意将 {your region} 和 {your account id} 替换为自己的:

pipeline {    agent {        label 'amazon-q && ubuntu && docker'    }        environment {        # 这里的credential kind全部为 secret text        AMAZON_Q_S3_URI = credentials('amazon_q_s3_uri')        REVIEW_RULES_S3_URI = credentials('review_rules_s3_uri')        # 这里创建credential时不选择 gitlab api token 类型, 有bug        GITLAB_API_TOKEN = credentials('gitlab_api_token')        REGION = '{your region}'        ACCOUNT_ID = '{your account id}'        IMAGE = '{REGION}.dkr.ecr.{ACCOUNT_ID}.amazonaws.com/gendev/qdc:qdc-executor'    }        stages {        stage('Docker Login') {            steps {                sh "aws ecr get-login-password --region {REGION} | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com"                sh 'env | sort'            }        }                stage('Review') {            agent {                docker {                    image "${IMAGE}"                    reuseNode true                }            }                         when {                    expression {                        //opened, approved                        return env.gitlabActionType == "MERGE" && env.gitlabMergeRequestState == "opened"                    }            }                        steps {                script {                    // 定义 Amazon Q 提示                    def PROMPT = '''你是一个代码审核助手,以下文件中包含代码审核规则improve_rules/improved_code_review_standards_part1.md - 包含一般原则、代码审查流程和检查清单的第一部分(代码风格和代码质量)improve_rules/improved_code_review_standards_part2.md - 包含功能实现、安全性和性能部分improve_rules/improved_code_review_standards_part3.md - 包含测试、日志记录、可维护性和特定场景,如并发、事务、幂等性和远程调用improve_rules/improved_code_review_standards_part4.md - 包含语言特定的检查点、中间件使用指南、通信指南、工具推荐和持续改进请审核changes.txt中的修改,但不要直接修改文件,以中文输出,并参考improve_rules/llm_code_review_feedback_format.md中的推荐格式进行输出至文件amazon_q_review.md中。完成后,请检查amazon_q_review.md确保所需内容完整。审核完成后运行python3脚本jenkins_put_comment.py将审核结果添加到merge comment中,运行完成后回复完成,不需要对任务做总结,运行过程中不要修改任何文件。然后退出运行q cli'''                                        // 输出调试信息                    echo "GitLab Merge Request ID: ${env.gitlabMergeRequestIid}"                    echo "Target Branch: ${env.gitlabTargetBranch}"                    echo "Source Branch: ${env.gitlabSourceBranch}"                                        // 确保代码已检出                    checkout([                        $class: 'GitSCM',                        branches: [[name: "*/${env.gitlabSourceBranch}"]],                        userRemoteConfigs: [[                            url: "${env.gitlabSourceRepoHttpUrl}",                            credentialsId: 'gitlab_api_token'                    ]]])                                        // 获取变更文件列表                    sh "git fetch --all --prune"                    sh "touch changes.txt"                    sh "git diff --name-only origin/${env.gitlabTargetBranch} origin/${env.gitlabSourceBranch} > changes.txt || echo 'No changes detected' > changes.txt"                                        // 从 S3 同步 Amazon Q 配置和审核规则                    // 直接使用 EC2 实例的 IAM 角色权限                    sh "aws s3 sync ${AMAZON_Q_S3_URI} ~/.local/share/amazon-q"                    sh "aws s3 sync ${REVIEW_RULES_S3_URI} ."                                        // 运行 Amazon Q 代码审核                    sh "ls -l ~/.local/share/amazon-q"                    sh "echo '/help' | q chat"                    sh "q chat -a -- '${PROMPT}'"                                        // 重命名审核报告                    sh "mv amazon_q_review.md amazon_q_review_${env.BUILD_NUMBER}.md"                                    }            }        }    }}
复制代码

3. Gitlab 与 Jenkins 连通

3.1 配置 Gitlab 到 Jenkins 的 Authentication(触发外部 webhook)

Jenkins:在 Jenkins user security 中新建 API token,记录此 API token

Gitlab:在 Gitlab Settings 中选择 Webhooks,选择 AddNew

URL 部分按照如下格式填写:

https://USERID:APITOKEN@JENKINS_URL/project/YOUR_JOB

示例:

http://root:{Jenkins_API_Token}@ec2-11-111-11-111.{Your region}.compute.amazonaws.com/project/code-review

Webhooks trigger 部分勾选 Merge request events,本测试没有使用 HTTPS,因此底部取消 Enable SSL verification。

底部 Save changes 右侧可以进行 Test,但测试 Merge request events 需要有已创建的 Merge request。

注意,如果测试中出现报错 Url is blocked: Requests to the local network are not allowed

  1. 进入 Admin Area > Settings > Network

  2. 展开 “Outbound requests” 部分

  3. 勾选 “Allow requests to the local network from web hooks and services”

  4. 保存设置

3.2 配置 Jenkins 到 Gitlab 的 Authentication

Gitlab:在 Project 底部 Settings 中选择 Access tokens,点击 Add new token。注意,role 不能选择 Guest,否则会缺乏调用 merge request api 的相关权限。scope 选中 api 即可。创建完成后,复制此 Access token。此 token 主要是用于 Jenkins Agent 完成代码审核后给 gitlab server 发送 api request,以添加 merge request 评论。

Jenkins:在主界面中选中 Manage Jenkins — Credentials 选中 Domain,并创建三个 new credentials,如下图:

注意三个 credential 的 kind 都是 Secret text,即使是 gitlab_api_token 也不要选择 Gitlab API token,此类型有 bug。

另外两个 S3 uri 为步骤 1.6 所配置的存储桶 uri。

4. 测试自动化代码审核

所有环境准备就绪,开始测试自动化代码审核。

可以准备任意代码项目 git push 到 gitlab server,执行 New Merge Request。

此时在 Jenkins 控制台上可以看到 code-review 这个 job 已经被触发,通过 Console Output 可以观察到 Jenkins Agent 的执行日志。

等待一小段时间后,Jenkins 代码审核 pipeline 执行完毕,在 Gitlab merge request 上可以看到自动添加的评论报告。至此测试完成。

5. 总结与展望

在本文中,我们详细介绍了如何将 Amazon Q Developer CLI 与 Jenkins 集成,实现智能化的代码审核流程。通过这种整合,开发团队可以在持续集成与持续部署过程中获得 AI 驱动的代码质量反馈,提升代码可靠性并加速开发周期。

我们的探索并不止步于此。目前,我们已成功将 Amazon Q Developer 与 GitLab CI/CD 和 Jenkins CI/CD 平台整合,为开发者提供了多样化的智能开发选择。随着 CI/CD 领域的不断发展,新兴工具如 Flux CD、Argo CD 和 Harness CD 等专注于 GitOps 模式的 CD 工具正逐渐获得市场认可。

未来,我们将持续探索 Amazon Q Developer 与这些先进 CI/CD 工具的整合方案,致力于将 AI 能力深度融入软件开发全生命周期。通过这些努力,我们期望帮助开发团队构建更高效、更可靠的软件交付流程,充分释放 AI 赋能软件开发的潜力。

参考文档

  1. 使用 Amazon Q Developer 构建企业自动化代码审核流程

  2. Gitlab Plugin for Jenkins Configuration

  3. Automating Code Reviews with Amazon Q and GitHub Actions

*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

本篇作者


本期最新实验为《Agentic AI 帮你做应用 —— 从0到1打造自己的智能番茄钟

✨ 自然语言玩转命令行,10 分钟帮你构建应用,1 小时搞定新功能拓展、测试优化、文档注释和部署

💪 免费体验企业级 AI 开发工具,质量+安全全掌控

⏩️[点击进入实验] 即刻开启 AI 开发之旅

构建无限, 探索启程!

用户头像

还未添加个人签名 2019-09-17 加入

进入亚马逊云科技开发者网站,请锁定 https://dev.amazoncloud.cn 帮助开发者学习成长、交流,链接全球资源,助力开发者成功。

评论

发布
暂无评论
GenDev 智能开发:Amazon Q Developer CLI 赋能 Jenkins 实现智能代码审核_亚马逊云科技 (Amazon Web Services)_InfoQ写作社区