一、安装gitlab
首先下载gitlab的安装包,地址如下:
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/bionic/main/g/gitlab-ce/
然后安装下载的包即可,一般还需要安装openssh-server等依赖包,在安装gitlab包之前可以使用dpkg -I *.deb查看所需依赖并安装。
修改gitlab配置,主要是一些端口用户等配置:
sudo vim /etc/gitlab/gitlab.rb
## GitLab URL
##! URL on which GitLab will be reachable.
##! For more details on configuring external_url see:
##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
#external_url 'http://gitlab.example.com'
external_url 'http://192.168.229.128' #修改为机器IP
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.server"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_pool'] = false
修改配置之后执行命令重新加载配置:
sudo gitlab-ctl reconfigure
执行完该条命令之后,就会生成一个初始密码,位置如下:
sudo cat /etc/gitlab/initial_root_password
然后通过IP即可访问,输入账号root以及密码即能登入,登入之后可以修改密码。
二、账号申请管理
有了管理员账号之后,其它用户就能申请个人账号进行使用,申请之后,由管理账号进行通过:
然后进入以下页面,可以对申请用户进行管理,编辑权限,通过之后,就可以使用申请账号进行登录 :
三、创建组和项目:
管理员账号以及有权限的个人账号,都可以创建组和项目,操作比较简单。
四、自动打包发布:
首先根据提示在组中安装所需要的包,以及申请runner,注意是在编译的服务器中安装,不是在gitlab代码托管的服务器:
注意,如果runner和构建环境在一个主机上,ssh地址填localhost就可以。
runner创建之后就可以在项目中创建CI/CI流水线:
具体的一些配置项可以自行在网上查询.gitlab-ci.yaml的编写说明,比如设置只在特定的分支上编译等。
同时还需要配置ssh以便于免密登录(这一步好像不需要,忘了,实际进行部署的时候可以尝试一下,也可以在两边服务器上都执行以下命令,因为我这里已经部署过一遍了,部署第二个group项目的时候没有执行下面的命令也可以,所以不太确定了):
以下命令均在客户端执行:
1、生成密钥:
ssh-keygen
2、将公钥传到服务器(root和host分别对应服务端的用户名和IP):
ssh-copy-id root@host
3、测试免密登录是否成功:
ssh root@host
接下来在gitlab的项目组中设置CI/CD变量(也可以在具体项目中单独配置):
设置的变量以及值为(注意填的是runner编译服务器的信息,SSH_KNOWN_HOSTS 和SSH_PRIVATE_KEY 可能也不需要,部署第二个group时未填,如果有端口需要填SSH_PORT):
SSH_USER = 服务器用户名
SSH_HOST = 服务器ip
SSH_KNOWN_HOSTS = 文件 ~/.ssh/known_host 中服务器ip的一行(一般为第一行)
SSH_PRIVATE_KEY = 文件 ~/.ssh/id_rsa 中的内容
这一系列配置完之后,就可以在项目中按照.gitlab-ci.yaml进行编译了,当然,CI服务器上也需要安装一些编译各种包时所需要的依赖包。
五、常见CI错误解决:
Using SSH executor...
ERROR: Preparation failed: ssh command Connect() error: getting host key callback: open /root/.ssh/known_hosts: no such file or directory
Will be retried in 3s ...
解决:在/etc/gitlab-runner/config.toml添加:
[[runners]]
...
[runners.ssh]
disable_strict_host_key_checking = true
...
ERROR: Job failed (system failure): prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
解决:
删除 /home/用户/.bash_logout
六、.gitlab-ci.yml范例:
# 指定使用的语言环境
image: debian:latest
stages:
- build
variables:
#项目统一放置deb的目录
LZOS_DIR: /home/lz/LZOS
build:
stage: build
script:
- echo "*************************************************** build ***************************************************"
- echo "LZOS_DIR:$LZOS_DIR"
#安装依赖
- |
builddepends=$(dpkg-checkbuilddeps 2>&1 | awk '/Unmet build dependencies:/ {sub(/^.*: /, ""); gsub(/ *\([^)]*\)/, ""); print}' || true)
export DEBIAN_FRONTEND=noninteractive
echo "************build-depends apt install*******************"
echo 123123 | sudo -S -p "" sh -c 'sudo apt update && sudo apt upgrade -y --allow-downgrades'
echo 123123 | sudo -S -p "" sh -c 'sudo mk-build-deps -i -t "apt-get --yes" -r'
#该工程的名字及路径
- project_name=`dpkg-parsechangelog --show-field Source`
- echo "project_name:$project_name"
- project_dir=$LZOS_DIR/$project_name
- echo "project_dir:$project_dir"
#该工程的路径不存在则创建
- if [ ! -d $project_dir ]; then mkdir $project_dir; fi
#现存最高版本,初始化为0
- latest_version="0"
- all_dir=`find $project_dir -type d -regex '.*/[0-9][^/]*$' -printf "%f\n"`
- for dir in $all_dir; do
version=$dir;
echo "version:$version";
get_version=`dpkg --compare-versions $version gt $latest_version && echo 1 || echo 0`;
if [ $get_version -eq 1 ]; then
latest_version=$version;
fi;
done
- echo "latest_version:$latest_version"
#获取debian目录下changelog文件中的版本号
- changelog_version=`dpkg-parsechangelog --show-field Version`
- echo "changelog_version:$changelog_version"
#比较changelog中的版本号和现存最高版本号,changelog_version大则输出1
- comparison_results=`dpkg --compare-versions $changelog_version gt $latest_version && echo 1 || echo 0`
- echo "comparison_results:$comparison_results"
#changelog版本号正确则编译,否则结束
- if [ $comparison_results -eq 1 ]; then
debuild_cmd="debuild-ccache";
if [ "${PARALLEL+defined}" = "defined" ]; then
debuild_cmd="debuild-ccache ${PARALLEL}";
fi;
echo "*************************************************** Starting to ${debuild_cmd} ***************************************************";
eval "${debuild_cmd}";
if [[ $? -ne 0 ]]; then
echo "************* ${debuild_cmd} 命令执行失败";
exit 10;
fi;
dir=$project_dir/$changelog_version;
if [ ! -d $dir ]; then
mkdir $dir;
echo "*************************************************** mkdir dir:$dir ***************************************************";
else
echo "*************************************************** dir:$dir is exist ***************************************************";
fi;
cd ../;
cp *.deb $dir;
echo "cp *.deb to path:$dir";
echo "*************************************************** build deb success ***************************************************";
else
echo "***************************** changelog_version($changelog_version) isNot greater than latest_version($latest_version) *****************************";
exit 20;
fi
# 将生成的ddeb/deb包发送到服务器 (需要管理员在编译服务器上配置对源服务器的免密登录: ssh-copy-id,用sshpass 也可以)
- scp -P 3535 *.deb lz@192.168.2.231:/home/lz/dongting-tmp/
# 在目标服务器上执行命令
- ssh -p 3535 lz@192.168.2.231 "cd /home/lz/lzos_ppa/dongting && reprepro -C main includedeb dongting /home/lz/dongting-tmp/*.deb; rm /home/lz/dongting-tmp/*.deb"
- if ls *.ddeb >/dev/null 2>&1; then
scp -P 3535 *.ddeb lz@192.168.2.231:/home/lz/dongting-tmp/;
ssh -p 3535 lz@192.168.2.231 "cd /home/lz/lzos_ppa/dongting && reprepro --ignore=extension -C dbgsym includedeb dongting /home/lz/dongting-tmp/*.ddeb; rm /home/lz/dongting-tmp/*.ddeb";
fi
# 删除文件
- rm -f *.deb *.ddeb *.changes *.buildinfo *.build
#选择runner,注册runner时设置了tag,可用于不同平台服务器编译,arm,x86,linux,windows等
tags:
- dongting
only:
- dongting
这里主要实现了读取changelog中的版本号与服务器中现存版本进行比较,如果编译的版本号大则继续编译。
runner开机自启服务(/etc/systemd/system/gitlab-runner.service):
sudo systemctl daemon-reload
sudo systemctl start gitlab-runner.service
sudo systemctl enable gitlab-runner.service
[Unit]
Description=GitLab Runner
ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
After=syslog.target network.target
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--user" "gitlab-runner"
Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/gitlab-runner
[Install]
WantedBy=multi-user.target
还想加一个自动打tag的功能,后续再补充。。。。