gitlab

官方文档

启动

setup.sh
docker run \
  -d \
  -p 8080:80 -p 8022:22 \
  -v ./config:/etc/gitlab \
  -v ./logs:/var/log/gitlab \
  -v ./data:/var/opt/gitlab \
  --privileged=true \
  --restart always \
  --name gitlab \
gitlab/gitlab-ce:13.6.1-ce.0

runner

官方文档

setup-runner.sh
#!/bin/bash

server_url="http://gitlab.test.com/"
token="U8xxx"
tags="docker,ci"
version="v13.6.0"
config_dir="config"

if [ ! -d ${config_dir} ]; then
  mkdir ${config_dir}
  docker run --rm -it \
    -v ./${config_dir}:/etc/gitlab-runner \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -e CI_SERVER_URL="${server_url}" \
    -e REGISTRATION_TOKEN="${token}" \
    -e RUNNER_DESCRIPTION="docker-runner" \
    -e RUNNER_TAG_LIST="${tags}" \
    -e RUNNER_EXECUTOR="docker" \
    -e DOCKER_IMAGE="alpine:latest" \
    gitlab/gitlab-runner:${version} register --non-interactive

    sleep 10
fi

docker run -d --name gitlab-runner \
  --restart always \
  --network host \
  -v ./${config_dir}:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:${version}

备份与恢复

备份

backup.sh
#!/bin/bash

# 同步文件
function sync_file() {
    cmd_status=1
    run_times=0
    while [ ${cmd_status} != 0 ] && [ ${run_times} -le 3 ]; do  # 连续失败 3 次
        run_times=$((${run_times} + 1))
        cp -vrf $1 $2
        cmd_status=$?
    done
    if [ ${cmd_status} -eq 1 ];then
        rm -rf $1
    fi
}

function backup_gitlab() {
	rm -f ${GITLAB_DIR}/data/backups/*.tar
	rm -rf ${GITLAB_DIR}/.cache/ && mkdir -p ${GITLAB_DIR}/.cache/

	echo "开始备份"
	docker exec -t gitlab gitlab-backup create
	# 查找目录中的 .tar 文件,并将结果保存到一个数组中
	tar_files=$(ls ${GITLAB_DIR}/data/backups/*.tar 2>/dev/null)

	# 获取数组的长度
	num_tar_files=${#tar_files[@]}

	# 检查 .tar 文件的数量
	if [ "$num_tar_files" -ne 1 ]; then
		echo "有多个备份文件, 退出!!!"
		exit 1;
	fi

	cp ${GITLAB_DIR}/config/gitlab.rb ${GITLAB_DIR}/.cache/
	cp ${GITLAB_DIR}/config/gitlab-secrets.json ${GITLAB_DIR}/.cache/
	cp ${tar_files[0]} ${GITLAB_DIR}/.cache/

	tar -czvf ${GITLAB_DIR}/.cache/$(hostname).tar.gz -C ${GITLAB_DIR}/.cache/ .

	mkdir -p ${BACKUP_DIR}/${BACKUP_DATE}/ && sync_file ${GITLAB_DIR}/.cache/$(hostname).tar.gz ${BACKUP_DIR}/${BACKUP_DATE}/
}

[[ -f ${GITLAB_DIR}/config/gitlab.rb ]] && { echo "gitlab.rb 不存在, 退出!!!" && exit 1; }
[[ -f ${GITLAB_DIR}/config/gitlab-secrets.json ]] && { echo "gitlab-secrets.json 不存在, 退出!!!" && exit 1; }

# gitlab路径
GITLAB_DIR="/data/app/gitlab"
# 备份日期
BACKUP_DATE=$(date +%Y-%m-%d)
# 备份存放的目录
BACKUP_DIR=/data/oss/backup-mn-sh/git
# 日志文件
LOG_FILE=${LOG_FILE:-"backup-$(date +%Y-%m-%d).log"}
# 日志目录
LOG_DIR=${LOG_DIR:-"log"}
mkdir -p ${LOG_DIR}/ && backup_gitlab >> ${LOG_DIR}/${LOG_FILE} 2>&1
Tip

注:备份不会备份gitlab.rbgitlab-secrets.json,需要自行备份

恢复或迁移

在新机器上启动实例后,把备份文件移动到对应目录

recovery.sh
backup_name="1710387127_2024_03_14_13.6.1"

docker exec -it gitlab bash

cd /var/opt/gitlab/backups/
chown git:git ${backup_name}_gitlab_backup.tar
# 填写_gitlab_backup.tar之前的字符串
gitlab-backup restore BACKUP=${backup_name}

然后输入两次yes

最后把旧机器上的gitlab.rbgitlab-secrets.json复制到新机器重启服务