Maven 英[ˈmeɪvn]美[ˈmevən]
Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从一个中央信息管理项目的构建,报告和文档。
下载maven(http://maven.apache.org/download.cgi),解压,配置环境变量M2_HOME和PATH(命令mvn --version查看版本)
M2_HOME=E:\02-develop\08-maven\apache-maven-3.5.2
PATH=%PATH%;%M2_HOME%\bin
修改本地仓库地址:%M2_HOME%\conf\settings.xml增加
修改mirrors代替中央仓库,速度比较快:%M2_HOME%\conf\settings.xml增加
概念:
file--settings--Build,Excution,Deployment--Build Tools--Maven
file--new--project--Spring Initializr--Project SDK--next--Type Maven Project--next--Web--next-Finish
application.properties配置端口server.port=9090
编写Controller
idea:install--Run Maven Build
命令:mvn install
SpringBoot内置tomcat,用java命令启动
java -jar maven-springboot-test1-0.0.1-SNAPSHOT.jar
http://localhost:9090/hi?name=小明
配置一下两个tomcat地址,fileName:生成的war包名称
app
org.springframework.boot
spring-boot-maven-plugin
org.codehaus.cargo
cargo-maven2-plugin
tomcat9x
E:\02-develop\09-tomcat\apache-tomcat-9.0.2
existing
E:\02-develop\09-tomcat\apache-tomcat-9.0.2
cargo-run
install
run
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(MavenSpringbootTest1Application.class);
}
}
idea:install--Run Maven Build
命令:mvn install
http://localhost:8080/app/hi?name=小明aaa
新建start.sh,stop.sh,restart.sh在这三个脚本中分别实现启动、关闭、重启功能,然后在/usr/lib/systemd/的system或者user目录下新建myapp.service(system下的服务不需要登录)
start.sh
stop.sh
restart.sh
myapp.service
测试:systemctl start myapp
systemctl stop myapp
systemctl restart myapp
设置开机启动:systemctl enable myapp
取消开机启动:systemctl disable myapp
参考网址:http://blog.csdn.net/ruangong1203/article/details/73065410
参考:https://about.gitlab.com/installation/#centos-7
9.1.1 安装并配置必要的依赖关系
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
9.1.2 添加GitLab软件包库并安装软件包
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh|sudo bash
sudo EXTERNAL_URL="http://xxx.xxx.xxx:xx" yum install -y gitlab-ee
参考:http://blog.csdn.net/myNameIssls/article/details/70209516
9.2.1安装Jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm –import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins
9.2.2启动、关闭jenkins服务
sudo service jenkins start/stop/restart
9.2.3防火墙设置
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
在浏览器中输入http://ip:8080即可
Git plugin可能已经默认安装
9.4.1gitlab创建token
9.4.2jenkins添加Credentials
API token填写上图gitlab生成的token
9.4.3配置gitlab插件
Credentials选择9.4.2添加的,配置完成点击Test测试
在jenkins服务器上生成秘钥
ssh-keygen -t rsa -C "root@
全部默认
id_rsa是私钥,id_rsa_pub是公钥
将公钥内容复制到key
点击add,配置ssh私钥,将私钥内容复制到Private Key,不要勾选From a file on Jenkins master
配置定时构建任务,点击右侧问号图标查看格式
H/2 * * * *每两分钟执行一次构建(前提是项目有提交,没有提交不会触发)
参考:http://www.cnblogs.com/ceshi2016/p/6529557.html
openssl rand -hex 10
https://www.sonatype.com/download-oss-sonatype
11.1.1 windos解压安装
环境变量添加bin到path
启动nexus /run
11.1.2 centos7安装参考:http://blog.csdn.net/yougoule/article/details/56843562
安装
tar -zxvf nexus-3.7.1-02-unix.tar.gz -C /usr/local/
cd /usr/local/nexus-3.7.1-02/bin/
./nexus run &
开机启动
ln -s /usr/local/nexus-3.7.1-02/bin/nexus /etc/init.d/nexus3
ln -s /usr/local/nexus-3.7.1-02/bin/nexus /etc/init.d/nexus3
ln -s /usr/local/nexus-3.7.1-02/bin/nexus /etc/init.d/nexus3
修改nexus3的运行用户为root
vim nexus.rc
run_as_user="root"
修改nexus3启动时要使用的jdk版本
vim nexus
INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/java/jdk1.8.0_144
修改nexus3默认端口(可选)
cd /usr/local/nexus-3.7.1-02/etc/
vim nexus-default.properties
application-port=8081
修改nexus3数据以及相关日志的存储位置(可选)
cd /usr/local/nexus-3.7.1-02/bin/
vim nexus.vmoptions
-XX:LogFile=./sonatype-work/nexus3/log/jvm.log -Dkaraf.data=./sonatype-work/nexus3 -Djava.io.tmpdir=./sonatype-work/nexus3/tmp
安装完成访问http://localhost:8081测试
右上角点击sign in,默认用户名/密码: admin/admin123
点击Create reponsitory
配置maven/conf/settins.xml
3rdParty
admin
admin123
执行下图命令(注意:-DrepositoryId=3rdParty必须和server的id一致)
mvn deploy:deploy-file -DgroupId=com.test -DartifactId=myjar -Dversion=1.0.2 -Dpackaging=jar -Dfile=E:\02-develop\03-workspace\springboot\build\libs\springboot-0.0.1-SNAPSHOT.jar -Durl=http://localhost:8081/repository/3rdParty/ -DrepositoryId=3rdParty
nexus
Team Nexus Repository
http://localhost:8081/repository/maven-public/
thirdparty
Team Nexus Repository
http://localhost:8081/repository/maven-public/
com.test
myjar
1.0.2
11.5.1配置public仓库组
登录nexus,点击Views/Repositorys/Repositorys,选中Public Repositorys,点击Configuration 将Central,Snapshots,Releases移动到左边。
11.5.2配置Central
选中Central仓库,配置Remote Storage Locatio值为
http://maven.aliyun.com/nexus/content/groups/public/
Download Remote Indexes值设置为true,保存
点击Adminstation--Scheduled Tasks查看从阿里云下载情况
如果没有下载全,右键点击Central,Repaire Index、Update Index
11.5.3 配置settins.xml
参考http://blog.csdn.net/shenshen123jun/article/details/9084293
settins.xml在maven/conf目录下,在mirrors下配置如下:
public
*
Local Repository
http://10.100.50.36:8081/nexus/content/repositories/public/
url配置私服的仓库,mirrorOf的*表示所有依赖都从私服下载
参考:https://www.jianshu.com/p/df433633816b
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
yum install gitlab-ci-multi-runner
gitlab-ci-multi-runner register
#引导会让你输入gitlab的url,输入自己的url,例如http://gitlab.example.com/
#引导会让你输入token,去相应的项目下找到token,例如ase12c235qazd32
#引导会让你输入tag,一个项目可能有多个runner,是根据tag来区别runner的,输入若干个就好了,比如web,hook,deploy
#引导会让你输入executor,这个是要用什么方式来执行脚本,图方便输入shell就好了。
在项目根目录下编写.gitlab-ci.yml这样在push之后,gitlab-ci就会自动识别来解析了
stages:
- deploy
deploy:
stage: deploy
script:
- deploy Example_Group Example_Project
only:
- master
tags:
- myrunner
stages:阶段,任务
script:脚本,执行deploy脚本,后面两个是参数
only:只有master分支提交时才执行该stages
tags:runner名称
if [ $# -ne 2 ]
then
echo "arguments error!"
exit 1
else
deploy_path="/var/www/$1/$2"
if [ ! -d "$deploy_path" ];
then
project_path="[email protected]:"$1/$2".git"
it clone $project_path $deploy_path
else
cd $deploy_path+
git pull
fi
cd $deploy_path
mvn package
fi
给该脚本加权限:chmod +x deploy
给部署的目录加权限:chown -hR gitlab-runner:gitlab-runner /var/www
将该文件加到环境变量:PATH=xxx/deploy:$PATH
在gitlab上注册和gitlab-runner同名的用户并给项目权限
su gitlab-runner(该服务器用户是安装Gitlab Runner后自动添加的)
在~/.ssh下执行ssh-keygen一直回车
cat ~/.ssh/id-rsa.pub将公钥内容复制到gitlab用户gitlab-runner的ssh Keys
将.gitlab-ci.yml放在项目根路径下,内容如下:
image: docker:latest
# 两个阶段:mavenBuild-测试,imageBuild-生成iamges并上传
stages:
- mavenBuild
- imageBuild
maven-build:
# image: hengle/centos7-jdk1.8-maven3.5.2
stage: mavenBuild
script:
- "mvn test"
only:
- master
tags:
- mytest
image-build:
stage: imageBuild
script:
- "current_date=$(date +%m%d%H%M)"
- "commit_sha=$CI_COMMIT_SHA"
- "mvn package -Dmaven.test.skip=true"
- "docker build -t $DOCKER_REGISTRY_PRO:5000/spring-cloud-eureka:$CI_COMMIT_REF_NAME-$current_date-${commit_sha:0:8} ."
- "docker login -u $DOCKER_REGISTRY_USERNAME -p $DOCKER_REGISTRY_PASSWORD $DOCKER_REGISTRY_PRO:5000"
- "docker push $DOCKER_REGISTRY_PRO:5000/spring-cloud-eureka:$CI_COMMIT_REF_NAME-$current_date-${commit_sha:0:8}"
only:
- master
tags:
- mytest
在项目的Settings-CI/CD-Secret variables添加.gitlab-ci.yml中用到的部分变量
在跟路径下配置Dockerfile
FROM hengle/centos7-jdk1.8:v1
VOLUME /tmp
VOLUME /data
ADD ./target/*.jar /app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENV JAVA_HOME=/opt/jdk/jdk1.8.0_161
ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$PATH:$JAVA_HOME/bin
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
参考:https://www.jianshu.com/p/7918c9af45a3
docker pull registry
mkdir -p /docker-hub/auth
docker run --entrypoint htpasswd registry -Bbn testuser testpassword > auth/htpasswd
docker run -d -p 5000:5000 --restart=always --name docker-hub \
-v /docker-hub/registry:/var/lib/registry \
-v /docker-hub/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry
查看私库上的镜像
http://10.100.50.60:5000/v2/_catalog
查看某个镜像的标签
http://10.100.50.60:5000/v2/spring-cloud-eureka/tags/list
修改/etc/sysconfig/docker文件,并重新启动docker服务
OPTIONS='--selinux-enabled --insecure-registry 10.100.50.60:5000'
服务器:gitlab服务器、ci服务器、docker私库服务器
代码提交给gitlab服务器,gitlab服务器发现项目配置了ci,将根目录下的.gitlab-ci.yml发送给ci服务器执行,ci服务器执行mavenBuild测试和imageBuild生成镜像,并将镜像上传到docker私库。
1.1 使用IDEA工具也可以不用手动配置gradle,在构建项目的时候选择gradle wrapper这一
项就不用自己配置本地的gradle(如下图所示)
1.2 本地的gradle需要自己下载和配置,gradle官方网址
https://gradle.org/gradle-download/
1.3 下载后,无需安装,解压即可。然后配置一下系统环境,打开控制台输入gradle -v,出现如下所示就表示安装成功
说明:src为源码路径,开发主要在src下
src/main/java下放java文件
src/main/resources下放配置文件
src/test/java下放test测试案例
build.gradle文件:gradle配置文件
启动项目,通过浏览器访问该项目,该项目因为配置的路径为根路径,所以直接访问localhost:8080即可,此时gradle构建springboot项目成功
这里有两种方式:使用IDEA工具打包(不推荐),gradle打包
首先按F4或者点击IDEA右上角这地方
进入项目结构管理器
选择这里面的Artifacts。开始我完全不知道Artifacts是什么东西,后来查阅了点资料:Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;意思我理解的就是Artifacts就是告诉我们的程序因该如何打包这个项目。
之后新建一个Artifacts
这有两个选项选择第二个,从模块中引入,点击进去后会有一些设置,如下:
module是你需要打成jar包的项目
MainClass是运行的主函数,如果不需要运行则可以不选择
jar files from libraries是项目打包的方式,下面选项大致的含义:
1:extract to the target jar:把所有文件倒入进一个jar包里
2:copy to the。。。。:把项目的依赖包导出和项目一个目录,通过MANIFEST.MF文件来引用jar包。
这里如果你的项目需要打成一个可运行的jar包推荐第二种,反之第一种。
设置完之后,就会新建一个xxx:jar,并进入进入xxx:jar的编辑页面
在我们需要进行一个输出目录布局的设置,我们可以看到,已经编译好的项目的jar文件(我的是eachend.jar)和其他导入的jar包混到一起的,很杂,我是点击output layout下最左边的文件夹图标新建了一个lib文件,把其他jar包拖拽进来(建议,也可以直接点OK完成)
但是我们这样做的话依赖的jar包的目录就会产生变化,这时候我们需要选中我们项目,在下方然后修改MANIFEST.MF中的Class Path
到了这一步后Artifacts是写好了,保存之后就可以用来生成jar文件
点击build Artifacts后选择你刚刚生成的artifacts
build后就会在out的目录下生成对应的jar文件
最后进入项目目录 输入命令java -jar XXX.jar 就可以跑起来了 如下
利用gradle进行打包其实非常非常简单,但是因为我平常只是简单用它来导包,以及构建项目,它的基本的一些东西不是很清楚,所以走了些弯路花了大半天的时间才搞出来,所以说有时候需要了解一下你所用的东西的一些基础和原理。
在build,gradle中首先需要加上
apply plugin: 'java'
apply plugin: 'idea'
来定义你自己项目使用的插件,apply plugin: 'idea'用于把项目构建成idea项目,apply plugin: 'java'用于添加Java插件,以及一些内置任务,打包jar就要用到这里的插件。
version = '1.0'
repositories {
mavenCentral()
}
这里用来声明版本号以及添加maven中心仓库地址
dependencies {
compile 。。。。。。。
}
这里来添加项目所需要的依赖包
jar {
String someString = ''
configurations.runtime.each {someString = someString + " lib\\"+it.name} //遍历项目的所有依赖的jar包赋值给变量someString
manifest {
attributes 'Main-Class': 'com.each.dubboMainEnd'
attributes 'Class-Path': someString
}
}
打包的时候,这个地方很重要,用来设置jar文件的相关属性,这个地方把我坑了有点久,最后补了下gradle的基础知识,就搞出来了,这篇博客写gradle基础写的还可以,推荐给大家看看http://www.open-open.com/lib/view/open1447139848053.html
首先这定义了一个someString用来存放依赖包的信息,通过configurations.runtime拿到所有的运行时的依赖jar包,然后.each遍历他,通过it.name获取到每个的jar包的name,赋值。
manifest即是编译完成后生成jar包中的MANIFEST.MF配置信息
task copyJar(type:Copy){
from configurations.runtime
into ('build/libs/lib')
}
task release(type: Copy,dependsOn: [build,copyJar]) {// from 'conf'
// into ('build/libs/eachend/conf')
}
建立函数copyJar 用于把依赖的jar复制到对应的目录下。
函数release即是我们打包的时候的执行的函数,dependsOn[build,copyJar]这里会让执行relese函数的时候先执行build(系统自带的函数) 和copyJar
最后通过gradle release命令进行打包
打包成功!
cmd下进入对应目录运行 java -jar XXX.jar
运行成功!
build.gradle 完整源码:
apply plugin: 'java'
apply plugin: 'idea'
version = '1.0'
repositories {
mavenCentral()
}project.ext {
springVersion = '4.0.4.RELEASE'
minaVersion = '2.0.13'
}dependencies {
compile('com.alibaba:dubbo:2.4.9') {
exclude group: 'org.springframework', module: 'spring'
}
compile( "org.apache.zookeeper:zookeeper:3.3.6") {
exclude group: 'javax.jms', module: 'jms'
exclude group: 'com.sun.jmx', module: 'jmxri'
exclude group: 'com.sun.jdmk', module: 'jmxtools'
}
compile( "com.github.sgroschupf:zkclient:0.1") {
exclude group: 'javax.jms', module: 'jms'
exclude group: 'com.sun.jmx', module: 'jmxri'
exclude group: 'com.sun.jdmk', module: 'jmxtools'
}
compile "org.springframework:spring-webmvc:$springVersion",
"org.springframework:spring-web:$springVersion",
"org.springframework:spring-tx:$springVersion",
"org.springframework:spring-orm:$springVersion",
"org.springframework:spring-jdbc:$springVersion",
"org.springframework:spring-expression:$springVersion",
"org.springframework:spring-core:$springVersion",
"org.springframework:spring-context:$springVersion",
"org.springframework:spring-beans:$springVersion",
"org.springframework:spring-aop:$springVersion",
"org.apache.mina:mina-http:$minaVersion",
"org.apache.mina:mina-core:$minaVersion",
"org.hibernate.common:hibernate-commons-annotations:4.0.1.Final",
"org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final",
"org.hibernate:hibernate-core:4.1.0.Final",
"com.alibaba:fastjson:1.1.33.android",
"com.google.code.gson:gson:2.2.4",
"org.jboss.netty:netty:3.2.5.Final",
"mysql:mysql-connector-java:5.1.10",// "org.apache.zookeeper:zookeeper:3.3.6",// "com.github.sgroschupf:zkclient:0.1",
"cn.jpush.api:jpush-client:3.2.9",
"redis.clients:jedis:2.6.1",
"javax.servlet:javax.servlet-api:3.1.0",
"net.sf.ezmorph:ezmorph:1.0.4",
"com.google.collections:google-collections:1.0",
"org.json:json:20090211",
"net.sf.json-lib:json-lib:2.2.1:jdk15",
fileTree(dir: 'lib', include: '*.jar')
}
jar {
String someString = ''
configurations.runtime.each {someString = someString + " lib\\"+it.name}
manifest {
attributes 'Main-Class': 'com.each.dubboMainEnd'
attributes 'Class-Path': someString
}
}
//清除上次的编译过的文件task clearPj(type:Delete){
delete 'build','target'
}
task copyJar(type:Copy){
from configurations.runtime
into ('build/libs/lib')
}
//把JAR复制到目标目录task release(type: Copy,dependsOn: [build,copyJar]) {// from 'conf'// into ('build/libs/eachend/conf') // 目标位置
}
SpringBoot内置tomcat,用java命令启动
java -jar maven-springboot-test1-0.0.1-SNAPSHOT.jar