0%

前记

之前在使用gitlab runner时大多使用docker方式进行CI,但是对于Java and Maven每次都需要下载费时很久,所以后来我选择shell方式。接下来我们看看shell方式的runner应该怎样搭建

NO.1

第一步 我们首先安装Docker,因为后面CI的时候我们需要打包成Docker镜像

Docker Install

NO.2

第二步 我们需要安装JavaMaven

  1. Installing Java 8 on CentOS 7
1
2
3
4
5
6
7
8
9
10
11
12
# Step 1: Update
yum -y update

# Step 2: Install Java 8
yum install java-1.8.0-openjdk

# Step 3: Verify Java is Installed
# Example Output:
java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
  1. Installing Maven 8 on CentOS 7
1
2
# 这里我们直接有用yum默认安装
yum install maven

No.3

第三步 我们需要安装gitlab-runner

1
2
3
4
5
6
# 添加GitLab的官方存储库
# For RHEL/CentOS/Fedora
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

# 安装gitlab-runner
sudo yum install gitlab-runner

No.4

第四步 就是注册runner这里不过多赘述

前记

最近在部署一个由Guns开发的一套系统,在本地测试和Gitlab Runner上执行mvn package -B -Dmaven.test.skip=true都能跳过测试,但是在CI里面就没法跳过测试

解决方案

pom中加入maven-surefire-plugin并跳过测试

1
2
3
4
5
6
7
8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>

Guns

这里我们再介绍哈guns多模块打包方案,模块如下:

  1. guns-parent 父模块
  2. guns-core guns核心模块
  3. guns-generator 代码生成模块
  4. guns-admin 后台管理模块
  5. guns-rest API模块

下面是CI文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 定义代码目录
before_script:
- rm -rf /data/
- mkdir -p /data/
- mv * .git* /data/
- cd /data/

stages:
- deploy

maven-build:
stage: deploy
only:
- master
script:
- cd guns
   - mvn clean install # 在父模块上运行install,将依赖打包到maven本地仓库
   - cd ../guns/guns-admin
   - mvn package -B -Dmaven.test.skip=true # 这里其实可以不用打包,因为前面install的时候已经打包
   - docker build ...
- docker tag ...
   - docker push ... # 构建不同项目的镜像
   - cd ../../guns/guns-rest
- mvn package -B -Dmaven.test.skip=true # 这里其实可以不用打包,因为前面install的时候已经打包
- docker build ...
- docker tag ...
- docker push ... # 构建不同项目的镜像
tags:
- spring-boot-shell

关于构建的Dockerfile可以参考

1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/guns-admin-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

前记

最近公司在部署SAP,在部署SUSE的虚拟机的过程中接到SAP实施商的一个要求,需要将虚拟机的内核进行升级。原:4.4.73-7-default,目标:4.4.140-94.42-default

升级

基础配置

开始之前记得去YaST里面防火墙打开对SSH允许,以及网络设置IP地址进行设置

获取内核

获取内核的方法有很多比如:kernel以及opensuse;不过我是通过Suse Drivers获取的官方的补丁包

kernel-default-4.4.140-94.42.1.x86_64

安装

在安装之前可能得通过SFTP等工具将rpm包上传到虚拟机

1
2
3
// 安装包并在安装过程中显示正在安装的文件信息及安装进度

rpm -ivh kernel-default-4.4.140-94.42.1.x86_64.rpm

重启

在更新内核后需要进行重启

1
2
3
4
5
6
7
8
// 重启

reboot

// 查看新的内核版本

uname -r
4.4.140-94.42-default


大功告成!!!

环境

目前环境是Hexo+Github Pages

再来看看部署命令npm start

1
2
3
4
5
//  package.json

"scripts": {
"start": "hexo cl && hexo g && gulp && hexo d && php -f push_sitemap_to_baidu.php"
}

我们逐条来解读

hexo cl 清除缓存文件db.json和已生成的静态文件public

hexo g 生成静态文件

gulp 将静态文件进行压缩,这部分操作可以参考之前我写的文章——利用gulp对Hexo博客压缩并一键之部署

php -f push_sitemap_to_baidu.php 将文章主动推送至百度,这部分操作可以参考之前我写的文章——Hexo部署在Github Pages怎么提交Sitemap给百度?来我教你

.drone.yml

通过上面我们大概了解了环境,接下里我们编写.drone.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// .drone.yml

kind: pipeline
name: default

steps:
- name: publish
 image: jakehu/php-node # 包含了PHP7+Node10+GIT环境的镜像
 pull: always
commands:
- node -v
- php -v
- npm install
 - git config --global user.email "jakehu1991@gmail.com" # 对GIT进行设置
 - git config --global user.name "jakehu" # 对GIT进行设置
- npm start

这样就完了?并没有由于我们是在DroneDIND里面进行的部署,所以我们还需要对Github权限进行设置

1
2
3
4
5
6
7
8
// _config.yml

...
deploy:
- type: git
   repo: https://jakehu:password@github.com/jakehu/jakehu.github.io.git
branch: master
...

到这里就完成,只需要进行git push每次Drone就会自动把npm start所有的工作完成了

Drone运行过程

关于DroneDocker in Docker (dind)解决方案,本人历经2天尝试了各种解决方案,最终解决方案为volumes挂载,已在本文体现

为什么

为什么?为什么要使用GogsDrone?答案是习惯!!!

工作中一般使用GIT管理工具为gitlab,自有开源项目一般都是使用的github,自有私有项目之前一直用gitee;玩Nas也有好几年了,最初也想过在Nas上通过docker搭建gitlab无奈配置不过硬

怎么说呢?了解Gogs是在它出来的那一段时间,但是也一直没有用过。最近心血来潮还是想自己在Nas上做一个GIT私有服;于是挑中了GogsGitea,鉴于两个服务属于同源最后选择了Gogs

Gogs

关于Gogs的安装我这里就不过多的赘述,可以看下面的两个文档

Gogs Github

Gogs Docker

这需要说明的是Gogs支持MySQL, PostgreSQL, SQLite3, MSSQLTiDB;目前我使用的是MySQL,关于Mysql的安装部署可以查看官方文档这里也不过多赘述

Mysql安装文档

对于在群晖Docker中去管理Mysql的工具这里我推荐adminer安装文档如下

adminer安装文档

最后我要说的是一个是端口映射的问题,一个是卷映射的问题,如下图


最后直接访问:http://192.168.1.2:10080就OK了

这里贴出一下整个Gogs配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// /data/gogs/conf/app.ini

APP_NAME = Gogs
RUN_USER = git
RUN_MODE = prod

[database]
DB_TYPE = mysql
HOST     = 192.168.1.2:3306 // mysql地址端口
NAME     = gogs
USER = root
PASSWD   = password // mysql密码
SSL_MODE = disable
PATH = data/gogs.db

[repository]
ROOT = /data/git/gogs-repositories
publish
[server]
DOMAIN           = 192.168.1.2 // 访问域名
HTTP_PORT       = 10080 // http端口
ROOT_URL         = http://192.168.1.2/ // 访问域名
DISABLE_SSH = false
SSH_PORT         = 10022 // SSH端口
START_SSH_SERVER = false
OFFLINE_MODE = false

[mailer]
ENABLED = false

[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION   = true // 禁止注册,只能有管理员能加账号
ENABLE_CAPTCHA         = true
REQUIRE_SIGNIN_VIEW   = true // 默认跳转到登录页

[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false

[session]
PROVIDER = file

[log]
MODE = file
LEVEL = Info
ROOT_PATH = /app/gogs/log

[security]
INSTALL_LOCK = true
SECRET_KEY = security

到此为止,我们就完成了Gogs的所有安装

Drone

Drone安装

为什么?为什么要使用Drone还是因为习惯。因为在使用Gitlab的时候使用的CI/CD都是gitlab自带的gitlab ci;所以这里我们也需要一个CI/CD的工具于是我选择了Drone,当然市场上CI/CD的工具是比较多的

Drone安装这里我们参考官方文档

Gogs单机安装文档

Docker命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run \
-d \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /volume1/docker/drone:/data \
-e DRONE_GIT_ALWAYS_AUTH=false \
-e DRONE_GOGS_SERVER=http://192.168.1.2:10080 \
-e DRONE_SERVER_HOST=http://192.168.1.2:10800 \
-e DRONE_DATABASE_DRIVER=mysql \
-e DRONE_DATABASE_DATASOURCE="root:password@tcp(192.168.1.2:3306)/drone?parseTime=true" \
-p 80:80 \
-p 443:443 \
--name=drone \
drone/drone:latest

这里贴别强调一下/var/run/docker.sock:/var/run/docker.sock的挂载是必不可少的,因为后面的DIND会用到,另外因为我使用了Mysql所以上面DRONE_DATABASE_DRIVER配置为mysql

接下来访问http://192.168.1.2:10800就会出现Drone登录界面,账号为Gogs管理员账号,这两个账号相通,而且也会自动同步Gogs项目

.drone.yml

在编辑.drone.yml之前我们需要在drone管理界面对项目设置

这里需要设置项目为受信任项目,如果Project settings未显示,则表示当前用户在Drone不是管理员可以更改数据库授权为管理员

1
UPDATE `users` SET `user_admin` = '1' WHERE `user_id` = '1';

接下来我们编写.drone.yml,对于.drone.yml编写我们以Spring Boot项目为例,首先我们需要编辑DockerFile

1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/hello-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

接下来我们编辑.drone.yml,关于.drone.yml请参考.drone.yml文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
kind: pipeline
name: default

steps:
- name: build
image: maven:3.5-jdk-8
commands:
- mvn package -B -Dmaven.test.skip=true # 打包跳过测试

- name: publish
image: docker:dind
volumes:
- name: docker
path: /var/run/docker.sock # dind挂载来自Drone容器/var/run/docker.sock
commands:
- docker login --username=* --password=* registry.cn-shenzhen.aliyuncs.com
- docker build -t spring-boot:master .
- docker tag spring-boot:master registry.cn-shenzhen.aliyuncs.com/new/spring-boot:master
- docker push registry.cn-shenzhen.aliyuncs.com/new/spring-boot:master

volumes:
- name: docker
host:
path: /var/run/docker.sock # 这里挂载Drone容器所在/var/run/docker.sock,当然Drone容器/var/run/docker.sock来自于群晖宿主机/var/run/docker.sock

通过上面我们定义了两步,build利用mavenSpring Boot进行了打包操作;publish利用dind将打包好的jar包通过DockerFile打包成镜像并推送到镜像仓库,这里说一下我使用的镜像仓库是阿里云

这里也请注意WebHook的地址为上面安装的Drone地址请注意填写正确

下面我们看一下Drone执行过程

到这里我们就告一段落了


以上就是群晖对接整个GogsDrone过程