在现代软件开发流程中,代码托管平台是团队协作不可或缺的基础设施。GitLab 作为一款功能强大的 DevOps 平台,提供了从代码管理、CI/CD 到项目管理的完整解决方案。然而,手动部署 GitLab 涉及复杂的安装步骤、依赖配置和系统调优,不仅耗时费力,还容易出错。
为了解决这一痛点,本文将介绍如何使用阿里云资源编排服务(ROS)一键部署 GitLab 代码托管平台,让您告别繁琐的手动操作,快速构建高效的开发协作环境。
一键部署的优势
通过 ROS 模板进行一键部署具有以下显著优势:
- 标准化配置:模板预定义了所有必要的配置项,确保每次部署的一致性和正确性。
- 自动化执行:从 ECS 实例创建到 GitLab 服务启动,全程自动化,无需人工干预。
- 快速部署:只需点击几下,即可在几分钟内完成整个部署流程。
- 易于管理:通过 ROS 控制台或 API,可以轻松查看、更新或删除已部署的资源。
- 成本优化:支持按需创建和释放资源,避免资源浪费。
部署步骤
第一步:准备 ROS 模板
我们将创建一个包含 ECS 实例、安全组规则和 GitLab 服务配置的 ROS 模板。模板将自动完成所有手动配置步骤。
ROSTemplateFormatVersion: '2015-09-01'
Description:
zh-cn: 部署GitLab服务。
en: Deploy the GitLab service.
Conditions:
CreateInstance:
Fn::Equals:
- Ref: InstanceSource
- CreateNew
UseExistedInstance:
Fn::Equals:
- Ref: InstanceSource
- UseExisted
Parameters:
InstanceSource:
Type: String
Label:
zh-cn: 实例来源
en: Instance Source
AssociationPropertyMetadata:
ValueLabelMapping:
CreateNew:
zh-cn: 创建新实例
en: Create New Instance
UseExisted:
zh-cn: 选择已有实例
en: Select Existed Instance
Default: CreateNew
AllowedValues:
- CreateNew
- UseExisted
ZoneId:
Type: String
Label:
en: Availability Zone
zh-cn: 可用区
AssociationProperty: ALIYUN::ECS::Instance::ZoneId
AssociationPropertyMetadata:
AutoSelectFirst: true
Visible:
Condition:
Fn::Equals:
- ${InstanceSource}
- CreateNew
Default:
ImageId:
Type: String
Label:
en: Image of Instance
zh-cn: 实例镜像
AssociationPropertyMetadata:
ValueLabelMapping:
aliyun_3_x64_20G_alibase_20250629.vhd:
zh-cn: Alibaba Cloud Linux 3
en: Alibaba Cloud Linux 3
Visible:
Condition:
Fn::Equals:
- ${InstanceSource}
- CreateNew
Default: aliyun_3_x64_20G_alibase_20250629.vhd
AllowedValues:
- aliyun_3_x64_20G_alibase_20250629.vhd
InstanceType:
Type: String
Label:
en: Instance Type
zh-cn: 实例类型
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
ZoneId: ${ZoneId}
SpotStrategy: SpotAsPriceGo
InstanceChargeType: PostPaid
SystemDiskCategory: cloud_essd
Visible:
Condition:
Fn::Equals:
- ${InstanceSource}
- CreateNew
Default:
EcsInstanceId:
Type: String
Label:
en: ECS Instance ID
zh-cn: ECS实例ID
AssociationProperty: ALIYUN::ECS::Instance::InstanceId
AssociationPropertyMetadata:
Status: Running
Visible:
Condition:
Fn::Equals:
- ${InstanceSource}
- UseExisted
Default:
CommonName:
Type: String
Default: deploy_gitlab_by_ros
Resources:
Vpc:
Type: 'ALIYUN::ECS::VPC'
Condition: CreateInstance
Properties:
CidrBlock: 192.168.0.0/16
VpcName:
Fn::Sub: ${CommonName}-vpc
VSwitch:
Type: 'ALIYUN::ECS::VSwitch'
Condition: CreateInstance
Properties:
ZoneId:
Ref: ZoneId
VpcId:
Ref: Vpc
CidrBlock: 192.168.0.0/24
VSwitchName:
Fn::Sub: ${CommonName}-vsw
SecurityGroup:
Type: 'ALIYUN::ECS::SecurityGroup'
Condition: CreateInstance
Properties:
VpcId:
Ref: Vpc
SecurityGroupName:
Fn::Sub: ${CommonName}-sg
SecurityGroupIngress:
- PortRange: 443/443
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
- PortRange: 80/80
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
- PortRange: '-1/-1'
SourceCidrIp: 0.0.0.0/0
IpProtocol: icmp
EcsInstance:
Type: 'ALIYUN::ECS::InstanceGroup'
Condition: CreateInstance
Properties:
ZoneId:
Ref: ZoneId
VpcId:
Ref: Vpc
VSwitchId:
Ref: VSwitch
SecurityGroupId:
Ref: SecurityGroup
ImageId:
Ref: ImageId
InstanceName:
Fn::Sub: ${CommonName}-ecs
InstanceType:
Ref: InstanceType
SystemDiskCategory: cloud_essd
MaxAmount: 1
InternetMaxBandwidthOut: 100
SpotStrategy: SpotAsPriceGo
ModuleInstallGitLab:
Type: 'MODULE::ACS::OOS::Extension'
Properties:
EcsInstanceIds:
- Fn::If:
- UseExistedInstance
- Ref: EcsInstanceId
- Ref: EcsInstance
PackageName: ACS-Extension-GitLab-1853370294850618
Version: default
DsEcs:
Type: 'DATASOURCE::ECS::Instances'
Properties:
InstanceIds:
- Fn::If:
- UseExistedInstance
- Ref: EcsInstanceId
- Ref: EcsInstance
SecurityGroupIngress_443:
Type: ALIYUN::ECS::SecurityGroupIngress
Condition: UseExistedInstance
Properties:
SecurityGroupId:
Fn::Jq:
- First
- .[0].SecurityGroupIds[0]
- Fn::GetAtt:
- DsEcs
- Instances
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
NicType: intranet
PortRange: 443/443
SecurityGroupIngress_80:
Type: ALIYUN::ECS::SecurityGroupIngress
Condition: UseExistedInstance
Properties:
SecurityGroupId:
Fn::Jq:
- First
- .[0].SecurityGroupIds[0]
- Fn::GetAtt:
- DsEcs
- Instances
SourceCidrIp: 0.0.0.0/0
IpProtocol: tcp
NicType: intranet
PortRange: 80/80
SecurityGroupIngress_-1:
Type: ALIYUN::ECS::SecurityGroupIngress
Condition: UseExistedInstance
Properties:
SecurityGroupId:
Fn::Jq:
- First
- .[0].SecurityGroupIds[0]
- Fn::GetAtt:
- DsEcs
- Instances
SourceCidrIp: 0.0.0.0/0
IpProtocol: icmp
NicType: intranet
PortRange: -1/-1
Outputs:
EcsLoginAddress:
Description:
en: Ecs login address.
zh-cn: ECS登录地址。
Value:
Fn::Sub:
- https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${ALIYUN::Region}&instanceId=${InstanceId}
- InstanceId:
Fn::If:
- UseExistedInstance
- Ref: EcsInstanceId
- Ref: EcsInstance
Console@Url:
Description:
en: GitLab server address.
zh-cn: GitLab访问地址。
Value:
Fn::Sub:
- http://${PublicIp}
- PublicIp:
Fn::Jq:
- First
- if .[0].PublicIpAddress != [] then .[0].PublicIpAddress[0] else .[0].EipAddress.IpAddress
end
- Fn::GetAtt:
- DsEcs
- Instances
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- InstanceSource
- ZoneId
- InstanceType
- EcsInstanceId
Hidden:
- CommonName
- ImageId
第二步:部署
- 登录阿里云 ROS 控制台。
- 点击"创建资源栈"。
- 选择"已有模板",将上述 YAML 代码粘贴到模板编辑器中。
- 填写参数,包括可用区、实例规格等。
- 点击"创建",等待部署完成。
第三步:访问 GitLab
部署完成后,您可以在 ROS 控制台查看资源栈的输出信息,获取 GitLab 实例的公网 IP 地址。在浏览器中访问 http://<公网IP>
即可进入 GitLab 登录页面。
首次登录时,使用用户名 root
,密码可以通过以下方式获取:
- 通过阿里云控制台连接到 ECS 实例
- 查看文件
/etc/gitlab/initial_root_password
获取初始密码
登录成功后,可看到如下图所示界面。
总结
通过本文介绍的 ROS 模板,您可以轻松实现 GitLab 代码托管平台的一键部署,大大简化了传统手动配置的复杂流程。这不仅提高了部署效率,还降低了出错风险,是团队快速构建代码托管环境的理想选择。
需要注意的是,生产环境部署建议使用更高配置的实例规格(至少4 vCPU、8 GiB内存),并配置域名解析和 HTTPS 证书以提升安全性和用户体验。希望本文能帮助您更好地理解和使用阿里云 ROS 服务,提升云计算资源的管理效率。