CI/CD 搭建 部署 java 项目 并打成 镜像 运行
Jenkins
Gitlab
CI/CD搭建 部署 GO 项目
物理机配置
- gitlab: 2核4G
- jenkins: 2核4G
- docker: 2核2G
安装 docker 脚本
#!/bin/bash
echo "remove old docker"
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
echo "install yum-utils"
yum install -y yum-utils
echo "config-manager"
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
echo "install docker"
yum install docker-ce docker-ce-cli containerd.io
echo "start docker"
systemctl enable docker
systemctl start docker
启动 gitlab (部署方式 docker)
-
创建目录
mkdir -p /opt/gitlab/{data/,logs,config/}
-
部署服务
docker run -d --restart=always \ --hostname gitlab --name=gitlab \ -p 5443:443 -p 90:80 -p 1122:22 \ -v /etc/localtime:/etc/localtime \ -v /opt/gitlab/config:/etc/gitlab \ -v /opt/gitlab/logs:/var/log/gitlab \ -v /opt/gitlab/data:/var/opt/gitlab \ registry.cn-shenzhen.aliyuncs.com/yjy_k8s/gitlab:v15.4.2
-
修改配置文件
vi /opt/gitlab/config/gitlab.rb ## 以下是配置项 ip 地址改为本机的公网 ip # 修改 http 访问地址 external_url 'http://172.16.222.250:90' # 修改了 http 端口同时也要修改 nginx 端口 nginx['listen_port'] = 80 # 修改 ssh 访问地址 gitlab_rails['gitlab_ssh_host'] = '172.16.222.250' # 修改 ssh 端口为上面 docker run 设置的端口 gitlab_rails['gitlab_shell_ssh_port'] = 1122 # 关闭容器仓库功能 gitlab_rails['gitlab_default_projects_features_container_registry'] = false gitlab_rails['registry_enabled'] = false registry['enable'] = false registry_nginx['enable'] = false # 包仓库、依赖管理 gitlab_rails['packages_enabled'] = false gitlab_rails['dependency_proxy_enabled'] = false # GitLab Pages gitlab_pages['enable'] = false pages_nginx['enable'] = false # 关闭监控和性能基准相关功能 prometheus_monitoring['enable'] = false alertmanager['enable'] = false node_exporter['enable'] = false redis_exporter['enable'] = false postgres_exporter['enable'] = false pgbouncer_exporter['enable'] = false gitlab_exporter['enable'] = false grafana['enable'] = false sidekiq['metrics_enabled'] = false # Usage Statistics gitlab_rails['usage_ping_enabled'] = false gitlab_rails['sentry_enabled'] = false grafana['reporting_enabled'] = false # GitLab KAS gitlab_kas['enable'] = false gitlab_rails['gitlab_kas_enabled'] = false # Terraform gitlab_rails['terraform_state_enabled'] = false # Kerberos 文档说EE only,但是默认值为 true gitlab_rails['kerberos_enabled'] = false # Sentinel sentinel['enable'] = false # Mattermost mattermost['enable'] = false mattermost_nginx['enable'] = false # 降低后台守护进程并发数 sidekiq['max_concurrency'] = 5 # 关闭电子邮件相关功能 gitlab_rails['smtp_enable'] = false gitlab_rails['gitlab_email_enabled'] = false gitlab_rails['incoming_email_enabled'] = false # 关闭 CI 功能 gitlab_ci['gitlab_ci_all_broken_builds'] = false gitlab_ci['gitlab_ci_add_pusher'] = false # 减少数据库并发数。默认为 8 postgresql['max_worker_processes'] = 4 # 减少数据库缓存。默认为 256MB postgresql['shared_buffers'] = "128MB" # 禁用 puma puma['worker_processes'] = 0 puma['min_threads'] = 1 puma['max_threads'] = 2 #gitaly['cgroups_mountpoint'] = '/sys/fs/cgroup' gitaly['cgroups_hierarchy_root'] = 'gitaly' gitaly['cgroups_cpu_shares'] = 512 gitaly['concurrency'] = [ { 'rpc' => "/gitaly.SmartHTTPService/PostReceivePack", 'max_per_repo' => 3 }, { 'rpc' => "/gitaly.SSHService/SSHUploadPack", 'max_per_repo' => 3 } ] # 在结尾添加以下配置 gitlab_rails['env'] = { 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000' } gitaly['env'] = { 'LD_PRELOAD' => '/opt/gitlab/embedded/lib/libjemalloc.so', 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000', 'GITALY_COMMAND_SPAWN_MAX_PARALLEL' => '2' } #gitaly['cgroups_count'] = 2 gitaly['cgroups_memory_enabled'] = true gitaly['cgroups_memory_limit'] = 500000 gitaly['cgroups_cpu_enabled'] = true
-
重启 gitlab
docker restart gitlab
-
访问 gitlab http://43.137.7.130:90/ 首次登录 使用 root 用户登录
# 获取首次登录密码 cat /opt/gitlab/config/initial_root_password ## Password: QWCgeYWFuK7XCKdNqftmxDIpS9mqyxrPo8stxqGBaiI=
到此 gitlab 就是部署完成了!!
启动 Jenkins (部署方式 docker)
-
部署服务
docker run --name jenkins \ -u root \ -d \ -p 8080:8080 \ -p 50000:50000 \ -v /var/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ jenkins/jenkins:2.373
-
访问 jenkins http://43.137.41.251:8080/ 首次登录 使用生成的密码
cat /var/jenkins_home/secrets/initialAdminPassword
-
安装插件
gitlab
Publish Over SSH
maven Integration
Config File Provider
将 Jenkins 和 gitlab 打通
安装好 所有插件之后重启 jenkins 修改 maven 阿里镜像源
-
管理配置文件
配置全局 maven 使用新建的配置文件 并安装 maven
连接 所要部署的服务器
新建一个 job
-
在 jenkins 容器下 生成 密钥
ssh-keygen
-
在 jenkins 容器内 连接 gitlab
git ls-remote -h -- ssh://git@43.137.7.130:1122/gitlab-instance-78d21fb7/black-dragon.git HEAD
配置 gitlab 仓库地址
配置 webhook
在 gitlab 配置 Jenkins 中生成的地址
关闭 ssl 验证
测试通路
配置 jenkins build
配置 打包后的操作
将 Dockerfile 文件上传
第二次上传 jar 包 并 打成镜像运行
**项目中的 Dockfile **
# 基础镜像
FROM openjdk:8-jre-alpine
# author
MAINTAINER bg
# 挂载目录
VOLUME /home/bg
# 创建目录
RUN mkdir -p /home/bg
# 指定路径
WORKDIR /home/bg
# 复制jar文件到路径
ADD bg_hello.jar bg_hello.jar
# 启动认证服务
ENTRYPOINT ["java","-jar","/home/bg/bg_hello.jar"]
到此处配置 已经完成 之后就是 测试通路 首次构建时间会比较长 因为 maven 需要从远程镜像源 下载 jar 包
执行结果
Waiting for Jenkins to finish collecting data
[JENKINS] Archiving /var/jenkins_home/workspace/black-dragon/pom.xml to com.bg/SpringBootBG/0.0.1-SNAPSHOT/SpringBootBG-0.0.1-SNAPSHOT.pom
[JENKINS] Archiving /var/jenkins_home/workspace/black-dragon/target/bg_hello.jar to com.bg/SpringBootBG/0.0.1-SNAPSHOT/SpringBootBG-0.0.1-SNAPSHOT.jar
channel stopped
SSH: Connecting from host [04be73e9e64e]
SSH: Connecting with configuration [docker server] ...
SSH: Creating session: username [root], hostname [146.56.193.100], port [22]
SSH: Connecting session ...
SSH: Connected
SSH: Opening SFTP channel ...
SSH: SFTP channel open
SSH: Connecting SFTP channel ...
SSH: Connected
SSH: cd [/root]
SSH: OK
SSH: cd [/root]
SSH: OK
SSH: cd [bg]
SSH: OK
SSH: put [Dockerfile]
SSH: OK
SSH: Opening exec channel ...
SSH: EXEC: channel open
SSH: EXEC: STDOUT/STDERR from command [# 切换至工作目录
cd /root/bg
#查看文件
ls] ...
SSH: EXEC: connected
bg_hello.jar
Dockerfile
SSH: EXEC: completed after 201 ms
SSH: cd [/root]
SSH: OK
SSH: cd [bg]
SSH: OK
SSH: put [bg_hello.jar]
SSH: OK
SSH: Opening exec channel ...
SSH: EXEC: channel open
SSH: EXEC: STDOUT/STDERR from command [#!/bin/bash
#切换到 bg 目录下
cd /root/bg/
#删除原有镜像
docker rmi bgbg/bg-hello:latest
#构建镜像
docker build -t bg/bg-hello:latest .
#启动容器
docker run -itd --name=bg-hello -p 20217:20217 bg/bg-hello:latest] ...
SSH: EXEC: connected
Error response from daemon: No such image: bgbg/bg-hello:latest
#1 [internal] load .dockerignore
#1 transferring context: 2B done
#1 DONE 0.0s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 367B done
#2 DONE 0.0s
#3 [internal] load metadata for docker.io/library/openjdk:8-jre-alpine
#3 DONE 1.2s
#4 [1/4] FROM docker.io/library/openjdk:8-jre-alpine@sha256:f362b165b870ef129cbe730f29065ff37399c0aa8bcab3e44b51c302938c9193
#4 DONE 0.0s
#5 [internal] load build context
#5 transferring context: 17.34MB 0.1s done
#5 DONE 0.1s
#6 [2/4] RUN mkdir -p /home/bg
#6 CACHED
#7 [3/4] WORKDIR /home/bg
#7 CACHED
#8 [4/4] ADD bg_hello.jar bg_hello.jar
#8 DONE 0.1s
#9 exporting to image
#9 exporting layers 0.1s done
#9 writing image sha256:e64acf5b2cb8c0282ecd1953a71e5a2d0dcb349fb6267f8acaac8373eb362292 done
#9 naming to docker.io/bg/bg-hello:latest done
#9 DONE 0.1s
6de91fafb003ed226f197779ff29c74d3beb9ed76a481d00914ec199e0b34e52
SSH: EXEC: completed after 2,201 ms
SSH: Disconnecting configuration [docker server] ...
SSH: Transferred 2 ( 1 + 1 ) file(s)
Finished: SUCCESS
服务器 查看运行情况 并访问
以上文章若有细枝末节的地方没有提到,私信之后 会再次完善此文章