GitLab 社区版(Community Edition,简称 CE)是 GitLab 提供的免费开源版本。与企业版(Enterprise Edition,简称 EE)相比,社区版主要针对个人和小型团队,提供核心的代码仓库管理、代码审查、持续集成/持续部署(CI/CD)等功能。
GitLab CE 可以在 Linux 上通过多种方式安装,包括使用包管理器,Docker 容器,或者从源代码编译。
bashsudo apt-get update sudo apt-get install -y curl openssh-server ca-certificates curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo yum install -y gitlab-ce
bashdocker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 2322: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 \ gitlab/gitlab-ce:latest
完整的操作步骤如下:
运行以下命令以进入正在运行的 GitLab 容器:
bashdocker exec -it gitlab /bin/bash
在容器内执行以下命令来重置 root 密码:
bashgitlab-rake gitlab:password:reset
它会要求你输入新的密码。输入后,系统会打印出新密码。
使用这个新密码登录 GitLab 网页端。之后,你可以在个人设置中再次修改密码。
通过这种方式,你可以安全地为 GitLab 实例设置一个新的 root 密码,而不需要查看日志。这是官方推荐的密码重置流程。
对于一个以 Java 和企业级微服务架构为基础的项目,GitLab 社区版可以提供代码版本管理,以及 CI/CD 流程。这样,每当有代码更改时,GitLab 可以自动触发构建和测试任务,确保代码质量。此外,通过 API 或 Webhook,GitLab 还可以与其他 IT 系统(如 Jira、Kubernetes 等)进行集成,形成一个完整的 DevOps 工作流。
解决方案设计、物理网络蓝图、系统集成接口定义和部署环境蓝图等都可以基于 GitLab 的各种功能来进行详细规划和实施。
在Linux上部署GitLab,不采用Docker的方式,通常是通过下载和安装包来完成。以下是具体的步骤:
bashsudo yum install -y postfix
bashcurl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
bashsudo yum install -y gitlab-ce
/etc/gitlab/gitlab.rb
文件来配置GitLab,例如设置外部URL等。
bashvim /etc/gitlab/gitlab.rb
# 修改external_url 'https://gitlab.example.com'
# 查找:/external_url
bash gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "xxxxxxxxx@qq.com" # 用你的QQ邮箱地址替换
gitlab_rails['smtp_password'] = "brxl*******gfha" # 用你的SMTP授权码替换
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = 'xxxxxxxxx@qq.com' # 用你的QQ邮箱地址替换
运行下面的命令应用你的配置更改:
bashsudo gitlab-ctl reconfigure
其他操作
1、停止:sudo gitlab-ctl stop
2、启动:sudo gitlab-ctl start
3、查看状态:sudo gitlab-ctl status
从您提供的输出中,看起来GitLab已成功配置,并且默认的管理员账户(用户名:**root**)已被创建。但是,出于安全考虑,系统没有在标准输出(STDOUT)中显示初始的root密码。相反,它已将初始密码存储在`/etc/gitlab/initial_root_password`文件中。这个文件会在24小时后的第一次重新配置运行时被清理。 下面是如何获取初始root密码和登录到GitLab的步骤:
/etc/gitlab/initial_root_password
文件中的密码:
bashsudo cat /etc/gitlab/initial_root_password
IP
:port
root
和刚刚获取的密码登录。
重置root密码 (强烈推荐):
清理初始密码文件 (可选):
/etc/gitlab/initial_root_password
文件,以确保不会保留任何敏感信息:
bashsudo rm /etc/gitlab/initial_root_password
通过这些步骤,应该能够获取初始的root密码,登录到您的GitLab实例,并重置root密码以增加安全性。
是的,您可以将GitLab设置为中文。GitLab支持多种语言,包括简体中文。以下是如何将GitLab界面语言设置为中文的步骤:
登录到GitLab:
访问个人设置:
更改语言设置:
确认更改:
根据从不同源获取的信息,下面是在GitLab中启用项目导入选项的步骤:
Settings
> General
(设置 > 通用)。展开Import and export settings
(导入和导出设置)部分,滚动到Project export
(项目导出)、Import sources
(导入源)选项,选择Enabled
(启用)复选框,你可以启用希望允许的导入源,例如Repo by URL
, GitHub
, Bitbucket
等,然后选择Save changes
(保存更改)。
应用程序设置 ( 如果适用 ) :
/admin/application_settings
,并在Import sources
下启用项目导入选项。验证设置: 返回到GitLab的主页面,尝试导入项目以确保您的设置已正确应用。
UTC+8
时区。这意味着北京时间比协调世界时(UTC)快8小时。例如,如果UTC的时间是12:00(中午),那么北京时间将是20:00(晚上8点)。在中国,全国都统一使用北京时间,无论是东部还是西部地区。shcd /opt/gitlab/embedded/service/gitlab-rails
cat VERSION
rpm -q gitlab-ce
同级别的大版本内,也可以通过包管理,进行例行升级
https://docs.gitlab.com/16.10/ee/update/
shsudo yum install gitlab-ce
当从版本 16.5.0 直接升级到 16.10.3时
GitLab的升级脚本检测到需要先升级到 16.7.x 版本, 然后才能继续升级到 16.10.3。
这是由于GitLab的升级路径限制, 不允许跨越多个次要版本号直接升级。
shIs this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for gitlab_gitlab-ce
gitlab-ce-16.10.3-ce.0.el7.x86_64.rpm | 1.0 GB 00:02:12
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
gitlab preinstall: It seems you are upgrading from 16.5 to 16.10.
gitlab preinstall: It is required to upgrade to the latest 16.7.x version first before proceeding.
gitlab preinstall: Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrade-paths
error: %pre(gitlab-ce-16.10.3-ce.0.el7.x86_64) scriptlet failed, exit status 1
Error in PREIN scriptlet in rpm package gitlab-ce-16.10.3-ce.0.el7.x86_64
Verifying : gitlab-ce-16.10.3-ce.0.el7.x86_64 1/2
gitlab-ce-16.5.0-ce.0.el7.x86_64 was supposed to be removed but is not!
Verifying : gitlab-ce-16.5.0-ce.0.el7.x86_64 2/2
Failed:
gitlab-ce.x86_64 0:16.5.0-ce.0.el7 gitlab-ce.x86_64 0:16.10.3-ce.0.el7
Complete!
shsudo gitlab-ctl status systemctl status gitlab-runsvdir.service
bash# 停止相关数据连接服务,如果使用的话
gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
# 备份gitlab数据目录
gitlab-rake gitlab:backup:create
提示
根据输出日志,备份操作现在已经成功完成了。
日志显示备份文件名为 1713423032_2024_04_18_16.5.0。这个备份包含了GitLab实例的大部分数据,包括:
数据库 Git仓库数据 CI构建数据 上传的附件等 但是,需要注意的是,GitLab的配置文件 gitlab.rb 和密钥文件 gitlab-secrets.json 并未包含在备份中。日志有如下提示:
sh2024-04-18 06:50:38 UTC -- Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
因此,如果将来需要从这个备份还原GitLab实例,你还需要手动备份这两个配置文件。
备份文件默认存储在 /var/opt/gitlab/backups 目录下。你可以将该备份文件复制到其他位置作为额外的备份。
总的来说,现在你已经成功创建了一个GitLab的数据备份,便于未来出现问题时进行还原。不过请记得也备份配置文件,以确保还原后能正常运行。
bash# 停止所有gitlab服务
sudo gitlab-ctl stop
# 安装16.7版本
sudo yum install -y gitlab-ce-16.7.7
shsudo gitlab-ctl reconfigure sudo gitlab-ctl start
shcd /opt/gitlab/embedded/service/gitlab-rails
cat VERSION
rpm -q gitlab-ce
同样的,继续执行以下命令以完成升级,步骤与升级中间版本相同:
bash# 停止相关连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
# 停止所有gitlab服务
sudo gitlab-ctl stop
# 安装16.10.3
sudo yum install -y gitlab-ce-16.10.3
# 重新配置并启动(注:重新配置若更新时自动配置了,则不需要执行)
sudo gitlab-ctl reconfigure
sudo gitlab-ctl start
提示
在从16.7.x升级到16.10.3的过程中,您无需再次创建备份。原因如下:
已有备份可用 在第一步从16.5.0升级到16.7.x时,您已经创建了一个名为1713423032_2024_04_18_16.5.0的完整数据备份。只要这个备份文件存在且完整,就可以在升级过程中作为回滚点使用。
文档建议 GitLab官方的升级文档中,对于次要版本之间的升级(如16.7.x到16.10.x),并没有明确要求必须重新创建备份。创建备份主要是为了应对从一个主版本升级到另一个不兼容的主版本时(如16.x到17.x)的风险。
在线升级 GitLab的次要版本升级通常是一个在线的无中断的过程。在升级过程中,服务会短暂停止但数据不会被修改,因此不需要完整备份作为还原点。
效率考虑 创建备份是一个耗时的过程,为了升级效率,中间每个小版本都重新备份是不必要的开销。
因此,根据最佳实践,只需要在主要版本升级前创建一次完整备份即可,作为升级过程中的保险。在后续的次要版本升级中,如果您对现有备份和系统状态有足够的信心,可以跳过备份步骤直接进行升级。
但是,如果您对现有系统或备份的完整性和可靠性有任何疑虑,重新创建一次新的备份也是可以的,这样可以最大程度地降低风险
shcd /opt/gitlab/embedded/service/gitlab-rails
cat VERSION
rpm -q gitlab-ce
注意事项
gitlab-ctl renew-le-certs
。sudo gitlab-ctl status
。安装或升级 GitLab CE 后,首先需要重新配置 GitLab。运行以下命令来启动此过程:
bashsudo gitlab-ctl reconfigure
这个命令会根据新安装的软件包自动重新配置 GitLab,包括应用新的设置、更新数据库结构等。
配置完成后,使用以下命令检查 GitLab 各个组件的状态,确保它们都处于运行中:
bashsudo gitlab-ctl status
这将显示如 Redis、Nginx、Unicorn 等组件的运行状态。
GitLab 应该会自动启动 web 服务,你可以用浏览器访问对应的 URL(例如 http://gitlab.example.com
)查看 GitLab 的登录页面。
使用默认的 root
用户和更新后的新密码(可在 /etc/gitlab/initial_root_password
查看)登录到 GitLab 实例。为了安全起见,建议修改默认的 root
密码。
根据实际需求,你可能还需要进行其他配置,比如设置域名/HTTPS、配置邮件服务器等,请参考 GitLab 官方文档进行操作。
最后,你可以输入以下命令检查是否还有可用的软件包升级,并进行清理:
bashsudo yum update sudo yum clean all
如有新版本的升级包,可以选择继续升级。同时也可以清理过期的包和缓存。按照上述步骤操作,你就能顺利地在升级后继续使用最新版本的 GitLab。
在内存受限的环境中运行极狐GitLab
在启用所有功能的情况下运行时,极狐GitLab需要大量内存。有一些用例,例如在不需要所有功能的较小安装上运行极狐GitLab。例如:
通过一些调整,GitLab可以在比最低要求中描述的规格低得多的规格下舒适地运行。
可以运行极狐GitLab的最低预期规格是:
存储尤其重要,因为在受限环境中,我们预计会发生一定量的内存交换,这会给使用过的磁盘带来更大的压力。
在安装极狐GitLab之前,您需要配置swap。Swap是磁盘上的专用空间,在物理RAM已满时使用。当Linux系统耗尽RAM时,非活动页面将从RAM移动到交换空间。建议的swap配置为可用内存的50%左右。
如何配置Swap
Ubuntu 20.04
bashsudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
CentOS 7
bashsudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
有许多工具可以让您验证基于Linux的系统的性能,例如 sbc-bench,它可以用作一种验证系统性能是否足以在受限环境中运行极狐GitLab的方法。
这些系统提供足够的性能来运行极狐GitLab 的小型安装:
在 /etc/gitlab/gitlab.rb
中禁用监控:
rubyprometheus_monitoring['enable'] = false
rubypuma['worker_processes'] = 0
rubysidekiq['max_concurrency'] = 10
rubygitaly['configuration'] = {
concurrency: [
{'rpc' => "/gitaly.SmartHTTPService/PostReceivePack", 'max_per_repo' => 3},
{'rpc' => "/gitaly.SSHService/SSHUploadPack", 'max_per_repo' => 3}
],
cgroups: {
repositories: {'count' => 2},
mountpoint: '/sys/fs/cgroup',
hierarchy_root: 'gitaly',
memory_bytes: 500000,
cpu_shares: 512,
}
}
gitaly['env'] = {'GITALY_COMMAND_SPAWN_MAX_PARALLEL' => '2'}
进行所有这些更改后,重新配置极狐GitLab以使用新设置:
bashsudo gitlab-ctl reconfigure
配置完成后,您可以预期以下内存使用情况:
total used free shared buff/cache available Mem: 1.9Gi 1.7Gi 151Mi 31Mi 132Mi 102Mi Swap: 1.0Gi 153Mi 870Mi
一般流水线部署会出现上传报错:
一般来说修改如图这个配置即可:
这是防止流水线打包若未采用流水线自身缓存时,会上传jar包,过大时会报错
若修改后重试未生效可以尝试修改gitlab.rb配置文件
shcd /etc/gitlab/ && vim gitlab.rb
添加配置:gitlab
自身的限制,nginx
上传的限制两个都需要调整
rbgitlab_rails['env'] = {
'GITLAB_MAX_ARTIFACTS_SIZE' => '0'
'MALLOC_CONF' => 'dirty_decay_ms:30000,muzzy_decay_ms:30000'
}
nginx['client_max_body_size'] = '0' # 0 表示无限制,或者您可以设置一个更高的限制,如 '100m'(100 MB)。
然后保存:wq
,重载 gitlab
配置
shsudo gitlab-ctl reconfigure
核心目标是将jar
包分发到三台不同的目标服务器上
首先找到 gitlab
的并发配置文件(root下):
shcd /etc/gitlab-runner && vim config.toml
在 gitlab
服务器上,修改配置让其 支持 3个任务 并发执行,修改网络超时时间为 3倍 artifact_download_timeout
设置的 30分钟
tomlconcurrent = 3
check_interval = 0
connection_max_age = "15m0s"
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "local-system-runner"
url = "https://example.com"
id = 3
token = "glrt-Syxxxxxxxxxxxxx4rjkP"
token_obtained_at = 2024-05-04T17:56:30Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "shell"
[runners.custom_build_dir]
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.network]
artifact_download_timeout = 1800
重启 GitLab Runner
:修改完配置文件后,重启 GitLab Runner
以应用更改。
shsudo gitlab-runner restart
验证并行执行:
创建和启动 CI Pipeline
在 GitLab
项目中创建新的 Pipeline
,即重新触发启动一条流水线,观察三个作业是否都处于同一阶段且在运行;这可以在 GitLab
的 Pipeline
界面中,观察三个作业是否是同时运行的,例子,如下所示。
ymlstages:
- deploy
.deploy_template: &deploy_template
stage: deploy
environment: production
script:
- echo "Deploying application..."
- sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ctm@${SERVER_IP} "mv /home/ctm/evn/java_run/*.jar /home/ctm/evn/java_run/bak/$(date +%Y%m%d%H%M%S).jar"
- sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no target/*.jar ctm@${SERVER_IP}:/home/ctm/evn/java_run/
- sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ctm@${SERVER_IP} "sh /home/ctm/evn/java_run/restart.sh"
- echo "Application successfully deployed on ${SERVER_IP}."
only:
- main
deploy-job-1:
<<: *deploy_template
variables:
SERVER_IP: "111.xxx.xxx.23"
deploy-job-2:
<<: *deploy_template
variables:
SERVER_IP: "139.xxx.xxx.18"
deploy-job-3:
<<: *deploy_template
variables:
SERVER_IP: "49.xxx.xxx.6"
restart.sh
文件示例sh#!/bin/bash
# 设置脚本所需的绝对路径
work_dir="/home/ctm/evn/java_run"
java_home="/home/ctm/evn/jdk/jdk1.8.0_201/bin/java"
# 杀掉现有的Java进程
pkill -9 -f 'java.*system-0.0.1-SNAPSHOT.jar'
# 等待一段时间确保进程已经被杀死
sleep 5
# 检查进程是否被成功杀死,如果没有,则输出提示信息
if pgrep -f 'java.*system-0.0.1-SNAPSHOT.jar' > /dev/null; then
echo "Failed to kill the process. Please check manually."
exit 1
fi
# 获取当前时间戳,格式为yyyymmddhhmmss
timestamp=$(date +"%Y%m%d%H%M%S")
# 将现有的nohup.out文件重命名,添加时间戳作为后缀
mkdir -p "$work_dir/bak"
mv "$work_dir/nohup.out" "$work_dir/bak/nohup.out.$timestamp"
# 重新启动服务
cd "$work_dir"
nohup $java_home -noverify -Xmx512m -Xms512m -jar "$work_dir/system-0.0.1-SNAPSHOT.jar" --spring.profiles.active=uat1 > nohup.out 2>&1 &
针对各个环节还可以自定义依赖项,也就是先后顺序,比如我还要加入验证环节verify要在deploy结束后进行,而test需要在build之后进行,但deploy不用等待test,而是直接等待build,那么我们可以通过添加needs参数配置来实现,如下所示:
ymlunit-test-job: # 单元测试阶段 - 后续测试内容自行添加
stage: test
script:
- echo "Running unit tests... This will take about 5 seconds."
- sleep 5
- echo "Code coverage is 90%"
cache: # 2、采用缓存形式 (提升效率,无jar包上传下载的网络通讯消耗)
key: "${CI_COMMIT_REF_SLUG}-build" # 采用build阶段的缓存,读取编译后的jar包,key也为主${key}-build 保持一致
paths:
- .m2/repository
- target/
needs:
- build-job
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
- if: '$CI_RUN == "true"'
ymlcache:
key: "${CI_COMMIT_REF_SLUG}"
paths:
- .m2/repository # 使用相对路径定义 Maven 缓存位置
variables:
MAVEN_HOME: "/home/ctm/evn/apache-maven-3.9.6"
JAVA_HOME: "/home/ctm/evn/jdk/jdk1.8.0_201"
PATH: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$MAVEN_HOME/bin:$JAVA_HOME/bin"
MAVEN_CLI_OPTS: "-s .maven/settings.xml --batch-mode -Dmaven.repo.local=/home/ctm/maven_nexus"
GIT_TRACE: "true"
GIT_CURL_VERBOSE: "true"
GIT_DEPTH: "0"
before_script:
- echo "JAVA_HOME=$JAVA_HOME"
- echo $PATH
- which java
- which mvn
- which mkdir
- mkdir -p .maven
- echo "$MAVEN_SETTINGS_XML" > .maven/settings.xml
- mkdir -p /home/ctm/maven_nexus
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- echo "Compiling the code..."
- mvn $MAVEN_CLI_OPTS clean install -DskipTests
cache:
key: "${CI_COMMIT_REF_SLUG}-build"
paths:
- .m2/repository
- target/
artifacts:
paths:
- target/*.jar
expire_in: 1 hour # 根据需要设置适当的过期时间
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
- if: '$CI_RUN == "true"'
#unit-test-job: # 单元测试阶段
# stage: test
# script:
# - echo "Running unit tests... This will take about 10 seconds."
# - sleep 10
# - echo "Code coverage is 90%"
# rules:
# - if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
# - if: '$CI_RUN == "true"'
#
#lint-test-job: # 代码静态检查阶段
# stage: test
# script:
# - echo "Linting code... This will take about 10 seconds."
# - sleep 10
# - echo "No lint issues found."
# rules:
# - if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
# - if: '$CI_RUN == "true"'
## 用户密码的方式
.deploy_template: &deploy_template
stage: deploy
environment: production
script:
- echo "Deploying application..."
- |
sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ctm@${SERVER_IP} "mv /home/ctm/evn/java_run/*.jar /home/ctm/evn/java_run/bak/system-0.0.1-BAK-$(date +%Y%m%d%H%M%S).jar" ||
{
echo "WARNING: Failed to move JAR files to backup directory."
}
- echo "Backup completed or failed with a warning."
- |
sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no target/*.jar ctm@${SERVER_IP}:/home/ctm/evn/java_run/ &&
echo "New JAR file uploaded successfully." ||
{
echo "ERROR: Failed to upload new JAR file."
}
- |
sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ctm@${SERVER_IP} "sh /home/ctm/evn/java_run/restart.sh" &&
echo "Application restarted successfully." ||
{
echo "ERROR: Failed to restart application."
}
- echo "Application successfully deployed on ${SERVER_IP}."
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
- if: '$CI_RUN == "true"'
deploy-job-1:
<<: *deploy_template
variables:
SERVER_IP: "111.xxx.xxx.23"
deploy-job-2:
<<: *deploy_template
variables:
SERVER_IP: "139.xxx.xxx.18"
deploy-job-3:
<<: *deploy_template
variables:
SERVER_IP: "49.xxx.xxx.6"
此配置我仅留给main分支代码使用 隔离开避免混乱
ymlcache:
key: "${CI_COMMIT_REF_SLUG}"
paths:
- .m2/repository # 使用相对路径定义 Maven 缓存位置
- target/ # 确保.jar文件也被缓存
variables:
MAVEN_HOME: "/home/ctm/evn/apache-maven-3.9.6"
JAVA_HOME: "/home/ctm/evn/jdk/jdk1.8.0_201"
PATH: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$MAVEN_HOME/bin:$JAVA_HOME/bin"
MAVEN_CLI_OPTS: "-s .maven/settings.xml --batch-mode -Dmaven.repo.local=/home/ctm/maven_nexus"
GIT_TRACE: "true"
GIT_CURL_VERBOSE: "true"
GIT_DEPTH: "0"
before_script:
- echo "JAVA_HOME=$JAVA_HOME"
- echo $PATH
- which java
- which mvn
- which mkdir
- mkdir -p .maven
- echo "$MAVEN_SETTINGS_XML" > .maven/settings.xml
- mkdir -p /home/ctm/maven_nexus
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- echo "Compiling the code..."
- mvn $MAVEN_CLI_OPTS clean install -DskipTests
- echo "Listing compiled artifacts..."
- pwd && ls -l target/ # 列出 target 目录中的文件以确认构件
cache:
key: "${CI_COMMIT_REF_SLUG}-main-build" # 输出编译后的jar作为缓存,key为主${key}-build
paths:
- .m2/repository
- target/
# artifacts: # 启用流水线生成的构建包作为流水线输出 - 标准流程
# paths:
# - target/*.jar
# expire_in: 1 hour # 根据需要设置适当的过期时间
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
- if: '$CI_RUN == "true"'
unit-test-job: # 单元测试阶段 - 后续测试内容自行添加
stage: test
script:
- echo "Running unit tests... This will take about 5 seconds."
- sleep 5
- echo "Code coverage is 90%"
cache: # 2、采用缓存形式 (提升效率,无jar包上传下载的网络通讯消耗)
key: "${CI_COMMIT_REF_SLUG}-main-build" # 采用build阶段的缓存,读取编译后的jar包,key也为主${key}-build 保持一致
paths:
- .m2/repository
- target/
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
- if: '$CI_RUN == "true"'
lint-test-job: # 代码静态检查阶段 - 后续测试内容自行添加
stage: test
script:
- echo "Linting code... This will take about 5 seconds."
- sleep 5
- echo "No lint issues found."
cache: # 2、采用缓存形式 (提升效率,无jar包上传下载的网络通讯消耗)
key: "${CI_COMMIT_REF_SLUG}-main-build" # 采用build阶段的缓存,读取编译后的jar包,key也为主${key}-build 保持一致
paths:
- .m2/repository
- target/
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
- if: '$CI_RUN == "true"'
## 用户密码的方式
.deploy_template: &deploy_template
stage: deploy
environment: production
script:
# - echo "Listing downloaded artifacts..." # 1、采用上传下载构件形式 - 标准流程
- echo "Checking for the existence of JAR file in the cache..." # 2、采用缓存形式 (提升效率,无jar包上传下载的网络通讯消耗)
- pwd && ls -l target/ # 列出 下载下来的构件
- echo "Deploying application..."
- |
sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ctm@${SERVER_IP} "mv /home/ctm/evn/java_run/*.jar /home/ctm/evn/java_run/bak/system-0.0.1-BAK-$(date +%Y%m%d%H%M%S).jar" ||
{
echo "WARNING: Failed to move JAR files to backup directory."
}
- echo "Backup completed or failed with a warning."
- |
sshpass -p "$SSH_PASSWORD" scp -o StrictHostKeyChecking=no target/*.jar ctm@${SERVER_IP}:/home/ctm/evn/java_run/ &&
echo "New JAR file uploaded successfully." ||
{
echo "ERROR: Failed to upload new JAR file."
}
- |
sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no ctm@${SERVER_IP} "sh /home/ctm/evn/java_run/restart.sh" &&
echo "Application restarted successfully." ||
{
echo "ERROR: Failed to restart application."
}
- echo "Application successfully deployed on ${SERVER_IP}."
cache: # 2、采用缓存形式 (提升效率,无jar包上传下载的网络通讯消耗)
key: "${CI_COMMIT_REF_SLUG}-main-build" # 采用build阶段的缓存,读取编译后的jar包,key也为主${key}-build 保持一致
paths:
- .m2/repository
- target/
rules:
- if: '$CI_COMMIT_BRANCH == "main"' # 当提交发生在 main 分支上时,流水线才执行
- if: '$CI_RUN == "true"'
deploy-job-1:
<<: *deploy_template
variables:
SERVER_IP: "111.xxx.xxx.23"
deploy-job-2:
<<: *deploy_template
variables:
SERVER_IP: "139.xxx.xxx.18"
deploy-job-3:
<<: *deploy_template
variables:
SERVER_IP: "49.xxx.xxx.6"
本文作者:Golovin
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!