Java/Vue若依架构项目gitlab配置自动集成(CI/CD)

  1. 安装gitlab
    参考文档:linux安装GitLab教程

  2. 安装所需基础环境:
    git(cenOS7自带的git版本较低,需要升级成最新版本,否则执行自动构建的时候会报错
    jdk1.8
    maven
    node.js

  3. 安装gitlab-runner
    3.1 添加GitLab官方仓库

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

3.2 安装GitLab Runner
运行以下命令以安装GitLab Runner:

sudo yum install -y gitlab-runner

安装成功后会创建一个gitlab-runner的用户,并且默认使用/home/gitlab-runner目录作为工作目,配置文件默认位于/etc/gitlab-runner/config.toml
3.3 注册Runner

sudo gitlab-runner register

在服务器中运行该命令,并按照提示输入GitLab的URL和Runner的Token,这将链接Runner到GitLab。

3.4启动GitLab Runner服务
完成注册后,你需要启动GitLab Runner服务。运行以下命令启动服务:

sudo systemctl enable gitlab-runner
sudo systemctl start gitlab-runner
// 查看状态
sudo systemctl status gitlab-runner

现在你已经成功安装了GitLab Runner,它已经准备好为你的项目执行CI/CD任务了。
3.5 查看gitlab上的项目是否成功关联gitlab-runner
Java/Vue若依架构项目gitlab配置自动集成(CI/CD)_第1张图片
4. 配置ssh公私钥免密码登录
4.1 在GitLab Runner所在的服务器上执行以下命令来生成SSH密钥对:

ssh-keygen -t rsa

这将在当前用户的主目录中生成一个.ssh文件夹,并在其中包含公钥(id_rsa.pub)和私钥(id_rsa)。
4.2 将公钥添加到远程服务器
将公钥添加到远程服务器的authorized_keys文件中,可以使用以下命令将公钥添加到远程服务器中(回车后输入服务器密码即可):

ssh-copy-id root@192.168.1.88

4.3 执行完命令后可以使用 ssh [email protected]测试是否可以免密码登录

  1. 编写.gitlab-ci.yml脚本,
    5.1 参照下图打开gitlab中的配置
    Java/Vue若依架构项目gitlab配置自动集成(CI/CD)_第2张图片

5.2 参照以下脚本编写适合自己的脚本,我这边在部署服务器中有一个叫boot.sh的脚本可以一键重启jar包,大家可以自行百度。

image: maven:3.6.3-jdk-8

stages:
  - build
  - deploy

cache:
  key: gitlab-ci-cache
  paths:
    - ./ltp-admin/target
    - ./ui-admin/dist

build:
  stage: build
  script:
    - echo "开始打包部署"
    - mvn package
    - echo "打包部署结束"
    - cd ./ui-admin
    - pwd
    - echo "前端-管理端开始打包"
    - npm install ---registry=http://registry.npm.taobao.org
    - npm run build:prod
    - echo "前端-管理端打包结束"
    - cd ../


deploy:
  stage: deploy
  script:
    - scp ltp-admin/target/ltp-admin.jar [email protected]:/usr/local/learn-training-platform/jarProject
    - scp -r ui-admin/dist [email protected]:/usr/local/learn-training-platform/vueProject/dist
    # 此处直接用ssh命令,并且将后面要重启jar包的命令放在和ssh同一行执行
    - ssh [email protected] "cd /usr/local/learn-training-platform/jarProject/;./boot.sh stop;"
    - ssh -tt [email protected] "cd /usr/local/learn-training-platform/jarProject/;./boot.sh start"
    - ssh -tt [email protected] "cd /usr/local/learn-training-platform/vueProject; rm -rf admin; mv dist admin;"


  1. 到此全部配置已经结束了,需要大家注意执行用户的权限,如果不是root用户部署可能会带来很多权限相关的问题,还有git的版本最好直接升级成新版本,避免gitlab-runner执行不会报错。下面附上踩坑集锦,有很多问题其实和其他人部署jenkins的时候遇到问题相似,大家查阅gitlab-runner相关的如果解决不了可以试试查阅jenkins。

踩坑集锦:

  1. git的版本
    刚开始执行构建的时候报出了以下错误,其实就是git版本较低导致的,更新成最新版本即可
fatal: git fetch-pack: expected shallow list
fatal: The remote end hung up unexpectedly
  1. 开始打包时遇到以下报错:

[INFO] Scanning for projects...
Downloading from public: https://maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom
[WARNING] Failed to create parent directories for tracking file /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.lastUpdated
Downloading from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom
[WARNING] Failed to create parent directories for tracking file /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.lastUpdated
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Non-resolvable import POM: Could not transfer artifact org.springframework.boot:spring-boot-dependencies:pom:2.5.14 from/to public (https://maven.aliyun.com/repository/public): /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.part.lock (No such file or directory) @ line 40, column 25
 @ 
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]   
[ERROR]   The project com.xxx:ltp:1.0.0 (/home/gitlab-runner/builds/V2ymxA7-/0/xxx/learn-training-platform/pom.xml) has 1 error
[ERROR]     Non-resolvable import POM: Could not transfer artifact org.springframework.boot:spring-boot-dependencies:pom:2.5.14 from/to public (https://maven.aliyun.com/repository/public): /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.part.lock (No such file or directory) @ line 40, column 25 -> [Help 2]

其实是因为没有maven仓库权限导致,将maven/conf/setting.xml中配置的localRepositor对应的目录配置777权限即可。

参考文档:
Jenkins构建maven项目失败
3. 打包job执行成功后,执行部署job时又报出了以下问题
Java/Vue若依架构项目gitlab配置自动集成(CI/CD)_第3张图片
明明gitlab-runner在执行build任务的时候已经成功了,并且对应的target中存在打好的jar包了,现在执行deploy任务的时候又执行了removing,把之前打的包又都删除了,一顿百度之后发现这就是gitlab-runner默认的机制,多个任务之间如果需要关联(用到之前任务打包之后的文件),则需要将对应的文件进行缓存(cache),所以在.gutlab-ci.yml文件中加入了以下内容,其中key可以随意起名,代表这个缓存的唯一性,这个cache可以写在最外面,也可以写到job里面,如果key相同里面的会覆盖外面的。

cache:
  key: gitlab-ci-cache
  paths:
    - ./ltp-admin/target
    - ./ui-admin/dist
  1. .gitlab-ci.yml文件ssh相关
    起初我使用的是ssh连接服务器,连接成功后再执行cd进入目录(在.gitlab-ci.yml中就是多行脚本),但是这么执行后报错显示找不到目录,可是我的目录是真实存在的,后来发现是ssh命令执行结束后就直接退出了那个终端(远程的服务器),然后查询了资料,说在ssh命令中,使用-tt参数代表分配一个伪终端,并且强制命令交互模式,遂改为使用Ssh -tt,发现可以正常进入目录并且执行重启jar包的脚本了,但是又发现执行结束后jar包启动失败,又查阅相关资料发现,ssh -tt命令会导致nohup命令结束后也无法正常执行后台运行,最后改为了Ssh 命令并且在同一行执行cd目录及重启命令,并且!要在启动jar包的脚本中设置BUILD_ID!参考文档:jenkins 退出后kill掉子进程的问题

你可能感兴趣的:(java,vue.js,linux,gitlab,ci/cd)