1 Star 1 Fork 1

rootegg / cicd

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
cicd.centos.sh 31.81 KB
一键复制 编辑 原始数据 按行查看 历史
rootegg 提交于 2024-04-29 21:15 . 消除默认master警告
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
#!/bin/bash
set e
# 跳过所有询问都是y
GLOBALY=$1
## 获取当前绝对目录
CURDIR=$(cd `dirname $0`; pwd)
## ip信息(已废除)
IPADDR="xx.xx.xx.xx" # ip
GATEWAY="x.xx.xx.xx" # 网关
NETMASK="255.255.255.0" # 子网掩码
DNS1="114.114.114.114"
DNS2="8.8.8.8"
OUTIP="" # 外网ip
## 引入配置信息
source $CURDIR/config.sh
## 默认设置系统时间上海
timedatectl set-timezone Asia/Shanghai
## 执行权限
chmod 777 -R $CURDIR
### 当前ip信息
function getNetwork(){
# 内网IP
CURWORKIP="$(ip addr | awk '/^[0-9]+: / {}; /inet.*global.*(enp|eth)/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')"
# 外网IP
OUTIP="$(curl ifconfig.me)"
}
function checkIp(){
getNetwork
printEchoFail "当前设备IP地址为:${CURWORKIP}${OUTIP}"
printEchoFail "the pc ip is:${CURWORKIP}${OUTIP}"
# 后续绑定ip用本机当前ip
IPADDR="${CURWORKIP}"
printEchoJump "后续Harbor和Jenkins、Gitlab将使用ip ${IPADDR}"
printEchoJump "later Harbora and Jenkins、Gitlab will use ip ${IPADDR}"
}
function resetIPADDR(){
# 1、获取网卡名 ls /sys/class/net/ | grep -P "^(ens|eth)\d+"
local ENSNAME=$(ls /sys/class/net/ | grep -P "^(ens|eth)\d+" | head -n 1)
local NETFILE="/etc/sysconfig/network-scripts/ifcfg-${ENSNAME}"
# 设置DNS
local hasDNS=$(cat $NETFILE | grep 'DNS1=114.114.114.114')
# 如果没有设置114 DNS
if [ -z "$hasDNS" ]; then
# 保存老DNS
local oldDNSArr=$(cat /etc/resolv.conf | awk '{print substr($2,0)}' | grep -P "^\d+.\d+.\d+.\d+$")
local INDEX=1
for od in $oldDNSArr
do
echo "DNS$INDEX=$od" >> $NETFILE
INDEX=$((INDEX+1))
done
# 后面三个DNS为了解决docker镜像失败问题
echo "DNS$INDEX=8.8.8.8" >> $NETFILE
INDEX=$((INDEX+1))
echo "DNS$INDEX=114.114.114.114" >> $NETFILE
INDEX=$((INDEX+1))
echo "DNS$INDEX=8.8.4.4" >> $NETFILE
systemctl restart network
fi
}
### 配置ip地址
function setNetwork() {
# 1、获取网卡名
local ENSNAME=$(ls /sys/class/net/ | grep -P "^(ens|eth)\d+" | head -n 1)
local NETFILE="/etc/sysconfig/network-scripts/ifcfg-${ENSNAME}"
printEchoSus "网卡配置文件地址: ${NETFILE}"
printEchoSus "the network config file: ${NETFILE}"
# 2、如果已配置,则删除已配置的IP
sed -i '/(MYSTART2\|IPADDR\|GATEWAY\|NETMASK\|DNS1\|DNS2\|MYEND2)=/d' ${NETFILE}
if [[ "$1" == "y" ]];then
# 3、设置追加静态ip地址
echo -e "IPADDR=\"${IPADDR}\"\nGATEWAY=\"${GATEWAY}\"\nNETMASK=\"${NETMASK}\"\nDNS1=\"${DNS1}\"\nDNS2=\"${DNS2}\"" >> ${NETFILE}
sed -i 's|BOOTPROTO=.*dhcp.*|BOOTPROTO="static"|g' ${NETFILE}
else
# 3、设置DHCP动态IP
sed -i 's|BOOTPROTO=.*static.*|BOOTPROTO="dhcp"|g' ${NETFILE}
resetIPADDR
fi
# 4、激活网卡
sed -i 's|ONBOOT=.*no.*|ONBOOT="yes"|g' ${NETFILE}
# 5、重启网卡服务
systemctl restart network
printEchoSus "IP配置完成,重启网卡成功."
printEchoSus "IP set up finish. network restart success"
}
# 服务器
function setCentosSystem() {
# ssh客户端一会断开问题
sed -i "s|#.*ClientAliveInterval.*|ClientAliveInterval 30|g" /etc/ssh/sshd_config
sed -i "s|#.*ClientAliveCountMax.*|ClientAliveCountMax 86400|g" /etc/ssh/sshd_config
service sshd restart
}
### ping联网测试
function testPing(){
if ping -c 1 -w 3 $1 >/dev/null;then
printEchoSus "测试访问 $1!success!"
printEchoSus "try ping $1!success!"
else
printEchoFail "try ping $1!fail!"
fi
}
### ping白名单测试
function testPingWhite(){
testPing "baidu.com"
testPing "mirrors.tuna.tsinghua.edu.cn"
# testPing "mirrors.aliyun.com"
# testPing "mirrors.fedoraproject.org"
# testPing "mirror-icn.yuki.net.uk"
# testPing "mirrors.fedoraproject.org"
# testPing "ung2thfc.mirror.aliyuncs.com"
# testPing "acs-cn-hangzhou-mirror.oss-cn-hangzhou.aliyuncs.com"
# testPing "docker.mirrors.ustc.edu.cn"
# testPing "auth.docker.io"
# testPing "registry-1.docker.io"
# testPing "registry.docker-cn.com"
# testPing "updates.jenkins.io"
# testPing "production.cloudflare.docker.com"
# testPing "hub-mirror.c.163.com"
# testPing "get.jenkins.io"
# testPing "registry.npmmirror.com"
testPing "download.docker.com"
# testPing "www.npmjs.com"
# testPing "registry.npmmirror.com"
# testPing "deb.debian.org"
}
### 设置yum软件
function setYumSoftware(){
### 设置国内镜像
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
# 清理缓存
yum makecache
printEchoSus "yum设置国内镜像源完成"
printEchoSus "yum source config china mirror finish"
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
printEchoSus "关闭了防火墙"
printEchoSus "turn off fireware finish"
#关闭selinx
setenforce 0
sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/sysconfig/selinux
#安装基础软件包
yum install -y wget lsof net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack yum-utils expect ntp
#同步服务器时间
systemctl stop vmtoolsd
ntpdate asia.pool.ntp.org
/sbin/hwclock --systohc
timedatectl set-ntp true
}
### 安装docker环境
function setDocker(){
yum makecache
#配置 docker-ce 国内 yum 源(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#突然报错还是用官网源
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#安装 docker 依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装 docker-ce
yum install -y docker-ce docker-ce-cli containerd.io
sleep 2
#设置开机启动
systemctl enable docker
#启动Docker服务
systemctl start docker
printEchoSus "docker服务已经启动!"
printEchoSus "docker service started!"
# 安装docker compose
# 从当前目录拷贝docker-compose到可执行文件
cp ./docker-compose /usr/local/bin/docker-compose
#修改执行权限
chmod +x /usr/local/bin/docker-compose
#软连接映射到/usr/bin/
ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
#验证
docker-compose version
printEchoSus "docker compose 安装成功!"
printEchoSus "docker compose installed finish!"
}
#### 配置deamon.json
function setDaemon(){
# 覆盖deamon.json文件
mkdir -p /etc/docker
echo -e "{
\"registry-mirrors\": [
\"https://s1qalke8.mirror.aliyuncs.com\",
\"https://registry.docker-cn.com\",
\"http://hub-mirror.c.163.com\",
\"https://docker.mirrors.ustc.edu.cn\"
],
\"insecure-registries\":[\"${IPADDR}:${PORT_HARBOR}\",\"${OUTIP}:${PORT_HARBOR}\"],
\"log-driver\": \"json-file\",
\"log-opts\": {
\"max-size\": \"100m\",
\"max-file\": \"3\",
\"labels\": \"production_status\",
\"env\": \"os,customer\"
}
}" > /etc/docker/daemon.json
# 停顿2秒
sleep 2
## 重启docker
systemctl daemon-reload
systemctl restart docker
printEchoSus "重启docker完成"
printEchoSus "docker restart finish"
}
## 安装Harbor
function setHarbor(){
# 从本地文件载入镜像
docker load --input goharbor_harbor-core_v2.8.3.tar
docker load --input goharbor_harbor-db_v2.8.3.tar
docker load --input goharbor_harbor-jobservice_v2.8.3.tar
docker load --input goharbor_harbor-log_v2.8.3.tar
docker load --input goharbor_harbor-portal_v2.8.3.tar
docker load --input goharbor_harbor-registryctl_v2.8.3.tar
docker load --input goharbor_nginx-photon_v2.8.3.tar
docker load --input goharbor_redis-photon_v2.8.3.tar
docker load --input goharbor_registry-photon_v2.8.3.tar
docker load --input goharbor_prepare_v2.8.3.tar
#解压harbor安装包,下载地址 https://github.com/goharbor/harbor/releases/tag/
tar xf ./harbor-online-installer-v2.8.3.tgz -C ${ROOTFOLDER}/asetup/
#拷贝harbor.yml文件
cp ${ROOTFOLDER}/asetup/harbor/harbor.yml.tmpl ${ROOTFOLDER}/asetup/harbor/harbor.yml
#修改harbor.yml文件中ip和端口
printEchoSus "修改harbor.yml文件中hostname和port"
printEchoSus "change harbor.yml file hostname and port"
sed -i "s|hostname: reg.mydomain.com|hostname: ${IPADDR}|g" ${ROOTFOLDER}/asetup/harbor/harbor.yml
sed -i "s|port: 80|port: ${PORT_HARBOR}|g" ${ROOTFOLDER}/asetup/harbor/harbor.yml
sed -i "s|data_volume: /data|data_volume: ${ROOTFOLDER}/harbor/data|g" ${ROOTFOLDER}/asetup/harbor/harbor.yml
printEchoSus "删除harbor.yml中https配置项"
printEchoSus "remove https config in harbor.yml"
sed -i "13,18d" ${ROOTFOLDER}/asetup/harbor/harbor.yml
#执行安装脚本
sh ${ROOTFOLDER}/asetup/harbor/install.sh
#设置开机启动
isFileExit "/etc/rc.d/init.d/etcstartall.sh"
if [ $? -eq 1 ]
then
# 服务存在先删除
chkconfig --del etcstartall.sh
fi
local OLDPATH=$(pwd)
rm -rf /etc/rc.d/init.d/etcstartall.sh
cp ./etcstartall.sh /etc/rc.d/init.d/
cd /etc/rc.d/init.d/
chmod +x etcstartall.sh
chkconfig --add etcstartall.sh
chkconfig etcstartall.sh on
cd ${OLDPATH}
#把启动脚本加到系统启动之后最后一个执行的文件
printEcho "等待2分钟,正在安装Harbor..."
printEcho "waiting 2 minites,now installing Harbor..."
sleep 120
printEchoSus "Harbor设置开机启动成功!启动文件:/etc/rc.d/init.d/etcstartall.sh"
printEchoSus "Harbor set turn on when reboot!reboot config file:/etc/rc.d/init.d/etcstartall.sh"
printEchoSus "Harbor安装完成,账号 admin 密码 Harbor12345 ,请查看 http://${IPADDR}:${PORT_HARBOR}"
printEchoSus "Harbor install finish,default account admin password Harbor12345 ,open browser http://${IPADDR}:${PORT_HARBOR}"
}
## 安装Verdaccio私服
function setVerdaccio(){
# 从本地文件载入镜像
docker load --input verdaccio_v5.26.1.tar
# 创建挂载目录
printEchoSus "创建Verdaccio挂载目录:${ROOTFOLDER}/verdaccio"
printEchoSus "create Verdaccio volumn folder:${ROOTFOLDER}/verdaccio"
mkdir -p ${ROOTFOLDER}/verdaccio/conf
mkdir -p ${ROOTFOLDER}/verdaccio/storage
chmod 777 ${ROOTFOLDER}/verdaccio
# 设置配置文件
echo 'storage: /verdaccio/storage
auth:
htpasswd:
file: /verdaccio/conf/htpasswd
uplinks:
npmjs:
url: https://registry.npmmirror.com/
packages:
"@cy/*":
access: $all
publish: $authenticated
proxy: npmjs
"@*/*":
access: $all
publish: $authenticated
proxy: npmjs
"**":
access: $anonymous
proxy: npmjs
logs:
- {type: stdout, format: pretty, level: http}' > ${ROOTFOLDER}/verdaccio/conf/config.yaml
# 设置密码文件,空内容即可
echo "" >> ${ROOTFOLDER}/verdaccio/conf/htpasswd
# 设置权限
chown 10001:65533 ${ROOTFOLDER}/verdaccio/conf/htpasswd
chown 10001:65533 ${ROOTFOLDER}/verdaccio/storage
# 启动容器
# 当前 5.26.1,没使用 dockerproxy.com/verdaccio/verdaccio,的5.26.2,这个差距不大不影响
docker run -d --restart always --name verdaccio --privileged=true -p ${PORT_VERDACCIO}:4873 -v ${ROOTFOLDER}/verdaccio/storage:/verdaccio/storage -v ${ROOTFOLDER}/verdaccio/conf:/verdaccio/conf -v ${ROOTFOLDER}/verdaccio/plugins:/verdaccio/plugins verdaccio/verdaccio:5.26.1
# 安装
printEcho "等待2分钟,正在安装Verdaccio..."
printEcho "waiting 2 minites,now install Verdaccio..."
sleep 120
printEchoSus "Verdaccio安装完成,请查看 http://${IPADDR}:${PORT_VERDACCIO}"
printEchoSus "Verdaccio install finish,open browser http://${IPADDR}:${PORT_VERDACCIO}"
}
## 安装 Sentry
function setSentry(){
# 若要清空 sentry,重新安装,先执行reset.sh脚本
# cd self-hosted-23.12.1
# ./scripts/reset.sh --no-report-self-hosted-issues
# 使用 https://github.com/getsentry/self-hosted 脚本部署 sentry
chmod 777 -R $CURDIR/self-hosted-23.12.1
cd $CURDIR/self-hosted-23.12.1
# 修改权限
chmod 777 install.sh
chmod 777 scripts/reset.sh
chmod 777 geoip/GeoIP.conf
chmod 777 postgres/init_hba.sh
chmod 777 postgres/postgres-entrypoint.sh
chmod 777 sentry/entrypoint.sh
chmod 777 cron/entrypoint.sh
# 这里为了避免中间弹出prompt提示创建超级用户,
# 使用skip-user-creation选项跳过了了超级用户创建
# 后续会有单独的步骤创建超级用户
./install.sh --no-report-self-hosted-issues --skip-user-creation
# 上面安装过程很慢,大概用了2个小时才跑完
printEcho "等待1分钟,正在安装Sentry..."
printEcho "waiting 1 minites,now install Sentry..."
sleep 10
# 创建超级用户
# 将email替换成你的管理员email, password做相应替换
docker-compose --ansi never run --rm web createuser --force-update --superuser --email root@a.com --password Sentry12345
# 启动服务
docker-compose up -d
printEcho "管理员邮箱 root@a.com,密码 Sentry12345"
printEcho "email: root@a.com , password: Sentry12345"
cd $CURDIR
}
## 安装Gitlab
function setGitlab(){
printEchoQs "Gitlab使用什么ip显示呢,默认输入y使用内网ip是${IPADDR},输入n则使用外网ip是${OUTIP}?【输入y/n】"
printEchoQs "Gitlab use OUTIP or INNERIP?( input y/n )"
read step_gitlab_ip
local GITLABIP="$IPADDR"
if [[ "$step_gitlab_ip" == "n" ]];then
GITLABIP="$OUTIP"
fi
# 创建挂载目录
printEchoSus "创建Gitlab挂载目录:${ROOTFOLDER}/gitlab"
printEchoSus "create Gitlab volumn folder:${ROOTFOLDER}/gitlab"
mkdir -p ${ROOTFOLDER}/gitlab/config
mkdir -p ${ROOTFOLDER}/gitlab/logs
mkdir -p ${ROOTFOLDER}/gitlab/data
chmod 777 ${ROOTFOLDER}/gitlab
# 先启动容器获取配置文件,再修改gitlab.rb中url和nginx端口,再删除当前容器,再用新端口映射,而不是默认80映射了
# https://blog.csdn.net/Wai_Leung/article/details/107384419
# 当前版本 14.6.1 发现下载不了,只能用latest,这里不采用 dockerproxy.com/gitlab/gitlab-ce:latest版本,发现会服务器卡死,内存占用太大
docker run --detach \
--publish ${PORT_GITLAB}:80 \
--name gitlab \
--privileged=true \
--volume ${ROOTFOLDER}/gitlab/config:/etc/gitlab \
--volume ${ROOTFOLDER}/gitlab/logs:/var/log/gitlab \
--volume ${ROOTFOLDER}/gitlab/data:/var/opt/gitlab \
--shm-size 256m \
gitlab/gitlab-ce:latest
printEcho "等待10分钟,正在安装Gitlab..."
printEcho "waiting 10 minites,now install Gitlab..."
sleep 300
# 修改clone显示地址
sed -i "s|# external_url .*|external_url 'http://${GITLABIP}:${PORT_GITLAB}'|g" ${ROOTFOLDER}/gitlab/config/gitlab.rb
sed -i "s|# nginx\['listen_port'\] .*|nginx['listen_port'] = ${PORT_GITLAB}|g" ${ROOTFOLDER}/gitlab/config/gitlab.rb
# 修改进程和内存
sed -i "s|# puma\['worker_processes'\] .*|puma['worker_processes'] = 2|g" ${ROOTFOLDER}/gitlab/config/gitlab.rb
sed -i "s|# puma\['per_worker_max_memory_mb'\] .*|puma['per_worker_max_memory_mb'] = 1024|g" ${ROOTFOLDER}/gitlab/config/gitlab.rb
# 定义https和ssh端口
local HTTPS_PORT=$(($PORT_GITLAB+1))
local SSH_PORT=$(($PORT_GITLAB+2))
# 先不管https和http
# sed -i "s|# gitlab_rails['gitlab_ssh_host'] .*|gitlab_rails['gitlab_ssh_host'] = '${IPADDR}'|g" ${ROOTFOLDER}/gitlab/config/gitlab.rb
# sed -i "s|# gitlab_rails['gitlab_shell_ssh_port'] .*|gitlab_rails['gitlab_shell_ssh_port'] = ${SSH_PORT}|g" ${ROOTFOLDER}/gitlab/config/gitlab.rb
# 删除容器
docker rm -f gitlab
sleep 2
# 重新启动启动容器
docker run --detach \
--publish ${PORT_GITLAB}:${PORT_GITLAB} --publish ${HTTPS_PORT}:443 --publish ${SSH_PORT}:22 \
--name gitlab \
--privileged=true \
--restart always \
--volume ${ROOTFOLDER}/gitlab/config:/etc/gitlab \
--volume ${ROOTFOLDER}/gitlab/logs:/var/log/gitlab \
--volume ${ROOTFOLDER}/gitlab/data:/var/opt/gitlab \
--shm-size 256m \
gitlab/gitlab-ce:latest
sleep 300
# 获取root密码
# local INITPWD="gitlab的root账号初始$(docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password)"
# printEchoSus "Gitlab已启动,请访问:http://${IPADDR}:${PORT_GITLAB},${INITPWD}"
# printEchoSus "Gitlab started,open browser:http://${IPADDR}:${PORT_GITLAB},${INITPWD}"
# printEchoSus "请在24小时内进入页面修改root账号密码,否则密码会失效!"
# printEchoSus "please edit root password soon, it will lost after 24 hours!"
sleep 2
# 如果超时或者忘记root密码,请重置
# docker exec -it gitlab bash
# gitlab-rake "gitlab:password:reset[root]"
# 重置密码
docker exec gitlab gitlab-rails runner -e production 'user = User.find(1); user.password = "Gitlab12345"; user.password_confirmation = "Gitlab12345"; user.save!'
printEchoSus "Gitlab已启动,请访问:http://${GITLABIP}:${PORT_GITLAB},账号 root 密码 Gitlab12345"
printEchoSus "Gitlab started,open browser:http://${GITLABIP}:${PORT_GITLAB},root / Gitlab12345"
}
## 安装Jenkins
function setJenkins(){
mkdir -p ${ROOTFOLDER}/jenkins
chmod 777 ${ROOTFOLDER}/jenkins
local HPORT=$(($PORT_JENKINS+1))
# 给Jenkins容器添加 node,npm,yarn命令
local NODEVERSION="node-v16.20.1-linux-x64"
tar -xf ${NODEVERSION}.tar.xz
mv ${NODEVERSION} ${ROOTFOLDER}/jenkins
local YARNVERSION="yarn-v1.22.10"
tar -xf ${YARNVERSION}.tar.gz
mv ${YARNVERSION} ${ROOTFOLDER}/jenkins/
local MAVENVERSION="apache-maven-3.9.6"
tar -xf ${MAVENVERSION}-bin.tar.gz
mv ${MAVENVERSION} ${ROOTFOLDER}/jenkins/
# 用root进入,否则默认是jenkins账号登录,内部没有docker权限
printEcho "等待3分钟,正在安装Jenkins..."
printEcho "waiting 3 minites,now install Jenkins..."
# 启动容器
# 这里注意,使用了国内代理获取镜像会获取到latst最新版本镜像,不然直接jenkins/jenkins只能获取较低版本的镜像,导致插件安装失败,当前2023.09.14最新版 jenkins/jenkins:2.423,我服务器安装的2.417版本
# 可以通过 https://updates.jenkins.io/download/war/ 查询到最新版
docker run -d --restart always -e PHP_TZ="Asia/Shanghai" --privileged=true -p ${PORT_JENKINS}:8080 -p ${HPORT}:50000 -u root -v ${ROOTFOLDER}/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker --name jenkins dockerproxy.com/jenkins/jenkins
sleep 120
# 设置软连接
docker exec -it jenkins bash -c "ln -s /var/jenkins_home/${NODEVERSION}/bin/node /usr/local/bin"
sleep 1
docker exec -it jenkins bash -c "ln -s /var/jenkins_home/${NODEVERSION}/bin/npm /usr/local/bin"
sleep 1
docker exec -it jenkins bash -c "ln -s /var/jenkins_home/${YARNVERSION}/bin/yarn /usr/local/bin"
sleep 1
docker exec -it jenkins bash -c "npm config set registry https://registry.npmmirror.com/"
sleep 1
docker exec -it jenkins bash -c "yarn global add pnpm"
sleep 1
docker exec -it jenkins bash -c "ln -s /var/jenkins_home/${MAVENVERSION}/bin/mvn /usr/local/bin"
sleep 1
# 添加防火墙
# firewall-cmd --zone=public --add-port=8099/tcp --permanent
# systemctl restart firewalld
# firewall-cmd --zone=public --list-ports
# 修改插件更新地址
sed -i "s|<url>https://updates.jenkins.io/update-center.json</url>|<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>|g" ${ROOTFOLDER}/jenkins/hudson.model.UpdateCenter.xml
docker restart jenkins
sleep 60
# 打印成功
local INITPWD="$(cat ${ROOTFOLDER}/jenkins/secrets/initialAdminPassword)"
printEchoSus "jenkins已启动,请访问:http://${IPADDR}:${PORT_JENKINS},jenkins初始密码:${INITPWD}"
printEchoSus "请访问页面,默认安装插件即可,当前是jenkins最新版!"
printEchoSus "jenkins started,open browser:http://${IPADDR}:${PORT_JENKINS},jenkins default password:${INITPWD}"
printEchoSus "please browser site,install the default plugins,now jenkins is latest version!"
# 写入log.jenkins.txt方便后面nginxproxy使用
echo "${INITPWD}" > log.jenkins.txt
isExistFolder "${ROOTFOLDER}/nginx/html"
if [[ $? -eq 1 ]]
then
rm -rf ${ROOTFOLDER}/nginx/html/log.jenkins.txt
cp log.jenkins.txt ${ROOTFOLDER}/nginx/html/
fi
# 设置SSH免密登录
# sleep 1
# docker exec -it jenkins bash -c "ssh-keygen -t rsa -P \"\" -f ~/.ssh/id_rsa"
# sleep 1
# printEchoSus "请输入当前服务器root密码"
# printEchoSus "please input current server root account password"
# docker exec -it jenkins bash -c "ssh-copy-id -i ~/.ssh/id_rsa.pub root@$IPADDR"
}
## 启动nginx转发cores
function setNginxProxy(){
mkdir -p ${ROOTFOLDER}/nginx/html
mkdir -p ${ROOTFOLDER}/nginx/log
printEcho "等待10秒,正在安装Nginx..."
printEcho "waiting 10 seconds,now installing Nginx..."
docker run -p ${PORT_NGINX_PROXY}:80 --name nginxproxy --privileged=true -d nginx:latest
sleep 3
docker cp nginxproxy:/etc/nginx ${ROOTFOLDER}
docker cp nginxproxy:/usr/share/nginx/html ${ROOTFOLDER}/nginx
sleep 3
docker rm -f nginxproxy
## 替换default.conf并重新运行nginx
rm -rf ${ROOTFOLDER}/nginx/conf.d/default.conf
cp nginx.default.conf ${ROOTFOLDER}/nginx/conf.d/default.conf
# 修改pipeline.groovy内容
sed -i "s|gitServer = '.*'|gitServer = '${IPADDR}:${PORT_GITLAB}'|g" pipeline.groovy
sed -i "s|harborServer = '.*'|harborServer = '${IPADDR}:${PORT_HARBOR}'|g" pipeline.groovy
sed -i "s|webHtmlServer = '.*'|webHtmlServer = '${IPADDR}'|g" pipeline.groovy
sed -i "s|testApiServer = '.*'|testApiServer = 'http:\/\/${IPADDR}:8088'|g" pipeline.groovy
## 修改nginx.default.conf内变量
rm -rf ${ROOTFOLDER}/nginx/html/pipeline.groovy
cp pipeline.groovy ${ROOTFOLDER}/nginx/html/
## 重新启动nginx
local NGINX_HTTPS_PORT=$(($PORT_NGINX_PROXY+1))
docker run -p ${PORT_NGINX_PROXY}:80 -p ${NGINX_HTTPS_PORT}:443 --restart always \
--name nginxproxy \
--privileged=true \
-v ${ROOTFOLDER}/nginxproxy:/etc/nginx \
-v ${ROOTFOLDER}/nginxproxy/log:/var/log/nginx \
-v ${ROOTFOLDER}/nginxproxy/html:/usr/share/nginx/html \
-d nginx:latest
sleep 3
printEchoSus "nginx已启动,请访问:http://${IPADDR}:${PORT_NGINX_PROXY}"
printEchoSus "nginx started,open browser:http://${IPADDR}:${PORT_NGINX_PROXY}"
# 拷贝过来log.jenkins.txt
local INITPWD="$(cat ${ROOTFOLDER}/jenkins/secrets/initialAdminPassword)"
echo "${INITPWD}" > log.jenkins.txt
isFileExit "${ROOTFOLDER}/cicd/log.jenkins.txt"
if [[ $? -eq 1 ]]
then
rm -rf ${ROOTFOLDER}/nginx/html/log.jenkins.txt
cp ${ROOTFOLDER}/cicd/log.jenkins.txt ${ROOTFOLDER}/nginx/html/
fi
# 把内网ip给前端使用,避免使用127.0.0.1
echo "${IPADDR}" > ${ROOTFOLDER}/nginx/html/log.ip.txt
}
## 导入默认项目vuetest到Gitlab中
function setImportVuetest(){
cd $CURDIR/vuetest
# local InitPwd=$(docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password | awk '{print substr($2,0)}')
rm -rf .git
git init
git config user.name "root"
git config user.email "root@a.com"
git config --global init.defaultBranch master
#git config user.password "$InitPwd"
#git config credential.helper store
git add .
git commit --quiet -m "init"
git remote add origin http://${IPADDR}:${PORT_GITLAB}/root/vuetest.git
expect -c "
spawn git push -u origin master
expect \"Username for*\"
send \"root\r\"
expect \"Password for*\"
send \"Gitlab12345\r\"
expect eof
"
cd $CURDIR
}
## 导入默认项目scm-pipeline到Gitlab中
function setImportScmPipeline(){
cd $CURDIR/scm-pipeline
# local InitPwd=$(docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password | awk '{print substr($2,0)}')
rm -rf .git
git init
git config user.name "root"
git config user.email "root@a.com"
#git config user.password "$InitPwd"
#git config credential.helper store
git add .
git commit --quiet -m "init"
git remote add origin http://${IPADDR}:${PORT_GITLAB}/root/scm-pipeline.git
expect -c "
spawn git push -u origin master
expect \"Username for*\"
send \"root\r\"
expect \"Password for*\"
send \"Gitlab12345\r\"
expect eof
"
cd $CURDIR
}
## 判定容器是否存在 shell 返回值只能 0-255
function isContainerExit(){
local NAME=$(docker inspect $1 2> /dev/null)
if [[ "$NAME" == "[]" ]];then
# 不存在
return 101
fi
}
## 判定文件是否存在
function isFileExit(){
# -f 参数判断 $file 是否存在
if [ ! -f "$1" ]; then
return 101
fi
return 1
}
## 判定文件夹是否存在
function isExistFolder(){
if [ ! -d "$1" ]; then
return 101
fi
return 1
}
## 打印格式化询问
function printEchoQs(){
local msg="\e[33m$1\e[0m"
echo -e ${msg}
echo -e "${msg}\n" >> ${INSTALL_LOG}
}
## 打印格式化跳过
function printEchoJump(){
local msg="\e[34m$1\e[0m"
echo -e ${msg}
echo -e "${msg}\n" >> ${INSTALL_LOG}
}
## 打印格式化成功
function printEchoSus(){
local msg="\e[32m$1\e[0m"
echo -e ${msg}
echo -e "${msg}\n" >> ${INSTALL_LOG}
}
## 打印格式化失败
function printEchoFail(){
local msg="\e[31m$1\e[0m"
echo -e ${msg}
echo -e "${msg}\n" >> ${INSTALL_LOG}
}
## 打印普通描述
function printEcho(){
local msg="$1"
echo -e ${msg}
echo -e "${msg}\n" >> ${INSTALL_LOG}
}
printEchoSus "提示:根目录 ${ROOTFOLDER},后续所有容器挂载都在此目录下,配置文件在 ${ROOTFOLDER}/asetup 下"
printEchoSus "tips:the root folder is ${ROOTFOLDER},all container volumns will volumn in,all config file in ${ROOTFOLDER}/asetup folder"
mkdir -p ${ROOTFOLDER}/asetup
######## 不再询问是否改过ip #########
# checkIp
# printEchoQs "是否更换IP,通常情况都n跳过?【输入y/n】"
# printEchoQs "is change IP,almose input n is ok?( input y/n )"
# read step_ip_set
# if [[ "$step_ip_set" == "n" ]];then
# printEchoJump "您跳过了设置IP"
# printEchoJump "you jump change IP step"
# resetIPADDR
# else
# printEchoQs "是否设置静态IP,输入y表示静态ip,n表示动态ip?【输入y/n】"
# printEchoQs "is set static ip,input y for static ip,input n for dhcp ip?( input y/n )"
# read step_ip_static
# setNetwork $step_ip_static
# fi
###########服务器设置##############
checkIp
# resetIPADDR
# setCentosSystem
##################################
printEchoQs "开始测试访问白名单网络地址"
printEchoQs "try test ping white site"
testPingWhite
printEchoQs "是否用yum安装基础软件?【输入y/n】"
printEchoQs "is install basic software by yum?( input y/n )"
read step_yum
if [[ "$step_yum" == "y" ]];then
setYumSoftware
else
printEchoJump "您跳过了yum安装基础软件"
printEchoJump "you jump install basic software by yum"
fi
printEchoQs "是否安装docker环境?【输入y/n】"
printEchoQs "is install docker?( input y/n )"
read step_docker
if [[ "$step_docker" == "y" ]];then
setDocker
else
printEchoJump "您跳过了安装docker环境"
printEchoJump "you jump install docker"
# 判定docker是否已设置开机启动
isFileExit "/usr/lib/systemd/system/docker.service"
if [ $? -eq 101 ]
then
systemctl enable docker
fi
# 判定docker是否已启动
netstat -anp | grep docker &> /dev/null
if [ $? -ne 0 ]
then
systemctl start docker
printEchoSus "docker服务已经启动!"
printEchoSus "docker service started!"
fi
fi
printEchoQs "是否配置daemon,修改docker镜像源和Harbor仓库地址?【输入y/n】"
printEchoQs "is set daemon,for change docker mirror source and recognize Harbor repository address?( input y/n )"
read step_daemon
if [[ "$step_daemon" == "y" ]];then
setDaemon
else
printEchoJump "您跳过了配置daemon"
printEchoJump "you jump set daemon"
fi
printEchoQs "是否安装Harbor?【输入y/n】"
printEchoQs "is install Harbor?( input y/n )"
read step_harbor
if [[ "$step_harbor" == "y" ]];then
# 检查是否在运行,只检查其中一容器
isContainerExit "harbor-core"
if [[ $? -eq 101 ]]
then
setHarbor
else
printEchoFail "Harbor容器已存在,跳过重复安装"
printEchoFail "Harbor name container is exist,jump repeat install"
fi
else
printEchoJump "您跳过了安装Harbor"
printEchoJump "you jump install Harbor"
fi
printEchoQs "是否安装Verdaccio?【输入y/n】"
printEchoQs "is install Verdaccio?( input y/n )"
read step_verdaccio
if [[ "$step_verdaccio" == "y" ]];then
# 检查是否在运行
isContainerExit "verdaccio"
if [[ $? -eq 101 ]]
then
setVerdaccio
else
printEchoFail "Verdaccio容器已存在,跳过重复安装"
printEchoFail "Verdaccio name container is exist,jump repeat install"
fi
else
printEchoJump "您跳过了安装Verdaccio"
printEchoJump "you jump install Verdaccio"
fi
printEchoQs "是否安装Sentry?【输入y/n】"
printEchoQs "is install Sentry?( input y/n )"
read step_sentry
if [[ "$step_sentry" == "y" ]];then
# 检查是否在运行
isContainerExit "sentry"
if [[ $? -eq 101 ]]
then
setSentry
else
printEchoFail "Sentry容器已存在,跳过重复安装"
printEchoFail "Sentry name container is exist,jump repeat install"
fi
else
printEchoJump "您跳过了安装Sentry"
printEchoJump "you jump install Sentry"
fi
printEchoQs "是否安装Gitlab?【输入y/n】"
printEchoQs "is install Gitlab?( input y/n )"
read step_gitlab
if [[ "$step_gitlab" == "y" ]];then
# 检查是否在运行
isContainerExit "gitlab"
if [[ $? -eq 101 ]]
then
setGitlab
else
printEchoFail "Gitlab容器已存在,跳过重复安装"
printEchoFail "Gitlab name container exist,jump repeat install"
fi
else
printEchoJump "您跳过了安装Gitlab"
printEchoJump "you jump install Gitlab"
fi
printEchoQs "是否安装Jenkins?【输入y/n】"
printEchoQs "is install Jenkins?( input y/n )"
read step_jenkins
if [[ "$step_jenkins" == "y" ]];then
# 检查是否在运行
isContainerExit "jenkins"
if [[ $? -eq 101 ]]
then
setJenkins
else
printEchoFail "Jenkins容器已存在,跳过重复安装"
printEchoFail "Jenkins name container exist,jump repeat install"
fi
else
printEchoJump "您跳过了安装Jenkins"
printEchoJump "you jump install Jenkins"
fi
printEchoQs "是否安装Nginx代理?【输入y/n】"
printEchoQs "is install nginx proxy?( input y/n )"
read step_nginx
if [[ "$step_nginx" == "y" ]];then
# 检查是否在运行
isContainerExit "nginxproxy"
if [[ $? -eq 101 ]]
then
setNginxProxy
else
printEchoFail "Nginx容器已存在,跳过重复安装"
printEchoFail "Nginx name container exist,jump repeat install"
fi
else
printEchoJump "您跳过了安装Nginx"
printEchoJump "you jump install Nginx"
fi
printEchoQs "是否导入Gitlab默认项目vuetest?【输入y/n】"
printEchoQs "is import default vuetest project to Gitlab?( input y/n )"
read step_vuetest
if [[ "$step_vuetest" == "y" ]];then
# 检查是否已存在默认项目
isExistFolder "${ROOTFOLDER}/gitlab/workspace/vuetest"
if [[ $? -eq 101 ]]
then
# 导入两遍,第一遍报没权限,第二遍可导入
setImportVuetest >> ${INSTALL_LOG}
setImportVuetest >> ${INSTALL_LOG}
setImportScmPipeline >> ${INSTALL_LOG}
setImportScmPipeline >> ${INSTALL_LOG}
printEchoSus "Gitlab中导入成功vuetest"
printEchoSus "Gitlab alread import vuetest finish"
else
printEchoFail "Gitlab中已存在默认项目vuetest,跳过重复导入"
printEchoFail "Gitlab alread exist default project vuetest,jump repeat import"
fi
else
printEchoJump "您跳过了入Gitlab默认项目vuetest"
printEchoJump "you jump import default vuetest project to Gitlab"
fi
# 安装结束
printEchoFail "所有shell流程执行完毕,后续请打开浏览器执行油猴脚本。"
printEchoFail "all shell process install finish,pleae open browser install TamperMonkey script。"
printEchoSus "请查看 http://${IPADDR}:${PORT_JENKINS}"
1
https://gitee.com/rootegg/cicd.git
git@gitee.com:rootegg/cicd.git
rootegg
cicd
cicd
master

搜索帮助