当前位置: 首页 > news >正文

aws codepipeline + github + sonarqube + jenkins实践CI/CD

https://blog.csdn.net/u011564831/article/details/144007981文章浏览阅读1.2k次,点赞31次,收藏21次。本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流,用于自动化发布已经部署 lambda 函数。在 AWS 海外区,CI/CD 工作流可以用 codepipeline 这项产品来方便的实现,由于中国区暂时未发布此款产品,此文采用做替代方案管理 CICD 工作流。本文在此所涵盖的所有产品在中国区都可以使用。_aws github cicdhttps://blog.csdn.net/u011564831/article/details/144007981

在上次使用jenkins 作为webhook中间组件响应 github push event实现简单的lambda 函数部署以后,这次要实现springboot后端和vue前端测试用例的代码静态检查后ECS部署

准备工作

使用下面规制的EC2
t3.large   作为Jenkins的EC2
t2.medium    作为sonar的EC2

安装jdk命令

# 卸载命令
sudo dnf remove java-17-amazon-corretto -y
sudo dnf clean all

# 安装命令
sudo dnf install java-17-amazon-corretto -y

# 查看JAVA_HOME
sudo alternatives --config java

jenkins的机器上需要安装git

yum install git -y

还需要安装的插件

SonarQube Scanner
Github
NodeJS

在jenkins机器上配置AAK 和ASA

Text plain
region = ap-xx-2
output = json
aws_access_key_id = xx
aws_secret_access_key = xx

利用本地跳板机进行文件上传,下面是一个例子方便操作

Text plain
IP_ADDRESS='43.200.129.240'   #后面替换为自己的地址
PEM_FILE='jenkins.pem'  #替换为自己的pem文件路径
scp -i $PEM_FILE -r $YOUR_FILES ec2-user@$IP_ADDRESS:/home/ec2-user/

使用 RDS 启动mysql 5.7 (两小时1美金稍贵,自己练习推荐EC2安装mysql

sonar机器上安装sonarqube,使用docker方式

在sonarqube准备的t2.medium 机器上,执行下面命令

# 安装docker
yum install docker -y
systemctl enable docker
systemctl start  docker

# 拉取镜像, 使用jdk1.8的版本
docker pull sonarqube:7.9.6-community

创建持久化卷,用来存储docker下持久化数据,防止丢失

//创建卷,不要使用直接挂载的方式。直接使用挂载会导致安装的插件不可用
docker volume create --name sonarqube_data
docker volume create --name sonarqube_logs
docker volume create --name sonarqube_extensions
//用于挂载以创建的卷
mkdir -p /usr/sonar/conf
mkdir -p /usr/sonar/data
mkdir -p /usr/sonar/logs
mkdir -p /usr/sonar/extensions

启动SonarQube


docker run -d --name sonarqube \
    -p 9000:9000 \
    -v sonarqube_data:/usr/sonar/data \
    -v sonarqube_extensions:/usr/sonar/extensions \
    -v sonarqube_logs:/usr/sonar/logs \
    -v /opt/sonarqube/conf:/usr/sonar/ \
    sonarqube:7.9.6-community

访问9000端口看到sonar_qube页面

jenkins机器上配置maven

需要使用mvn来编译jar

 在Jenkins EC2机器上配置mvn, 下载地址Download Apache Maven – Maven

apache-maven-3.8.8-bin.zip 解压重命名到/usr/local/maven路径,配置~/.bashrc

Plain Text
export MVN_HOME=/usr/local/maven
export PATH=$MVN_HOME/bin:$PATH

export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto
export PATH=$JAVA_HOME/bin:$PATH

export SONAR_RUNNER_HOME=/usr/local/sonar-scanner
export PATH=$SONAR_RUNNER_HOME/bin:$PATH

配置aliyun的mavenc仓库

Plain Text
<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
</mirror>

配置成功后控制查看安装

[root@ip-10-0-17-14 maven]# mvn -v
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: /usr/local/maven
Java version: 17.0.13, vendor: Oracle Corporation, runtime: /usr/local/jdk-17.0.13
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "6.1.115-126.197.amzn2023.x86_64", arch: "amd64", family: "unix"

jenkins机器上配置nvm 通过nvm安装node

需要使用npm来给前端打包

执行脚本先安装nvm


curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash

安装完成后,您需要在终端中加载 NVM。可以通过将以下内容添加到您的 shell 配置文件中(如 ~/.bashrc 等)来实现:


export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

使用nvm安装node 18


nvm install 18

jenkins机器上配置docker

会使用docker把构建的镜像推送到ECR


# 安装docker
yum install docker -y
systemctl enable docker
systemctl start  docker

补充一点,后面会使用docker login的操作是需要配置aws configure的

jenkins机器上安装sonar scanner

推荐版本 SonarScanner 3.0 或更高版本: SonarQube 7.6 支持 SonarScanner 3.0 及更高版本。建议使用最新的 3.x 版本,以确保获得最新的功能和修复。

打开浏览器地址https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli/

找到sonar-scanner-cli-3.3.0.1492-linux.zip 进行下载

下载后上传文件到EC2 上解压放重命名到 /usr/local/sonar-scanner

修改 ~/.bashrc 文件,添加

Text plain
export SONAR_SCANNER_HOME=/usr/local/sonar-scanner
export PATH=$SONAR_SCANNER_HOME/bin:$PATH

source ~/.bashrc 生效

编辑 /usr/local/sonar-scanner/conf/sonar-scanner.properties

Text plain
sonar.host.url=http://<sonarqube_url>:9000

查看安装

Text plain
[root@node125 conf]# sonar-scanner --version
INFO: Scanner configuration file: /usr/local/sonar-scanner/conf/sonar-scanner.properties
INFO: Project root configuration file: NONE
INFO: SonarQube Scanner 3.3.0.1492
INFO: Java 1.8.0_121 Oracle Corporation (64-bit)
INFO: Linux 3.10.0-1160.118.1.el7.x86_64 amd64

回到github项目,在测试maven项目pom.xml项目同一级目录下创建sonar-project.properties

Text plain
sonar.projectKey=项目名称  
sonar.projectName=项目名称
sonar.projectVersion=1.0 
sonar.sources=.
sonar.java.binaries=target/classes
sonar.language=java 
sonar.sourceEncoding=UTF-8

一定要配置sonar.java.binaries=target/classes 表示要扫描的jar的文件位置

jenkins机器上手动测试sonar-scanner 

在项目jenkins 拉取github的workspace目录下找到

/root/.jenkins/workspace/xx/springTest2

目录下执行sonar-scanner 

查看扫描结果

配置jenkins集成

安装SonarQube Scanner 插件

Sonarqube 上生成token, 用admin/admin(原始密码, 系统会提示需要修改后再登录)登录以后

MyAccount - security - generate token

复制这个key 在jenkins -> setting -> system下找sonarqube加上

配置qube server的访问url

添加刚在sonar_qube上成成的token

Jenkins setting ->全局工具  ,配置里配置sonar_scanner的安装位置

填写 /usr/local/sonar-scanner 作为SONAR_RUNNER_HOME

Jenkins 配置后端作业配置

Build Steps 先添加一个shell 执行

Text plain
cd /root/.jenkins/workspace/xx/springTest2
/usr/local/maven/bin/mvn clean install

在下面再添加一个execute sonarqube_scanner

sonar_scaner只配置sonar-project.properties 文件位置

填写相对位置 ./springTest2/sonar-project.properties

查看job控制台输出发现使用的jdk版本不对

因为在jenkins里执行sonar-scanner会使用这个 /usr/local/sonar-scanner/jre/bin/java

执行

cd /usr/local/sonar-scanner/jre/bin
rm -rf java
ln -s /usr/local/jdk-17.0.13/bin/java $PWD/java

补充一个sonar-scanner检查的问题

ERROR: Unable to create symbol table for : 'springTest2/src/main/java/com/example/springTest2/controller/HelloController.java'

java.lang.IllegalArgumentException: Unsupported class file major version 61

是因为mvn使用了jdk17做编译,但是sonarqube低版本,这个时候配置JAVA_HOME

遇到这个报错

配置--add-opens java.base/java.lang=ALL-UNNAMED  到JVM Options

遇到No files nor directories matching 'target/classes' 需要在项目位置找到target/classes 的相对路径

再次跑作业查看页面上会有passed的标志

Sonarqube 配置强制登录

有强制登录后可以从上面位置点击跳转过来

Jenkins 再添加一个shell构建阶段

增加下面脚本内容

Text plain
cd /root/.jenkins/workspace/xx/springTest2
image_version='xx.dkr.ecr.ap-northeast-2.amazonaws.com/xx/backend:latest'
docker build -t $image_version .
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin xx.dkr.ecr.ap-northeast-2.amazonaws.com

docker push $image_version

再次执行

检查ECR 推送成功

Jenkins 配置前端作业配置

在shell构建里加上

Text plain
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

cd /root/.jenkins/workspace/frontend_job/vue_test_login

nvm use 18
/root/.nvm/versions/node/v18.20.5/bin/npm run build

image_version='xx.dkr.ecr.ap-northeast-2.amazonaws.com/xx/frontend:latest'
docker build -t $image_version .
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin xx.dkr.ecr.ap-northeast-2.amazonaws.com

docker push $image_version

测试一下,构建推送成功

复习  ECS 后端部署

任务定义

把重要的镜像和使用的端口配置上

1 ECS 下创建集群,我们使用Fargate这种更加方便的方式

2 创建服务

创建负载均衡

其他不用动

完毕后看到

codepipeline 后端部署配置

1,  Choose creation option 选择build custom pipeline

2 选择流水线设置

3 添加源阶段 , 选择S3

新建imagedefinitions.json

Text plain
[
  {
    "name": "backend",
    "imageUri": "xx.dkr.ecr.ap-northeast-2.amazonaws.com/xx/backend:latest"
  }
]

把这个文件压缩为zip,上传到s3

记得S3 开启版本控制

4 跳过构建阶段

5  添加部署阶段

jenkins后端job配置codepipeline的触发

Text plain
aws codepipeline start-pipeline-execution --name jenkins_pipe

执行时间较长

复习  ECS 前端部署

创建任务

把使用的镜像和使用的端口写清楚

其余不用动点击创建

在ECS集群下创建服务

选择任务

联网里选择VPC

把负载均衡加上

找到负载均衡的DNS地址

codepipeline 前端部署配置

创建一个zip包含vue_imagedefination.json的文件,json文件格式为

Text plain
[
  {
    "name": "frontend",
    "imageUri": "xx.dkr.ecr.ap-northeast-2.amazonaws.com/xx/frontend:latest"
  }
]

上传这个zip到s3

1,  Choose creation option 选择build custom pipeline

2  选择流水线设置

3  添加S3作为源

4 跳过构建阶段

5 添加部署阶段

jenkins 前端job配置codepipeline的触发

Text plain
aws codepipeline start-pipeline-execution --name vue_pip

实现一个完整的github push -> jenkins -> codepipeline -> ecs service部署

本地代码git push, github上显示推送成功

触发了codepipeline 的构建

查看codepipline

再看ECS, 部署任务版本+1了

检查LBS 地址,部署更新了

RDS 太贵,使用免费的EC2安装mysql


# 安装docker
yum install docker -y
systemctl enable docker
systemctl start  docker

# 拉取镜像

docker pull mysql:5.7.41

# 启动 mysql
docker run -d --name mysql-1 -p 3306:3306  -e MYSQL_ROOT_PASSWORD='xx'  mysql:5.7.41

再复习下如何把github push event 触发jenkins构建

1 github上生成token

2 在github项目上创建指向jenkins的webhook

地址填写http://<jenkins_host>:9001/github-webhook/

3  jenkins上system configure 上配置access token

添加认证方式

在箭头处填写github access token

记得在jenkins job上把push 构建选项勾上

相关文章:

aws codepipeline + github + sonarqube + jenkins实践CI/CD

https://blog.csdn.net/u011564831/article/details/144007981文章浏览阅读1.2k次&#xff0c;点赞31次&#xff0c;收藏21次。本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流&#xff0c;用于自动化发布已经部署 lambda 函数。在 AWS 海外区&a…...

mistralai 部署笔记

目录 mistralai 部署笔记 mistralai 部署笔记 #! /usr/bin/env python3 import os import sys import torch os.chdir(os.path.dirname(os.path.abspath(__file__)))current_dir = os.path.dirname(os.path.abspath(__file__))paths = [os.path.abspath(__file__).split(scri…...

Java——异常机制(上)

1 异常机制本质 (异常在Java里面是对象) (抛出异常&#xff1a;执行一个方法时&#xff0c;如果发生异常&#xff0c;则这个方法生成代表该异常的一个对象&#xff0c;停止当前执行路径&#xff0c;并把异常对象提交给JRE) 工作中&#xff0c;程序遇到的情况不可能完美。比如…...

坐标系,向量_batch及向量点乘部分知识

坐标系 Unity所采用的是左手坐标系。 对于Vector3.forward ,其坐标值为&#xff08;0&#xff0c;0&#xff0c;1&#xff09;&#xff0c;为定值 而transform.forward 该值不固定&#xff0c;本地坐标正方向所在世界坐标系中的方向 向量 向量是终点位置减去起始点位置得…...

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…...

【设计模式】结构型设计模式总结之代理模式、装饰模式、外观模式、享元模式

文章目录 代理模式示例结构分类动态代理 装饰模式示例结构使用场景与代理模式区别Context 外观模式结构示例使用场景Context 享元模式结构示例使用场景Message 代理模式 代理模式&#xff08;Proxy Pattern&#xff09; 是一种结构型设计模式&#xff0c;它提供了一个代理对象…...

11进阶篇:专业课论文阅读方向指南(2025版)

文章目录 第一个检索式:图情档核心期刊(北大 + CSSCI)发文情况研究方法类关键词研究主题类关键词论文阅读建议第二个检索式:川大公共管理学院在核心期刊(北大 + CSSCI)的发文情况研究方法类关键词研究主题类关键词特点关键词与2024年972(现815)两道题目的映射情况815信…...

watch里可以写异步吗

在Vue的 watch 中可以写异步&#xff0c;但通常不推荐。 原因 - 可维护性差&#xff1a; watch 的主要用途是响应式地监听数据变化。如果在里面写复杂的异步操作&#xff0c;会让代码逻辑变得难以理解和维护。例如&#xff0c;同时监听多个数据变化并触发不同异步操作时&am…...

基于 Spring Boot + Vue 的宠物领养系统设计与实现

引言 近年来&#xff0c;随着人们生活水平的提高&#xff0c;宠物逐渐成为许多家庭的重要成员。然而&#xff0c;宠物的流浪和弃养问题日益严重&#xff0c;这促使社会对宠物领养的需求不断增长。为解决宠物领养中信息不对称、领养流程复杂等问题&#xff0c;设计并实现一个基…...

leetcode399:除法求值

给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queries 表示的问题&#xff0c;其中 queries[j]…...

【10】MySQL中的加密功能:如何使用MD5加密算法进行数据加密

文章目录 1. MySQL加密功能概述2. MD5加密算法3. 在MySQL中使用MD5加密4. 使用更安全的加密方法总结 在现代的数据库应用中&#xff0c;数据的安全性和隐私性变得尤为重要。无论是存储用户的个人信息&#xff0c;还是保护敏感的业务数据&#xff0c;确保这些数据不会被未授权访…...

CSS的2D和3D动画效果

CSS的2D和3D动画效果&#xff1a;网页动态设计的魔法 在现代网页设计中&#xff0c;动画已经成为提升用户体验的重要元素。通过引入动态效果&#xff0c;我们不仅可以使交互更加流畅和直观&#xff0c;还能吸引用户的注意力&#xff0c;增强品牌认知度。CSS提供了强大的工具&a…...

30天学会Go--第9天 GO语言 Mysql 学习与实践

30天学会Go–第9天 GO语言 MySQL学习与实践 文章目录 30天学会Go--第9天 GO语言 MySQL学习与实践前言一、MySQL 基础知识1.1 MySQL 的核心特征1.2 MySQL 的常见使用情景 二、安装 MySQL2.1 Windows 安装2.2 macOS 安装2.3 Linux 安装 三、MySQL 常用命令3.1 数据库操作3.2 表操…...

跟李笑来学美式俚语(Most Common American Idioms): Part 54

Most Common American Idioms: Part 54 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记&#xff0c;自用。 Github仓库链接&#xff1a;https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来&#xff08;或者clone到本地…...

Angular由一个bug说起之十一:排序之后无法展开 Row

问题现象 在使用 Material Table 时&#xff0c;排序功能触发了一个奇怪的 Bug&#xff1a;表格的 Row 无法展开。最终排查发现&#xff0c;问题的根源在于 trackBy 的错误使用。trackBy 方法接受两个参数&#xff1a;index&#xff08;数据索引&#xff09;和 row&#xff08;…...

使用 Flutter 进行移动应用开发:深入探索

文章目录 前言一、介绍二、安装 Flutter 环境三、Flutter 应用结构与基础组件四、状态管理策略五、高级主题结语 前言 随着移动技术的迅猛发展&#xff0c;跨平台开发的需求日益增长。开发者们一直在寻找一种既能保证应用性能又能减少开发成本和时间的技术方案。Flutter 应运而…...

2024年天津市职业院校技能大赛高职组 “信息安全管理与评估”样题第三阶段

&#xff08;四&#xff09;第三阶段竞小组&#xff08;赛项&#xff09;目&#xff08;300分&#xff09; 第三阶段竞赛内容是:网络安全渗透&#xff08;夺旗挑战赛CTF&#xff09; 本模块要求参赛者作为攻击方&#xff0c;运用所学的信息收集、漏洞发现、漏洞利用等渗透测试技…...

docker批量创建cloudstack虚拟主机脚本

批量创建cloudstack脚本 #!/bin/bash # 配置变量 container_prefix"cloudworker-" base_ip"192.168.1." start_ip2 #开始ip start_container2 #上同 end_container4 #结束ip 包括 network_name"my_macvlan_network" image_name"dockedahi:…...

npm发布插件到私有仓库保姆级教程

在开发项目的过程中&#xff0c;我们经常需要安装插件依赖&#xff0c;那么怎么把自己开发的组件封装成一个插件&#xff0c;并发布到npm 插件市场或者上传到私有仓库里面呢&#xff1f;今天总结下自己发布插件到私有仓库的记录&#xff1a; 一、创建组件 执行命令创建一个空…...

WinRAR V7.10纯净体验

前言 很多同学在安装了WinRAR之后&#xff0c;每次用这个软件解压文件时&#xff0c;都会先跳出一个广。这个广就像打开了一个新窗口&#xff0c;很打扰人。从WinRAR的5.40版本开始&#xff0c;哪怕是简体中文版的&#xff0c;都会这样弹广告。不管你有没有注册账号&#xff0…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...