文章目录
作者:javastarboy
背景:前几年(2018 年前后)的 jenkins+docker+k8s 的CI/CD 在工作之中受益不少。提升了不少工作效率。而随着这几年的使用发现,目前 gitlab-CI/CD 在持续集成部署中更加方便、高效。 尤其是在测试环节中,研发无需编写复杂的 jenkins 脚本,只要提交代码,即可自动构建部署。 环境的处理也与 git 思想一致,在敏捷迭代中,效果显著。 最近,小编的其中一个客户也有此方面诉求,便着手搭建了一下这套流程,奈何网上资料过于零散,虽然仅用一天时间便搭建起来,但是我认为,前面已经这么多人(项目组)用过了,在开源的浪潮下,就不应该让后人这么繁琐的搭建这套流程。 所以此篇文章旨在读此一篇,便可拿到所有资料链接、便可成功搭建 Gitlab-CI/CD。
建议使用原生的 CentoOS7.6,可以规避很多问题)无论买哪个,一定要珍惜自己的新人机会,就一次,能省下很多钱
此文章写于 2023 年 3 月 5 日,相关软件版本用的当下最新版
linux 创建用户并授权案例,一劳永逸# 创建tomcat用户于tomcat目录上
useradd gitlab
# 修改密码
passwd gitlab 回车
然后键入密码
# 授权tomcat目录
chown -R 777 /home/gitlab
# 修改sudo 权限:
1)键入 vi /etc/sudoers 进入编辑模式,然后键入 i 追加如下权限
gitlab ALL=(ALL) ALL
2)若需跨服务执行 sudo 权限,追加如下权限
gitlab ALL=(ALL) NOPASSWD:ALL)
3)最后按 esc 键,输入 `:wq` 保存
# 后续安装 maven、gitlab 等用户都需要同步授权目录使用
chown -R gitlab:tomcat /usr/share/apache-maven
安装依赖包
yum install -y curl policycoreutils-python openssh-server
设置 SSH 开机自启动并启动 SSH 服务
systemctl enable sshd
systemctl start sshd
安装 Postfix
yum install -y postfix
Postfix 设置
# 设置 Postfix 服务开机自启动
systemctl enable postfix
# 打开 Postfix 的配置文件 main.cf
vim /etc/postfix/main.cf
按 i 进入编辑模式,删除 inet_interfaces = all 前的 #,在 inet_interfaces = localhost 前加上 #。修改完成后如下图所示。 然后按 Esc 并输入 :wq 保存修改并退出文件
启动 Postfix
systemctl start postfix
执行以下命令,添加 GitLab 软件包仓库(CentoOS 8.2以上会有问题)
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
安装 GitLab
sudo EXTERNAL_URL="服务器的公网IP地址" yum install -y gitlab-ce
在本地浏览器中访问已获取的公网 IP,返回页面如下所示,则表示已成功安装 GitLab

bash cat /etc/gitlab/initial_root_password 

# 安装 git
yum -y install git
# 查看是否安装成功
git --version
# 查找openjdk
yum search java|grep jdk
# 或者带颜色查找,看着方便点
yum search java | grep -i --color jdk
# 选择需要的文件进行安装(以 1.8 为例)
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# 或者如下命令,安装 open jdk1.8 的所有文件(省事)
yum install -y java-1.8.0-openjdk*
# ========================================
# 其他命令
# 查找已安装的jdk
yum list installed | grep [java][jdk]
# 卸载所有openjdk相关文件
yum -y remove java-1.8.0-openjdk*
# 安装OpenJDK 8 JRE
yum install java-1.8.0-openjdk
# 安装OpenJDK 8 JDK
yum install java-1.8.0-openjdk-devel
# 查找已安装的jdk
yum list installed | grep [java][jdk]
# 卸载所有openjdk相关文件
yum -y remove java-1.8.0-openjdk*



mv /usr/local/apache-maven-3.8.6/ /usr/local/bin/maven3.6
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
# 输入如下命令打开配置文件
vi /etc/profile
# 输入 i 进入编辑模式
export MAVEN_HOME=/usr/local/bin/maven3.6
export PATH=$PATH:$MAVEN_HOME/bin
# 按 esc 键,然后疏忽 :wq 回车保存
# 输入如下命令,生效配置
source /etc/profile
# 输入命令,验证安装是否成功,打印出 maven 版本即成功,如图:
mvn -v

注意:此时已经切换到另外一台服务器了,后面CI/CD 主要在这里执行
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# Give it permission to execute
sudo chmod +x /usr/local/bin/gitlab-runner
# Create a GitLab Runner user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# Install and run as a service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start


1、命令注册
# 注册命令(注意 gitlab 服务器地址以及获取 token 方式见后图)
sudo gitlab-runner register --url `http://你 gitlab 服务器的公网IP`/ --registration-token `我是项目的token值(获取方式见后图)`
# 接下来就是输入一些列命令,按照提示操作即可,示例如下($为服务器的步骤提示):
# 1. 填写gitlab的地址,确保容器内能够顺利访问到该地址
$ Enter the GitLab instance URL (for example, https://gitlab.com/):
输入:http://gitlab服务器公网ip/
# 填写需要注册的runner token,此处选择shared runner token【获取方式见后面截图】
$ Enter the registration token:
输入:BHRagrsztQAxdMPPhxGm
# 描述信息随意填写,也可不填
$ Enter a description for the runner:
输入:gitlab-runner-01
# tag随意填写
$ Enter tags for the runner (comma-separated):
输入:lmx-runner-4
# 随意填写,可不填
$ Enter optional maintenance note for the runner:
Registering runner... succeeded
# 选择执行器的种类,建议选择docker【小编为演示方便,选择了 shell】
$ Enter an executor: docker, shell, ssh, kubernetes, custom, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine:
输入:shell
token 获取位置如图:
Setting -> CI/CD -> Genneral pioelines settings -> Expand
2、回到 gitlab 查看 runne
gitlab 页面如下,部分信息可以再次修改
# 启动 重起 停止
gitlab-runner start
gitlab-runner restart
gitlab-runner stop
# 查看gitlab-runner运行状态
gitlab-runner status
见 3.2.2 注册runner 章节的注册一个 runner 说明
先初始化 .gilab-ci.yml 文件,然后编辑脚本
gitlab-ci templates
后文分别举例了三种部署方式

大家调试的时候,可以先调试 test 环节,保证你的 gitlab-runner 流程是正常的,然后再一步一步深入调试
当前示例的 jar 应用最终会部署在 gitlab-runner 本机上。 实际应用中不会这样部署,否则 gitlab-runner服务器资源会很紧张,咱们由浅入深,先调试名奶原理,再看后面章节。

# 定义一些变量, 下面各阶段会使用
variables:
# 运行的 jar 名称
JAR_NAME: test-0.0.1-SNAPSHOT.jar
# jar 包存放位置,不能是 git 目录,否则下一个 stage 阶段会清除文件, 这里默认放到上一级了
JAR_PATH: ../
# 本次构建的阶段: test、package、deploy
stages:
- test
- package
- deploy
# 测试流水线
test:
stage: test
tags:
- lmx-runnser-4
only:
- main
script:
- echo "流水线成功运行!"
# 打包
package:
stage: package
tags:
- lmx-runnser-4
only:
- main
script:
- echo "=============== 开始install任务 ==============="
- pwd
- mvn clean
- mvn package
- rm -rf $JAR_PATH/$JAR_NAME
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
- cd $JAR_PATH
- ls
# 启动jar包
deploy:
stage: deploy
tags:
- lmx-runnser-4
only:
- main
script:
- echo "=============== 开始部署任务 ==============="
- cd $JAR_PATH
- pwd
- ls
- ./test.sh
- echo "发布完成!"
#!/bin/bash
set -ex
pkill -9 java
# 注意:一定要写上 2>&1 & 进行重定向,否则任务会卡在 running 不动
nohup java -Dfile.encoding=utf-8 -jar test-0.0.1-SNAPSHOT.jar > test.log 2>&1 &
exit 0
runner 的下一个 stage 阶段会清除这里的文件。把 jar 包目录移走就不会影响下一步的 deploy> test.log 2>&1 & 命令重定向公司内部项目部署,可能每个项目都有分派自己的虚机服务器,所以我们需要把 runner 中打好的 jar 包上传到对应虚机服务并进行停起服务操作。 这里面会涉及到几个知识点
sshpass 软件进行远程服务器 ssh 访问; 或通过 rsa 秘钥的方式创建服务链接,前者会遇到一些权限、带密码登录虚机、脚本调试等问题。 为了大家方便,小编已经给大家做成变量的方式,大家仅需调整自己的变量参数即可。

yum install sshpassvi /ect/sudoersi 回车进入编辑模式,追加如下参数 gitlab ALL=(ALL) NOPASSWD:ALL):wq 回车保存Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf则需要执行chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf (或chmod 600 ~/.ssh/config,以操作系统配置为准)chown root:root /etc/ssh/ssh_config.d/05-redhat.conf,然后重新执行 4.1 命令即可解决#! /bin/bash
# 定义一些变量, 下面各阶段会使用
variables:
# 运行的 jar 名称
JAR_NAME: "test-0.0.1-SNAPSHOT.jar"
# jar 包存放位置,不能是 git 目录,否则下一个 stage 阶段会清除文件, 这里默认放到上一级了
JAR_PATH: ../
# 目标虚机服务器用户名
targetUsr: "gitlab"
# 目标虚机服务器登录密码
targetPwd: "gitlab-passwpord"
# 目标虚机服务器ip
targetHost: "172.222.206.141"
# 目标虚机服务器端口【默认22端口时可以不指定,小编服务器当时中病毒了,所以后来改了端口号,这里把指定端口号这种方式也提供给大家】
# 调整端口也可看小编另一篇文章[Liunx创建用户与授权大招以及Linux修改SSH端口](https://blog.csdn.net/u012723183/article/details/129811221)
targetPort: 22
# 目标虚机服务器jar 包存放位置
targetUploadPath: "/home/gitlab/"
# 如下两项为启动参数,按需调整,非必须
APPLICATION_CONFIG: "-Dfile.encoding=utf-8"
JAVA_OPTIONS: "-Dspring.profiles.active=dev -server -Xms256m -Xmx1024m"
LOG: test.log
# 本次构建的阶段: package、upload、deploy
stages:
- package
- upload
- deploy
# 打包
package:
stage: package
tags:
- lmx-runnser-4
# 除了 main 分支都构建,这里也可以改成 only 只有 xxx 分支构建,按需调整
except:
- main
script:
# 调试过程中如果遇到问题,可以放开 set -ex 这样就能打印出来命令了
#- set -ex
- echo "=============== 开始打包 ==============="
- pwd
# 执行 maven 的清理、打包命令(如果是 gradle 调整对应命令即可)
- mvn clean
- mvn package
# 删除临时存放目录的文件
- rm -rf $JAR_PATH/$JAR_NAME
# 将最新打包好的文件移动到临时目录(原因看上一个章节注意事项)
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
# 进入到临时目录查看一下文件
- cd $JAR_PATH
- ls
# 开始上传 jar 包到目标服务器
upload:
stage: upload
tags:
- lmx-runnser-4
except:
- main
before_script:
# 进入到 jar 包存放目录
- cd $JAR_PATH
- ls
script:
# - set -ex
- echo "=============== 开始上传 jar 包到目标服务器 ==============="
# 通过sshpass命令拷贝 runner 上的 jar 包到目标虚机服务器【命令示例:sshpass -p passwd scp -P 2203 test-0.0.1-SNAPSHOT.jar gitlab@101.55.206.139:/home/gitlab/】
- sshpass -p $targetPwd scp -P $targetPort $JAR_NAME $targetUsr@$targetHost:$targetUploadPath
# 通过 sshpass 停起虚机上的应用
deploy:
stage: deploy
tags:
- lmx-runnser-4
except:
- main
before_script:
# 进入到 jar 包存放目录
- cd $JAR_PATH
- ls
script:
# 查证问题的时候可以打印一下 -ex 命令,方便查证问题
# - set -ex
- echo "=============== 开始停起虚机上的应用 ==============="
# 通过sshpass命令杀掉目标服务器上即将启动的 jar 应用进程
- pid=$(sshpass -p $targetPwd ssh -P $targetPort ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo 当前运行的 pid 为 ${pid}
- |
if [ ${pid} ]; then
echo "开始杀进程停服务"
sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}" | xargs sudo kill -9'
else
echo "当前无程序运行"
fi
# 通过sshpass命令启动 java 应用
- echo "开始启动服务"
- sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'java -jar '$targetUploadPath$JAR_NAME' > '$LOG' 2>&1 & '
- pid=$(sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo "发布完成!当前运行的PID 为:" ${pid}
实际工作中,项目会有很多,分部门分项目组,分 group 等等情况。 既然咱们实现了自动化,旨在降低业务功能研发同学的工作成本,不应该每个项目都写这样一个复杂的脚本。 所以写一个公共的gitlab-ci模版就成为必要,把核心实现都在模版中动态引入,研发人员只需要调整自己项目的动态参数 variables 即可实现自动化部署
其实就是类似 java 开发的面向对象原理, 将一个大的复杂的方法,抽象出来公共实现,动态传入数据即可。
第一步:先创建一个新工程,用于存放模版(此工程无需构建,其实就是一个物理存放文件的路径,后面会从这里引用模版)

第 二步:先将4.2.2.1 章节中 stages 阶段提取到公共模版.gitlab-ci-template.yml 中【注意: 脚本一定是动态绑定参数】
待补充.....
#include:
- local: '.gitlab-ci-maven-template.yml'
- local: '.gitlab-ci-gradle-template.yml'
# 本次构建的阶段: package、upload、deploy
stages:
- package
- upload
- deploy
# 打包
package:
stage: package
tags:
- lmx-runnser-4
# 除了 main 分支都构建,这里也可以改成 only 只有 xxx 分支构建,按需调整
except:
- main
script:
# 调试过程中如果遇到问题,可以放开 set -ex 这样就能打印出来命令了
#- set -ex
- echo "=============== 开始打包 ==============="
- pwd
# 执行 maven 的清理、打包命令(如果是 gradle 调整对应命令即可)
- mvn clean
- mvn package
# 删除临时存放目录的文件
- rm -rf $JAR_PATH/$JAR_NAME
# 将最新打包好的文件移动到临时目录(原因看上一个章节注意事项)
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
- cd $JAR_PATH
- ls
# 远程虚机服务器上部署 jar 方案,准备如下:
# 1、需要目标虚机 user、passwd、jar 存放路径
# 2、目标需求需要安装 sshpass 软件【yum install sshpass】
# 3、目标虚机上需要给 user 授权sudo免密登录【【vi /ect/sudoers】==》gitlab ALL=(ALL) NOPASSWD:ALL)】,否则后面停服命令将无法执行
# 4、gitlab-runner 本机如果报错 Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
# 4.1 则需要执行 chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf (或chmod 600 ~/.ssh/config,以操作系统配置为准)
# 4.2 如果 4.1 命令执行后无效,则可能是用户的用户组不正确,假设执行命令的用户是 root,则更改用户组的命令为:chown root:root /etc/ssh/ssh_config.d/05-redhat.conf,然后重新执行 4.1
# 开始上传 jar 包到目标服务器
upload:
stage: upload
tags:
- lmx-runnser-4
except:
- main
before_script:
# 进入到 jar 包存放目录
- cd $JAR_PATH
- ls
script:
# - set -ex
- echo "=============== 开始上传 jar 包到目标服务器 ==============="
# 通过sshpass命令拷贝 runner 上的 jar 包到目标虚机服务器【命令示例:sshpass -p passwd scp -P 2203 test-0.0.1-SNAPSHOT.jar gitlab@101.55.206.139:/home/gitlab/】
- sshpass -p $targetPwd scp -P $targetPort $JAR_NAME $targetUsr@$targetHost:$targetUploadPath
# 通过 sshpass 停起虚机上的应用
deploy:
stage: deploy
tags:
- lmx-runnser-4
except:
- main
before_script:
# 进入到 jar 包存放目录
- cd $JAR_PATH
- ls
script:
# 查证问题的时候可以打印一下 -ex 命令,方便查证问题
# - set -ex
- echo "=============== 开始停起虚机上的应用 ==============="
# 通过sshpass命令杀掉目标服务器上即将启动的 jar 应用进程
- pid=$(sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo 当前运行的 pid 为 ${pid}
- |
if [ ${pid} ]; then
echo "开始杀进程停服务"
sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}" | xargs sudo kill -9'
else
echo "当前无程序运行"
fi
# 通过sshpass命令启动 java 应用
- echo "开始启动服务"
- sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'java -jar '$targetUploadPath$JAR_NAME' > '$LOG' 2>&1 & '
- pid=$(sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo "发布完成!当前运行的PID 为:" ${pid}
首先需要先引入上面做好的模版脚本,类似研发中的引包
#! /bin/bash
# 引入模版
include:
# 模版所在 project ,gitlab-instance-ecd28528为分组,ht-gitlab-ci为项目名称
- project: 'gitlab-instance-ecd28528/ht-gitlab-ci'
# 模版文件
file: '.gitlab-ci-template.yml'
# 模版项目所在分支
ref: main
# 定义一些变量, 下面各阶段会使用
variables:
# 运行的 jar 名称
JAR_NAME: "test-0.0.1-SNAPSHOT.jar"
# jar 包存放位置,不能是 git 目录,否则下一个 stage 阶段会清除文件, 这里默认放到上一级了
JAR_PATH: ../
# 目标虚机服务器用户名
targetUsr: "gitlab"
# 目标虚机服务器登录密码
targetPwd: "gitlab-passwpord"
# 目标虚机服务器ip
targetHost: "172.222.206.141"
# 目标虚机服务器端口
targetPort: 22
# 目标虚机服务器jar 包存放位置
targetUploadPath: "/home/gitlab/"
# 如下两项为启动参数,按需调整,非必须
APPLICATION_CONFIG: "-Dfile.encoding=utf-8"
JAVA_OPTIONS: "-Dspring.profiles.active=dev -server -Xms256m -Xmx1024m"
LOG: test.log
上面介绍的命令中,都是通过sshpass 软件实现主控服务器(gitlab-runner)向目标虚机服务器远程scp文件并执行命令。 显然操作起来,其命令过于复杂且不安全。 所以咱们通过配置 SSH 免密登录之后来编辑脚本就更加简单且安全了。
1. 开始之前,先介绍一下,如何给一台服务器设置 rsa 密钥登录
此过程与咱们本次要实现的 gitlab-runner免密登录无关(在这里提前介绍是怕大家稍后配置 gitlab-runner免密时遇到一个多公钥文件情况不知如何处理),属于额外给大家介绍一下单纯设置服务器 rsa 秘钥登录技巧。 点击下面链接有详细命令讲解
菜鸟教程-设置 SSH 通过密钥登录
核心命令如下:
cat /root/.ssh/id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
vi /etc/ssh/sshd_config -----按如下图2方式调整
systemctl restart sshd ------重启 sshd
sshd_config配置文件调整
下载id_rsa,然后打开本地 xshell/finalshell/winscp等 ssh连接工具,引入id_rsa文件即可,下图为 finalshell 示例:
2. 下面讲解 gitlab-runner 主控机操控远程受控机的SSH 免密登录配置方式
原理:如下图,是咱们 gitlab-ci的操作流程示意,我们上文中通过 sshpass 实现 gitlab-runner 远程操控虚机命令
我们只需要将此过程实现免密登录即可简化命令操作并且安全.
处理流程如下:
1) 在 gitlab-runner 服务器的 gitlab-runner 用户下生成密钥对
# 切换用户
su gitlab-runner
# 生成密钥对
ssh-keygen -t rsa
# 连续三次回车效果如图

2) 如上图,将生成好的公钥文件/home/gitlab-runner/.ssh/id_rsa.pub 下载后上传至目标虚机服务器的/root/.ssh目录下,然后将id_rsa.pub内容进行追加到authorized_keys当中实现免密登录。
注意:如果你的目标虚机做过 rsa 密钥配置(4.2.2.3.1章第一点的介绍),则/root/.ssh下也会存在一个id_rsa.pub文件,这时大家只需要把 gitlab-runner的id_rsa.pub文件随便放一个位置即可,因为主要的目的是通过 id_rsa.pub 将公钥信息载入authorized_keys,所以如果有多个公钥文件也无所谓的。
# 将公钥写入 authorized_keys【 cat 后面可以指定你的公钥路径,如果你有多个公钥,自行放置,我的是放在了/home/gitlab/.ssh下】
cat /home/gitlab/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
3)在 gitlab-runner服务器上测试一下远程免密登录虚机
# -p 2203是指定 ssh 登录端口号(默认是 22 端口,大家想学习如何更改 ssh 端口号的也可看小编另一篇文章[Liunx创建用户与授权大招以及Linux修改SSH端口](https://blog.csdn.net/u012723183/article/details/129811221))
ssh -p 2203 root@101.55.206.139
# 如果是默认的 22 端口,命令可以简化如下
ssh root@101.55.206.139

1. 项目.gitlab-ci.yml 脚本调整
主要调整了用户为 root 用户,去掉了密码,因为免密登录了
#! /bin/bash
# 引入模版
include:
- project: 'gitlab-instance-ecd28528/ht-gitlab-ci'
file: '.gitlab-ci-template.yml'
ref: main
# 定义一些变量, 下面各阶段会使用
variables:
# 运行的 jar 名称
JAR_NAME: "test-0.0.1-SNAPSHOT.jar"
# jar 包存放位置,不能是 git 目录,否则下一个 stage 阶段会清除文件, 这里默认放到上一级了
JAR_PATH: ../
# 目标虚机服务器用户名
targetUsr: "root"
# 目标虚机服务器ip
targetHost: "101.55.206.139"
# 目标虚机服务器端口
targetPort: 2203
# 目标虚机服务器jar 包存放位置
targetUploadPath: "/home/gitlab/"
# 如下两项为启动参数,按需调整,非必须
APPLICATION_CONFIG: "-Dfile.encoding=utf-8"
JAVA_OPTIONS: "-Dspring.profiles.active=dev -server -Xms256m -Xmx1024m"
LOG: test.log
2. 模版脚本调整.gitlab-ci-template.yml
调整了 sshpass 命令为 ssh 命令,并且 scp 命令得到了简化
# 本次构建的阶段: package、upload、deploy
stages:
- package
- upload
- deploy
# 打包
package:
stage: package
tags:
- lmx-runnser-4
# 除了 main 分支都构建,这里也可以改成 only 只有 xxx 分支构建,按需调整
except:
- main
script:
# 调试过程中如果遇到问题,可以放开 set -ex 这样就能打印出来命令了
#- set -ex
- echo "=============== 开始打包 ==============="
- pwd
# 执行 maven 的清理、打包命令(如果是 gradle 调整对应命令即可)
- mvn clean
- mvn package
# 删除临时存放目录的文件
- rm -rf $JAR_PATH/$JAR_NAME
# 将最新打包好的文件移动到临时目录(原因看上一个章节注意事项)
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
- cd $JAR_PATH
- ls
# 远程虚机服务器上部署 jar 方案,准备如下:
# 1、需要目标虚机 user、passwd、jar 存放路径
# 2、目标需求需要安装 sshpass 软件【yum install sshpass】
# 3、目标虚机上需要给 user 授权sudo免密登录【【vi /ect/sudoers】==》gitlab ALL=(ALL) NOPASSWD:ALL)】,否则后面停服命令将无法执行
# 4、gitlab-runner 本机如果报错 Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
# 4.1 则需要执行 chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf (或chmod 600 ~/.ssh/config,以操作系统配置为准)
# 4.2 如果 4.1 命令执行后无效,则可能是用户的用户组不正确,假设执行命令的用户是 root,则更改用户组的命令为:chown root:root /etc/ssh/ssh_config.d/05-redhat.conf,然后重新执行 4.1
# 开始上传 jar 包到目标服务器
upload:
stage: upload
tags:
- lmx-runnser-4
except:
- main
before_script:
# 进入到 jar 包存放目录
- cd $JAR_PATH
- ls
script:
# - set -ex
- echo "=============== 开始上传 jar 包到目标服务器 ==============="
# 【设置免密登录后】拷贝 runner 上的 jar 包到目标虚机服务器【命令示例:scp -P 2203 test-0.0.1-SNAPSHOT.jar root@101.55.206.139:/home/gitlab/】
- scp -P $targetPort $JAR_NAME $targetUsr@$targetHost:$targetUploadPath
# 通过 sshpass 停起虚机上的应用
deploy:
stage: deploy
tags:
- lmx-runnser-4
except:
- main
before_script:
# 进入到 jar 包存放目录
- cd $JAR_PATH
- ls
script:
# 查证问题的时候可以打印一下 -ex 命令,方便查证问题
# - set -ex
- echo "=============== 开始停起虚机上的应用 ==============="
# 通过sshpass命令杀掉目标服务器上即将启动的 jar 应用进程【命令示例:ssh -p 2203 -o StrictHostKeyChecking=no root@101.23.206.23 'ps -ef|grep 'test-0.0.1-SNAPSHOT.jar ' | grep -v "grep" | awk "{print \$2}"'】
- pid=$(ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo 当前运行的 pid 为 ${pid}
- |
if [ ${pid} ]; then
echo "开始杀进程停服务"
ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}" | xargs sudo kill -9'
else
echo "当前无程序运行"
fi
# 通过sshpass命令启动 java 应用
- echo "开始启动服务"
- ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'java -jar '$targetUploadPath$JAR_NAME' > '$LOG' 2>&1 & '
- pid=$(ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo "发布完成!当前运行的PID 为:" ${pid}
执行 sshpass 命令如果报错 Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf chmod 600 ~/.ssh/config即可(小编当时在这里折腾半天,具体原因是下面第二个问题 group )。chown root:root /etc/ssh/ssh_config.d/05-redhat.conf,然后重新执行 chmod 600 命令即可解决目标虚机上需要给 user 授权sudo免密登录
root 用户输入命令vi /ect/sudoers
然后输入i回车进入编辑模式,追加如下参数gitlab ALL=(ALL) NOPASSWD:ALL)
然后按 ESC 键,输入:wq回车保存,搞定!
'shell 命令'包装 ,所以命令本身如果有引号就要做特殊处理比如下面示例中的 "test-0.0.1-SNAPSHOT.jar"sshpass -p lmx@2023 ssh -o StrictHostKeyChecking=no gitlab@101.55.206.139 'ps -ef|grep "test-0.0.1-SNAPSHOT.jar" | grep -v "grep" | awk "{print \$2}"'
'$JAR_NAME'。小编当时在这里耽误了大半天时间,各种调试,所以一定要注意。pid=$(sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
pid=$ 等号中间不能有空格(真的太坑了,小编这里也耽误很久)$(命令)语法包装${pid}如案例中的 if [ ${pid} ]; then待更新
待更新,预计 3 月中旬更新
1、查看构建状态

2、浏览器输入自己的 test 接口,验证一下项目运行情况

服务器要求:至少 2C8G, 建议 4C8G 或更高
报错:fatal: The remote end hung up unexpectedly
解决:git config --global http.postBuffer 524288000
查看:git config --global --list
继续报错:fatal: Out of memory, malloc failed (tried to allocate 262144000 bytes)
解决(内存不足,干脆删掉):git config --global --unset http.postbuffer
写的比较详细的链接可参考,主要是调整 gitlab.rb 配置参数(我目前试了没搞定)
报错:sudo: /usr/libexec/sudo/sudoers.so 必须属于用户 ID 0(的用户)
sudo: 在加载插件“sudoers_policy”时在 /etc/sudo.conf 第 14 行出错
问题原因:有人将/usr/bin/sudo的权限改为777或将目录/usr的权限授权给非root用户了
解决办法:
chmod 4755 /usr/bin/sudo
chown -R root:root /usr
# 注意:一定要写上 2>&1 & 进行重定向,否则任务会卡在 running 不动
最终:nohup java -Dfile.encoding=utf-8 -jar test-0.0.1-SNAPSHOT.jar > test.log 2>&1 &

注意 p 的大小写不同
sshpass -p 端口号
ssh -p 端口号
scp -P端口号
Gitlab CI/CD 简单介绍
Gitlab CI/CD 介绍
Gitlab-Runner 相关命令
Liunx创建用户与授权大招以及Linux修改SSH端口
我们在Ubuntu14.04和Gitlab9.3.7上运行,运行良好。我们正在尝试更新到Gitlabv9.3.8的最新安全补丁,但它给我们这个错误:Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension.currentdirectory:/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/re2-1.0.0/ext/re2/usr/local/bin/ruby-r./siteconf20170720-19622-15i0edf.rbextconf.rbcheckingformain(
我想在我公司安装的GitLab中使用自定义Logo-白色、Logo-黑色和网站图标。我用谷歌搜索了我的屁股并尝试了所有我能找到的方法来清除这些该死的图像,但似乎没有任何效果。这是唯一似乎成功运行但未删除图像的进程:bundleexecrakecache:clearRAILS_ENV=productionservicegitlabstopredis-cliFLUSHALLbundleexecrakeassets:precompileRAILS_ENV=productionservicegitlabstart然后我清除我的浏览器缓存并转到该域,再次出现相同的该死的图像!我什至删除了我能从应
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每
如果我只能找到正确的手册,我的Google-fu就会让我失望,因为这看起来很明显。我有一个由我们的托管服务提供商安装的Gitlab服务器Gitlab服务器有很多项目。对于其中一些项目,我希望Gitlab每次从本地客户端推送到Gitlab时自动推送到远程存储库(在本例中为Github)。像这样:客户端-->gitlab-->github任何标签和分支也应该被推送。AFAICT我有3个选择:用两个Remote配置本地客户端,同时推送到Gitlab和Github。我想避免这种情况,因为开发人员。在Gitlab服务器上的存储库中添加一个gitpost-receiveHook。这将是最灵活的(我
例如:en:foobar-does-not-work:'Thisismyvalue'那么如果我这样做:t(foobar-does-not-work)#=>returnsnil这不会在Ruby的yml中解析。有什么方法可以让它发挥作用吗?我的key基于其中包含破折号(-)的URL。 最佳答案 您使用的是哪个版本的ruby?你能告诉我们你的代码和错误吗?对我有用:>require'yaml'>YAML.load_file('foo.yml'){"en"=>{"foobar-does-not-work"=>"Thisismyvalue
我正在使用最新版本的Capistrano和我的Rails4应用程序。运行capdpeloy时。我得到了很多输出,包括这次失败:DEBUG[04b6e226]Running/usr/bin/env[-f/var/www/skateboxes/releases/20131022135522/config/database.yml]on162.243.33.179DEBUG[04b6e226]Command:[-f/var/www/skateboxes/releases/20131022135522/config/database.yml]DEBUG[04b6e226]Finishedin0
我正在尝试从github克隆一个rails存储库,但它没有secrets.yml文件。当我尝试从Rails服务器运行应用程序时,出现错误“开发”环境缺少secret_key_base,在config/secrets.yml中设置此值我知道文件的结构应该是什么样子,但是我有办法生成key以使用开发环境吗? 最佳答案 这个rake任务为你生成secret:bundleexecrakesecretGenerateacryptographicallysecuresecretkey(thisistypicallyusedtogeneratea
一般来说,我对ruby并没有太多经验,也没有尝试在GitLab社区版中安装新的omniauth提供程序。我使用综合包将其安装在Ubuntu14.04上。目标是根据JasigCAS对GitLab进行身份验证根据Customomniauthproviderconfigurationsdoc使这项工作正常进行的下一步是使用“gem'omniauth-cas'”将相应的gem添加到gemfile。安装的omnibus包甚至可以做到这一点吗?还是必须手动重新安装?我在安装目录中没有看到任何gemfile,我想它在/var/opt/gitlab的某个地方?谢谢大家!
安装gitlab-5.0时遇到问题https://github.com/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/installation.md#initialise-database-and-activate-advanced-featuresroot@ubuntu:/home/gitlab/gitlab#bundleexecrakegitlab:setupRAILS_ENV=productionrakeaborted!Accessdeniedforuser'root'@'localhost'(usingpassword:YES)/h
我们刚刚将虚拟机升级到我认为相同的ruby配置(通过RVM...Ruby1.9.2、Rails3.0.7、DataMapper1.1.0)。最大的区别是我们从MySQL5.0升级到5.1。出于某种原因,在我们的旧VM上运行的完全相同的代码/database.yml现在在我们的新VM尝试连接到数据库时失败了。问题是这个YAML:mysql_defaults:&mysql_defaultsadapter:mysqlencoding:UTF-8username:userpassword:passhost:localhostdevelopment:正在扩展到:"mysql_defaults