安装DockerCompose
sh
#! /bin/sh
BASE_IP="192.168.150.101"
while getopts "i:" opt; do
case $opt in
i)
BASE_IP=$OPTARG
;;
?)
echo "unkonw argument"
exit 1
;;
esac
done
echo "========= start init CI/CD enviroment=========="
BASE_PATH=/usr/local/src
# --same-permissions 解压文件权限信息(默认只为超级用户服务)
tar -zxf $(pwd)/tjxt.env.tar.gz -C /usr/local/ --same-permissions
echo "=== 1.begin set JAVA_HOME==="
if command -v java &> /dev/null;then
java -version
echo "INFO:Already Install Jdk"
else
tee -a /etc/profile << EOF
export JAVA_HOME=${BASE_PATH}/java
export PATH=\$JAVA_HOME/bin:\$PATH
export CLASS_PATH=\$JAVA_HOME/lib
EOF
source /etc/profile
if command -v java &> /dev/null;then
echo "INFO:Jdk Install Success..."
else
echo "ERROR:Jdk Install Fail..." && exit 1
fi
fi
echo "=== 2.begin config command alias ==="
cp ${BASE_PATH}/.bashrc ~
source ~/.bashrc
echo "=== 3.begin docker compose ==="
# 设置jenkins用户,并关联docker
USER_NAME=jenkins
if id -u ${USER_NAME} >/dev/null 2>&1 ; then
echo "try create user jenkins"
else
useradd -U -m jenkins
fi
if id -u ${USER_NAME} >/dev/null 2>&1 ; then
echo "create user jenkins success"
fi
usermod -aG docker jenkins
usermod -aG root jenkins
chmod 777 /var/run/docker.sock
# 设置虚拟机真实IP
if [ $BASE_IP != "192.168.150.101" ];then
sed -i -e "s#192.168.150.101#${BASE_IP}#g" ${BASE_PATH}/jenkins/jobs/tjxt-dev-build/config.xml
sed -i -e "s#192.168.150.101#${BASE_IP}#g" ${BASE_PATH}/nginx/conf/nginx.conf
sed -i -e "s#192.168.150.101#${BASE_IP}#g" ${BASE_PATH}/gogs/gogs/conf/app.ini
fi
# 执行 DockerCompose 部署
dc -f ${BASE_PATH}/docker-compose.yml up -d
echo "=== 4.begin set cron to clean logs ==="
echo "0 21 * * * root sh ${BASE_PATH}/clean-docker-logs.sh" >> /etc/crontab
echo "========= init CI/CD enviroment success!! =========="
rm -f $(pwd)/tjxt.env.tar.gz
echo "===== please reboot your System ====="
.bashrc
sh
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dc='docker-compose'
alias dis='docker images'
alias dexe='docker exec -it'
alias dlog='docker logs'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
docker-compose.yml
yaml
version: "3.2"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: abc123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
restart: always
networks:
- new
nacos:
image: nacos/nacos-server:v2.1.0-slim
container_name: nacos
environment:
- MODE=standalone
- JVM_XMS=512m
- JVM_XMX=512m
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=abc123
- MYSQL_SERVICE_DB_NAME=nacos
- SPRING_DATASOURCE_PLATFORM=mysql
ports:
- "8848:8848"
restart: always
depends_on:
- mysql
networks:
- new
xxl-job:
image: xuxueli/xxl-job-admin:2.3.0
container_name: xxljob
ports:
- "8880:8880"
volumes:
- "./xxl-job/logs:/data/applogs"
- "./xxl-job/application.properties:/config/application.properties"
networks:
- new
restart: always
depends_on:
- mysql
seata:
image: seataio/seata-server
container_name: seata
ports:
- "8099:8099"
- "7099:7099"
environment:
SEATA_IP: 192.168.150.101
volumes:
- "./seata:/seata-server/resources"
networks:
- new
restart: always
depends_on:
- mysql
- nacos
gogs:
image: gogs/gogs:0.12
container_name: gogs
ports:
- "10022:22"
- "10880:3000"
environment:
TZ: Asia/Shanghai
volumes:
- "./gogs:/data"
networks:
- new
restart: always
depends_on:
- mysql
jenkins:
image: jenkins/jenkins:2.361.1-lts-jdk11
container_name: jenkins
ports:
- "18080:8080"
- "50000:50000"
environment:
- "JAVA_OPTS=-server -Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m"
volumes:
- "./jenkins:/var/jenkins_home"
- "/usr/bin/docker:/usr/bin/docker"
- "/var/run/docker.sock:/var/run/docker.sock"
restart: always
networks:
- new
mq:
image: rabbitmq:3.8-management
container_name: mq
hostname: mq
ports:
- "15672:15672"
- "5672:5672"
environment:
RABBITMQ_DEFAULT_USER: hmtt
RABBITMQ_DEFAULT_PASS: abc123
volumes:
- "./mq/plugins:/plugins"
- "./mq/data:/var/lib/rabbitmq"
- "./mq/conf:/etc/rabbitmq"
restart: always
networks:
- new
es:
image: elasticsearch:7.12.1
container_name: es
ports:
- "9200:9200"
- "9300:9300"
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.type=single-node"
volumes:
- "./es/data:/usr/share/elasticsearch/data"
- "./es/plugins:/usr/share/elasticsearch/plugins"
restart: always
networks:
- new
redis:
image: redis
container_name: redis
ports:
- "6379:6379"
volumes:
- "./redis/conf:/usr/local/etc/redis"
- "./redis/data:/tmp"
networks:
- new
restart: always
entrypoint: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
volumes:
- "./nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/etc/nginx/html"
restart: always
networks:
- new
networks:
new:
name: hmtt
clean-docker-logs.sh
sh
#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
重要配置文件 nginx.conf
nginx
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name git.tianji.com;
location / {
proxy_pass http://192.168.150.101:10880;
}
}
server {
listen 80;
server_name jenkins.tianji.com;
location / {
proxy_pass http://192.168.150.101:18080;
}
}
server {
listen 80;
server_name mq.tianji.com;
location / {
proxy_pass http://mq:15672;
}
}
server {
listen 80;
server_name nacos.tianji.com;
location / {
rewrite /(.*) /nacos/$1 break;
proxy_pass http://nacos:8848;
}
}
server {
listen 80;
server_name xxljob.tianji.com;
location / {
rewrite / /xxl-job-admin break;
proxy_pass http://xxljob:8880;
}
location /xxl-job-admin {
proxy_pass http://xxljob:8880;
}
}
server {
listen 80;
server_name es.tianji.com;
location / {
proxy_pass http://es:5601;
}
}
server {
listen 80;
server_name api.tianji.com;
location / {
proxy_set_header Host $host; # 传递原始Host头
proxy_pass http://192.168.150.101:10010;
# proxy_pass http://192.168.150.1:10010; # 由于要修改网关在本地测试,所以代理到本地IP
}
}
server {
listen 80;
server_name www.tianji.com;
location / {
root html/tj-portal;
index index.html index.htm;
# proxy_pass http://192.168.150.1:18082;
}
location /img-tx {
rewrite /img-tx/(.*) /$1 break;
proxy_pass http://wisehub-1312394356.cos.ap-shanghai.myqcloud.com;
}
}
server {
listen 80;
server_name manage.tianji.com;
location / {
root html/tj-admin;
index index.html index.htm;
# proxy_pass http://192.168.150.1:18081;
}
location /img-tx {
rewrite /img-tx/(.*) /$1 break;
proxy_pass http://wisehub-1312394356.cos.ap-shanghai.myqcloud.com;
}
}
}
xxl-job 的配置文件 application.yml
properties
### web
server.port=8880
server.servlet.context-path=/xxl-job-admin
### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=abc123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### xxl-job, access token
xxl.job.accessToken=tianji
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30