跳转至
首页 解决方案 下载 文档
演示环境

应用平台部署

好消息:OpsAny DevOps解决方案即将升级为DevOpsAny独立的产品线,启用独立域名https://www.devopsany.com,该项目包括:项目协同、代码仓库、持续集成、制品仓库、持续部署等模块,打造国内第一个全开源,端到端的DevOps平台,可以将你现在用的SaaS版的DevOps产品,迁移到私有化部署的,基于开源的数字化研发平台上来。基于开源,所以开源,计划发布时间:2024年Q4。

应用平台部署

应用平台是OpsAny的应用管理平台,管理应用的资源、CI/CD流水线、制品仓库等。需要依赖第三方的开源工具,需要单独准备主机部署Gitlab、Jenkins、Nexus、StackStorm,或者直接集成企业已经部署的开源工具,需要注意版本问题,有一定的使用门槛。如果你对DevOps不熟悉或者完全不了解,或者内存少于16G,请不要部署!【人生苦短,何必自寻烦恼!- OpsAny】

1.设置admin密码

在执行安装前,请注意,你是否修改过admin的密码,默认情况下会从$INSTALL_PATH/conf/.passwd_env获取,如果你修改过密码,请修改此文件中对应的值。

INSTALL_PATH=/data/opsany
vim $INSTALL_PATH/conf/.passwd_env

2.使用自动化脚本部署应用平台。

# 该命令会部署应用平台、流水线、持续部署、制品仓库,四个平台。
cd /opt/opsany-paas/install/
./saas-ce-install.sh devops

刷新工作台,或者退出重新登录,即可在导航菜单查看到新增的平台。

OpsAny

3.打开【平台导航】-【流水线/持续部署/制品仓库】-【系统设置】,进行工具的集成,如没有工具,请根据下面的文档进行部署。 注意:Gitlab和Jenkins是使用的API Token,Nexus暂时使用的用户和密码验证。

应用平台依赖部署(独立主机)

请注意下方端口冲突的问题,自行解决部署问题。系统配置:8C、16G内存,100G磁盘。

  • Gitlab:版本必须大于13.12 监听端口:80 8080等。
  • Jenkins:流水线依赖,版本必须大于2.328。需要安装Gitlab插件 监听端口:8008 8009
  • Nexus: 制品仓库依赖,版本需要是3.x 监听端口:8014 8015
  • StackStorm: 持续部署依赖,版本需要是3.6.0 监听端口:8005 9100 9102 9202
  • SonarQube: 代码扫描,版本需要是9.9.6 监听端口:8016

部署Docker基础环境

1.1 安装环境检查

- 检查主机是否可以正常访问互联网,主机内存不低于16G。
- 关闭防火墙,设置规范化主机名,保证主机名可以解析。

1.2 安装Docker和MySQL客户端

# 请注意,不要整体复制粘贴执行,会造成有些命令执行不成功,但是又没发现。
# step 1: 安装必要的一些系统工具
sudo apt-get -y update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce docker-compose jq uuid wget mysql-client git ntpdate
systemctl enable --now docker
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate time1.aliyun.com
pip3 install -U pip setuptools -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip3 install requests==2.25.1 grafana-api==1.0.3 mysql-connector==2.2.9 SQLAlchemy==1.4.22 bcrypt==4.0.1 \
         -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

如果是Ubuntu 16.04 需要额外安装Python3和pip sudo apt-get -y install python3 python3-pip

1.1 安装环境检查

- 检查主机是否可以正常访问互联网,主机内存不低于16G。
- 关闭SELinux和防火墙,设置规范化主机名,保证主机名可以解析。

1.2 安装Docker和MySQL

# 请注意,不要整体复制粘贴执行,会造成有些命令执行不成功,但是又没发现。
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y git uuid wget docker-ce docker-compose mariadb jq python3 python3-pip python3-devel ntpdate unzip
systemctl enable --now docker
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate time1.aliyun.com
pip3 install -U pip setuptools -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip3 install requests==2.25.1 grafana-api==1.0.3 mysql-connector==2.2.9 SQLAlchemy==1.4.22 bcrypt==4.0.1 \
         -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

1.1 安装环境检查

- 检查主机是否可以正常访问互联网,主机内存不低于16G。
- 关闭SELinux和防火墙,设置规范化主机名,保证主机名可以解析。

1.2 安装Docker和MySQL

# 请注意,不要整体复制粘贴执行,会造成有些命令执行不成功,但是又没发现。
dnf config-manager --add-repo=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf -y install docker-ce --nobest
dnf -y install mariadb jq git uuid unzip
systemctl enable --now docker
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
pip3 install -U pip setuptools -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip3 install requests==2.25.1 grafana-api==1.0.3 mysql-connector==2.2.9 SQLAlchemy==1.4.22 bcrypt==4.0.1 \
         -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

1.1 安装环境检查

- 检查主机是否可以正常访问互联网,主机内存不低于16G。
- 关闭SELinux和防火墙,设置规范化主机名,保证主机名可以解析。

1.2 安装Docker和MySQL

# 请注意,不要整体复制粘贴执行,会造成有些命令执行不成功,但是又没发现。
dnf config-manager --add-repo=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf -y install docker-ce --nobest
dnf -y install mariadb jq git uuid python3 gcc gcc-c++ glibc rust cargo unzip
systemctl enable --now docker
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
pip3 install -U pip setuptools -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip3 install setuptools-rust==1.1.2 requests==2.25.1 grafana-api==1.0.3 mysql-connector==2.2.9 SQLAlchemy==1.4.22 bcrypt==4.0.1 \
         -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

1.1 安装环境检查

- 检查主机是否可以正常访问互联网,主机内存不低于16G。
- 关闭SELinux和防火墙,设置规范化主机名,保证主机名可以解析。

1.2 安装Docker和MySQL

# 请注意,不要整体复制粘贴执行,会造成有些命令执行不成功,但是又没发现。
dnf config-manager --add-repo=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf -y install docker-ce --nobest
dnf -y install mariadb jq git uuid python3 gcc gcc-c++ glibc rust cargo unzip
systemctl enable --now docker
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
pip3 install -U pip setuptools -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip3 install setuptools-rust==1.1.2 requests==2.25.1 grafana-api==1.0.3 mysql-connector==2.2.9 SQLAlchemy==1.4.22 bcrypt==4.0.1 \
         -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

1.1 安装环境检查

- 检查主机是否可以正常访问互联网,主机内存不低于16G。
- 关闭SELinux和防火墙,设置规范化主机名,保证主机名可以解析。

1.2 安装Docker和MySQL

# 请注意,不要整体复制粘贴执行,会造成有些命令执行不成功,但是又没发现。
yum -y install docker mariadb jq git uuid python3 gcc gcc-c++ glibc rust cargo unzip
systemctl enable --now docker
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
pip3 install -U pip setuptools -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
pip3 install setuptools-rust==1.1.2 requests==2.25.1 grafana-api==1.0.3 mysql-connector==2.2.9 SQLAlchemy==1.4.22 bcrypt==4.0.1 \
         -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

Jenkins流水线集成

Jenkins是一个独立的开源软件项目,是基于Java开发的一种持续集成和持续交付工具,Jenkins的前身Hudson是一个可扩展的持续集成引擎。官方网站https://jenkins.io/

1.安装Jenkins

目前Jenkins版本主要分为两个大的版本LTS长期支持版和周更新版。大家可以根据实际情况进行选择,本书选择的是当前的LTS版本,可以从这里获取最新版本和安装方法:https://pkg.jenkins.io/redhat/。

# Step1: 准备运行环境
INSTALL_PATH=/data/opsany
PAAS_DOCKER_REG=registry.cn-beijing.aliyuncs.com/opsany
mkdir -p ${INSTALL_PATH}/jenkins-home && chmod -R 777 ${INSTALL_PATH}/jenkins-home

# Step2: 启动Jenkins Master
docker run --restart=always --name opsany-devops-jenkins -t \
  -v /etc/localtime:/etc/localtime:ro \
  -v ${INSTALL_PATH}/jenkins-home:/var/jenkins_home \
  -p 8008:8080 -p 8009:5000 \
  -d ${PAAS_DOCKER_REG}/jenkins:2.452.2-lts

1.安装Jenkins

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo 
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
yum install -y fontconfig java-11-openjdk jenkins

2.启动Jenkins

[root@linux-node2 ~]# vim /etc/sysconfig/jenkins
#修改端口为8008端口,为了防止和其它服务端口冲突
JENKINS_PORT="8008"

[root@linux-node2 ~]# vim /usr/lib/systemd/system/jenkins.service
Environment="JENKINS_PORT=8008"

[root@linux-node2 ~]# systemctl daemon-reload
[root@linux-node2 ~]# systemctl restart jenkins && systemctl enable jenkins

2.访问Jenkins

在浏览器输入http://192.168.56.12:8008

来访问jenkins,并进行初始化,全部默认参数即可。如果是云主机,请打开安全组的8008、8009端口。然后访问进行初始化操作。

1.首次访问要求输入初始化密码继续,可以直接从挂载路径获取。

cat ${INSTALL_PATH}/jenkins-home/secrets/initialAdminPassword 

2.插件选择安装-【推荐插件】,请确保所有插件均正常成功安装。如果有安装失败的,请重试!

3.Jenkins插件安装

完成Jenkins初始化后,需要在Jenkins安装以下插件:

  • Gitlab
  • Nexus Artifact UploaderVersion

4.集成Jenkins到流水线平台

打开【流水线】-【系统设置】,点击右上角(新增工具),根据提示填写信息。

  • Jenkins地址:Jenkins的访问地址,可以是内网IP地址,例如http://192.168.56.12:8008。
  • 用户名:需要Jenkins的管理员用户,在安装Jenkins时设定的管理员用户。
  • API Token:在Jenkins用户头像下拉菜单选择“设置”打开设置页面。在API Token配置项下方创建。

5.集成说明

  • 在应用平台创建的每个应用,会自动在Jenkins上创建一个,应用唯一标识命名的文件夹。
  • 在流水线平台创建的每个流水线,会创建在对应的应用的文件夹下。
  • 如果在部署OpsAny之前已经有了Jenkins。可以根据上述要求创建文件夹,然后创建应用,即可自动对应起来。(文件夹名称是应用系统唯一标识)。
  • 需要用户自行配置构建环境。

6.使用Jenkins进行构建

通常我们不建议直接使用Jenkins Master进行流水线构建,而是单独准备一台Jenkins Slave的主机,如果你想快速的演示流水线的功能,可以自行在Master容器中部署运行环境,例如:

安装Maven

docker exec -it --user root opsany-devops-jenkins /bin/bash
sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources
apt update -y && apt install -y vim wget git
cd /usr/local/src 
wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz
tar zxf apache-maven-3.9.9-bin.tar.gz
mv apache-maven-3.9.9 /usr/local/
ln -s /usr/local/apache-maven-3.9.9/ /usr/local/maven

在后面流水线中可以直接使用绝对路径:/usr/local/maven/bin/mvn,注意,首次运行会下载依赖,时间较长。例如:

# 运行单元测试
/usr/local/maven/bin/mvn test

# 编译代码
/usr/local/maven/bin/mvn compile

# 生成部署包
/usr/local/maven/bin/mvn package

DevOps案例Java:https://gitee.com/unixhot/devops-demo-java.git

Nexus制品仓库集成

OpsAny支持Nexus制品仓库,Nexus是非常流行的免费制品仓库,而且是支持多种语言制品的管理。使用端口8009

1.准备运行环境。

INSTALL_PATH=/data/opsany
PAAS_DOCKER_REG=registry.cn-beijing.aliyuncs.com/opsany
mkdir -p ${INSTALL_PATH}/nexus-data && chmod -R 777 ${INSTALL_PATH}/nexus-data

2.启动nexus,并设置内存大小,挂载数据卷。

可以根据实际情况调整内存大小。-Xms500m -Xmx500m,如果内存足够,建议不低于4G。注意修改内存中的JVM的内存大小,测试设置500M可以,生产建议大约2G。

docker run -d -p 8014:8081 -p 8015:5000 --restart=always --name opsany-devops-nexus \
-v ${INSTALL_PATH}/nexus-data:/nexus-data  \
-e INSTALL4J_ADD_VM_PARAMS="-Xms500m -Xmx500m -XX:MaxDirectMemorySize=500m" \
${PAAS_DOCKER_REG}/nexus3:3.37.0

3.访问Nexus,设置admin用户密码。

  • 1.进行系统初始化

1)首次登录需要设置Admin密码。

cat ${INSTALL_PATH}/nexus-data/admin.password

2)普通用户请关闭匿名访问,选择:“Disable anonymous access”

3)默认Nexus会自动创建7个仓库,分别是Maven的4个仓库和nuget的4个仓库。如果不使用,可以直接删除。

Nexus的仓库类型介绍:

  • hosted : 本地存储,即同docker官方仓库一样提供本地私服功能。
  • proxy : 提供代理其他仓库的类型,如docker中央仓库。
  • group : 组类型,实质作用是组合多个仓库为一个地址。 目前OpsAny制品仓库仅支持hosted类型的制品,其它类型的制品,暂时需要手工在Nexus上进行配置。

  • 2.创建Docker镜像仓库

点击系统管理-【Repository】-【Create Repository】-【docker(hosted)】 创建Docker镜像仓库

4.配置Docker信任仓库

请修改下面的IP地址为Nexus的地址。

[root@linux-node1 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://tdimi5q1.mirror.aliyuncs.com"],
"insecure-registries" : ["http://192.168.56.11:8015"]
}
[root@linux-node1 ~]# systemctl restart docker

5.测试Nexus的Docker镜像访问。

docker login http://192.168.56.11:8015

如果是云主机,请打开安全组的8014、8015端口。然后访问进行初始化操作。在OpsAny创建业务和应用后,点击某个应用进入到应用详情即可看到应用的流水线和制品库等功能。

StackStorm集成

StackStorm是一个开源的事件驱动的自动化运维工具,可将所有应用程序,服务和工作流程连接起来。 它具有可扩展性,灵活性, 设计中包含了对DevOps和ChatOps的热爱。它可以将您现有的基础架构和应用程序环境联系在一起,以便您可以更轻松地自动化操作该环境。它特别专注于针对事件采取行动。

1.StackStorm部署

  • 1.准备安装包
INSTALL_PATH=/data/opsany/
mkdir -p ${INSTALL_PATH}
cd /opt && git clone --depth=1  https://gitee.com/unixhot/opsany-paas.git
cd /opt/opsany-paas/install/opsany-ce/
cp -r opsany-st2/ $INSTALL_PATH/
cd $INSTALL_PATH/opsany-st2/
  • 2.部署RabbitMQ
# 可以自行修改账号和密码,对应修改下一步配置文件
RABBITMQ_DEFAULT_USER=opsany
RABBITMQ_DEFAULT_PASS=OpsAny@2020

docker run -d --restart=always --name opsany-base-rabbitmq \
    -e RABBITMQ_DEFAULT_USER="$RABBITMQ_DEFAULT_USER" \
    -e RABBITMQ_DEFAULT_PASS="$RABBITMQ_DEFAULT_PASS" \
    -p 15672:15672 -p 5672:5672 -p 15692:15692 \
    -v /etc/localtime:/etc/localtime:ro \
    registry.cn-beijing.aliyuncs.com/opsany/rabbitmq:3.8.9-management-alpine
  • 3.配置st2

可以使用OpsAny已经部署的Redis和MongoDB,请修改为正确的地址和用户名与密码。

vim files/st2.docker.conf

# 修改以下配置,配置为上面部署的RabbitMQ
[messaging]
url = amqp://opsany:OpsAny@2020@127.0.0.1:5672/

# 修改以下配置,可以配置为OpsAny的Redis,注意Redis密码不要带@
[coordination]
url = redis://:123456.coM@127.0.0.1:6379

# 增加下面配置,默认没有,修改为event的用户名和密码。
[database]
host = 127.0.0.1
port = 27017
db_name = event
username = event
password = OpsAny@2020
  • 4.启动ST2
export ST2_VERSION="3.8.0"
export ST2_IMAGE_REPO="registry.cn-beijing.aliyuncs.com/opsany/"
export ST2_EXPOSE_HTTP="0.0.0.0:8005"
docker-compose up -d
  • 5.测试st2
docker exec -it opsany-st2_st2client_1 /bin/bash
st2 action list --pack=core

# 有以下输出说明st2部署成功
+---------------------+------+----------------------------------------------------------------------+
| ref                 | pack | description                                                          |
+---------------------+------+----------------------------------------------------------------------+
| core.announcement   | core | Action that broadcasts the announcement to all stream consumers.     |
| core.ask            | core | Action for initiating an Inquiry (usually in a workflow)             |
| core.echo           | core | Action that executes the Linux echo command on the localhost.        |
| core.error          | core | Action that executes the Linux echo command (to stderr) on the       |
|                     |      | localhost.                                                           |
| core.http           | core | Action that performs an http request.                                |
| core.inject_trigger | core | Action which injects a new trigger in the system.                    |
| core.local          | core | Action that executes an arbitrary Linux command on the localhost.    |
| core.local_sudo     | core | Action that executes an arbitrary Linux command on the localhost.    |
| core.noop           | core | Action that does nothing                                             |
| core.pause          | core | Action to pause current thread of workflow/sub-workflow.             |
| core.remote         | core | Action to execute arbitrary linux command remotely.                  |
| core.remote_sudo    | core | Action to execute arbitrary linux command remotely.                  |
| core.sendmail       | core | This sends an email                                                  |
| core.uuid           | core | Generate a new UUID (default uuid4)                                  |
| core.winrm_cmd      | core | Action to execute arbitrary Windows Command Prompt command remotely  |
|                     |      | via WinRM.                                                           |
| core.winrm_ps_cmd   | core | Action to execute arbitrary Windows PowerShell command remotely via  |
|                     |      | WinRM.                                                               |
+---------------------+------+----------------------------------------------------------------------+
  • 6.访问ST2 使用Docker Compose启动的ST2,默认是80端口。采用的容器的Host网络模式,直接使用宿主机网络。
    • http://localhost
    • 默认帐号: st2admin/OpsAny@2023

主机部署可以参考官方文档:https://docs.stackstorm.com/install/index.html

使用OpsAny已经部署完毕的MongoDB、Redis和RabbitMQ。如果和OpsAny部署在一起,确保端口修改为非80端口。

  • 1.设置yum仓库

    curl -s https://packagecloud.io/install/repositories/StackStorm/stable/script.rpm.sh | sudo bash
    

  • 2.安装st2和RabbitMQ

# 部署St2
yum install -y st2 crudini

# 部署RabbitMQ
RABBITMQ_DEFAULT_USER=opsany
RABBITMQ_DEFAULT_PASS=OpsAny@2020

docker run -d --restart=always --name opsany-base-rabbitmq \
    -e RABBITMQ_DEFAULT_USER="$RABBITMQ_DEFAULT_USER" \
    -e RABBITMQ_DEFAULT_PASS="$RABBITMQ_DEFAULT_PASS" \
    -p 15672:15672 -p 5672:5672 -p 15692:15692 \
    -v /etc/localtime:/etc/localtime:ro \
    registry.cn-beijing.aliyuncs.com/opsany/rabbitmq:3.8.9-management-alpine
  • 3.配置st2

可以使用OpsAny已经部署的RabbitMQ、Redis和MongoDB,请将下面配置案例修改为正确的IP地址和用户名与密码。

vim /etc/st2/st2.conf

# 修改以下配置,修改为上面安装的RabbitMQ地址。
[messaging]
url = amqp://opsany:OpsAny@2020@192.168.56.11:5672/

# 修改以下配置,可以配置为OpsAny的Redis,注意Redis密码不要带@
[coordination]
url = redis://:OpsAny2020@192.168.56.11:6379

#增加下面配置,默认没有。可以使用OpsAny自带的MongoDB。
[database]
host = 192.168.56.11
port = 27017
db_name = event
username = event
password = OpsAny@2020
  • 4.设置数据加密
DATASTORE_ENCRYPTION_KEYS_DIRECTORY="/etc/st2/keys"
DATASTORE_ENCRYPTION_KEY_PATH="${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}/datastore_key.json"

sudo mkdir -p ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}
sudo st2-generate-symmetric-crypto-key --key-path ${DATASTORE_ENCRYPTION_KEY_PATH}

# Make sure only st2 user can read the file
sudo chgrp st2 ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}
sudo chmod o-r ${DATASTORE_ENCRYPTION_KEYS_DIRECTORY}
sudo chgrp st2 ${DATASTORE_ENCRYPTION_KEY_PATH}
sudo chmod o-r ${DATASTORE_ENCRYPTION_KEY_PATH}

# set path to the key file in the config
sudo crudini --set /etc/st2/st2.conf keyvalue encryption_key_path ${DATASTORE_ENCRYPTION_KEY_PATH}

sudo st2ctl restart-component st2api

这里并不根据官方的设置,不配置SSH,通过调用管控平台和作业平台进行调用。

  • 5.启动服务
st2ctl start
  • 6.Register sensors, rules and actions:
st2ctl reload
  • 7.配置验证
yum -y install httpd-tools
echo 'OpsAny@2020' | sudo htpasswd -i /etc/st2/htpasswd st2admin

# 修改配置增加验证。
vim /etc/st2/st2.conf
[auth]
# 修改为启用
enable = True
backend = flat_file
backend_kwargs = {"file_path": "/etc/st2/htpasswd"}
# ...

# 重启并测试
st2ctl restart-component st2api
st2 login st2admin --write-password
  • 8.验证安装
st2 action list
  • 9.配置Web

注意:如果你将st2和Gitlab安装到一起,那么请自行解决80端口冲突的问题。注意修改Nginx的端口,将80端口注释掉,将443端口修改为其它端口。

yum install -y st2web nginx

# 创建自签名证书放到/etc/ssl/st2
mkdir -p /etc/ssl/st2
openssl req -x509 -newkey rsa:2048 -keyout /etc/ssl/st2/st2.key -out /etc/ssl/st2/st2.crt \
-days 365 -nodes -subj "/C=US/ST=California/L=Palo Alto/O=StackStorm/OU=Information \
Technology/CN=$(hostname)"

# 复制配置文件到配置目录下。
cp /usr/share/doc/st2/conf/nginx/st2.conf /etc/nginx/conf.d/

# Disable default_server configuration in existing /etc/nginx/nginx.conf
sed -i 's/default_server//g' /etc/nginx/nginx.conf

# 如果非单独部署请修改Nginx的端口,注释掉80端口
vim /etc/nginx/nginx.conf
#    server {
#        listen       80;
#        listen       [::]:80;
#        server_name  _;
#        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;

#        error_page 404 /404.html;
#        location = /404.html {
#        }

#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
#    }


# 如果非单独部署请修改Nginx的端口,注释掉80端口,然后修改st2的端口为8005.
vim /etc/nginx/conf.d/st2.conf
...
server {
listen       *:8005 ssl;
...

systemctl restart nginx
systemctl enable nginx

2.StackStorm集成

OpsAny的持续部署需要使用StackStorm的编排能力,我们为StackStorm开发了Pack,需要进行初始化操作。

  • 1.下载OpsAny核心st2的Pack。

需在安装stackstorm的服务器上面执行以下命令。切记。

mkdir -p /opt/stackstorm-packs && cd /opt/stackstorm-packs
git clone https://gitee.com/opsany/opsany_core.git
git clone https://gitee.com/opsany/opsany_workflow.git
  • 2.执行初始化

需在安装OpsAny的服务器上执行以下命令。请修改对应的地址和密码,用户名不要修改。注意Docker Compose部署的ST2为http,端口为80。

# 执行初始化,请修改下方的平台地址和ST2的地址,ST2的密码等。
source /opt/opsany-paas/install/install.config
source ${INSTALL_PATH}/conf/.passwd_env 
DEVOPS_SECRET_KEY=$(cat ${INSTALL_PATH}/conf/.devops_secret_key)
cd /opt/opsany-paas/saas/
python3 init-ce-st2.py --domain https://${DOMAIN_NAME} --username admin  --password ${ADMIN_PASSWORD} --st2_url https://www.opsany.com:8005  --st2_username st2admin --st2_password OpsAny@2023 --app_code devops --app_secret ${DEVOPS_SECRET_KEY} --st2_core_pack_source gitee

# 出现以下类似输出为初始化成功,未成功无法正常使用。
[SUCCESS] init devops st2 success.
Downloading the OpsAny core package is expected to take 60 seconds...
[SUCCESS] init st2 pack success.
[SUCCESS] config core pack success.

执行完毕初始化后,后自动在【管控平台】-【采控管理】-(StackStorm集成)-自动输入URL和API Key。现在就可以在持续部署去创建一个部署任务进行测试。

3.集成原理介绍

OpsAny通过集成StackStorm使用其强大的工作流编排的功能,从企业最佳实践来说,一个企业存在两种工作流:

  • 业务工作流:业务工作流就是通常我们所说的BPM,在这个领域开源的Activiti是王者,但是并不完全适用于运维的执行工作。
  • 执行工作流:执行工作流主要的场景就是运维的原子编排(文件分发、命令执行、数据采集),在这个领域OpsAny选择了StackStorm的Orquesta。

目前OpsAny的持续部署平台中的部署编排能力,依靠StackStorm的Orquesta来实现。

  • 首先,OpsAny将作业平台的脚本执行和文件分发,以一个Action的方式,集成到了StackStorm中。
  • 然后,当用户创建一个持续部署任务,OpsAny会自动生成一个StackStorm的workflow工作流。
  • 最后,当用户执行一个持续部署任务,OpsAny会调用StackStorm执行对应的工作流。

Gitlab代码仓库集成

如果用户企业已经有Gitlab,请检查版本是否大于13.12,如果是其它版本,也可以集成测试,官方并没有测试所有版本。如果还没有Gitlab,可以根据下方文档进行部署。由于Gitlab本身对CPU和内存的使用均有要求,需要用户单独准备一台主机进行部署。无法和使用Docker Compose部署的StackStrom部署在相同主机上,因为端口冲突。

GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。可以把Gitlab理解为一个开源的Github,你可以在企业中使用Gitlab部署一个企业自己的“Github”。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

1.安装gitlab

1.部署gitlab需要的postfix

[root@linux-node1~]# yum install curl policycoreutils openssh-server openssh-clients postfix -y
[root@linux-node1~]# systemctl start postfix && systemctl enable postfix

2.安装gitlab-ce

安装gitlab-ce最快速的解决方案是使用GitLab CE Omnibus package这个包,可以一站式的解决安装、配置、管理备份等需求:https://about.gitlab.com/downloads/#centos7 注:由于网络问题,国内用户,建议使用清华大学的镜像源进行安装,详情可以在这里找到:https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/

使用国内YUM源:

[root@linux-node1~]# vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1 
[root@linux-node1~]# yum install gitlab-ce -y

3.配置并启动Gitlab

首先我们干的第一件事情就是给gitlab设置一个域名,也就是外部如何访问Gitlab。

[root@linux-node1~]# vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.56.11'

4.重启配置Gitlab

如果你后期再次修改Gitlab的域名,也需要执行本操作,它会调用Chef(Chef和SaltStack、Ansible类似也是一个自动化运维工具)进行相关的配置管理,而且会自动启动。

[root@linux-node1~]# gitlab-ctl reconfigure

Gitlab的服务管理

可以使用gitlab-ctl管理gitlab:

  • 查看gitlab:[root@linux-node2 ~]# gitlab-ctl status
  • 关闭gitlab:[root@linux-node2 ~]# gitlab-ctl stop
  • 启动gitlab:[root@linux-node2 ~]# gitlab-ctl start
  • 重启gitlab:[root@linux-node2 ~]# gitlab-ctl restart

Gitlab系统服务

Gitlab安装完毕之后默认是开机自启动,使用的服务名称如下:

[root@linux-node1 ~]# systemctl status gitlab-runsvdir

2.Gitlab集成

打开【流水线】-【系统设置】页面,点击右上角。新增工具。填写Gitlab的地址、用户名、和Access Token即可完成集成。集成后可以通过Gitlab的Webhook调用流水线进行执行。下图为集成页面。

集成Gitlab

代码扫描SonarQube部署

目前OpsAny数字化研发平台暂未提供SonarQube的集成,需要用户自行独立使用进行代码质量扫描。

SonarQube Server部署

# Step1: 准备运行环境
sysctl -w vm.max_map_count=262144
sysctl -w fs.file-max=65536
ulimit -n 65536
ulimit -u 4096
INSTALL_PATH=/data/opsany
PAAS_DOCKER_REG=registry.cn-beijing.aliyuncs.com/opsany

# Step2: 启动SonarQube Server
docker run --restart=always --name opsany-devops-sonarqube -t \
    -v /etc/localtime:/etc/localtime:ro \
    -p 8016:9000 \
    -d ${PAAS_DOCKER_REG}/sonarqube:9.9.6-community

启动之后可以访问8016端口进行相关设置,例如设置语言为中文等。

使用Sonar Scanner进行分析

官方文档:https://docs.sonarqube.org/latest/analysis/overview/

安装Sonar Scanner

cd /usr/local/src/
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-6.2.0.4584-linux-x64.zip
unzip sonar-scanner-cli-6.2.0.4584-linux-x64.zip
mv sonar-scanner-6.2.0.4584-linux-x64/ /usr/local/
ln -s sonar-scanner-6.2.0.4584-linux-x64/ /usr/local/sonar-scanner

配置Sonar Scanner

[root@linx-node2 ~]# vim /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8

分析项目代码

如果你要使用Soanr Scanner分析一个项目代码,需要相关的配置。

第一步:编写sonar-project.properties文件

[root@linux-node3 ~]# vim sonar-project.properties
# must be unique in a given SonarQube instance
sonar.projectKey=devops-demo
# this is the name displayed in the SonarQube UI
sonar.projectName=devops-demo
sonar.projectVersion=2.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set. 
# If not set, SonarQube starts looking for source code from the directory containing 
# the sonar-project.properties file.
sonar.sources=.
sonar.java.binaries=.

# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8

第二步:生成扫描的token

登录SonarQube,点击用户图像-我的账号-安全-令牌。创建一个全局扫描的令牌。

第三步: 开始进行代码质量分析

  • 方法1: 编写sonar-project.properties后,在代码目录下直接执行命令。
[root@linx-node2 ~]# /usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.login=生成的Token
  • 方法2: 不编写sonar-project.properties,直接通过添加命令行参数来指定相关配置。
[root@linx-node2 ~]# /usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.login=生成的Token -Dsonar.projectKey=login -Dsonar.sources=.

第四步: 登录Sonarqube,项目页面查看扫描结果。


Document