Gitlab CI/CD 教程

一开始是打算给自己博客整个CI然后自动部署,搞定的差不多之后就开始手痒,打算给公司的一个golang的项目也给CI/CD了, 然后就踏上了GitLab - CI/CD 的不归路。

其实安装过程的教程官网有:GitLab,就几条命令而已 。

Installation 安装

下载,根据linux的类型自行选择。

1
2
3
4
5
6
7
8
# Linux x86-64
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# Linux x86
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386

# Linux arm
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm

然后给运行权限给 gitlab-runner

1
sudo chmod +x /usr/local/bin/gitlab-runner

然后创建 gitlab-runner 的用户

1
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

安装gitlab-runner 的服务,然后跑起来

1
2
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

Service registration 服务注册

然后给项目注册 gitlab-runner , 这时候需要一个url地址和一串token ,一句废话,这个url 必须可以让 gitlab-runner访问到 , 不然连不通的。 这个地址在项目的 gitlab.com/username/project/settings/ci_cd 页面的CI/CD 的选项卡内 (本博客懒得找图床)。同时也有给k8sgitlab-runner的选项,会看我博客的人用不上,用的上的人不会看我的博客,所以略过。

获得这俩值后开始注册 gitlab-runner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo gitlab-runner register #注册
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
#输入url
Please enter the gitlab-ci token for this runner
#输入token
Please enter the gitlab-ci description for this runner
#写点介绍
Please enter the gitlab-ci tags for this runner (comma separated):
#打tag,tag的作用等会说
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
#选择运行器
#如果选择了 docker , 选择一个默认镜像 , 当.gitlab-ci.yml没有定义镜像时使用此默认镜像
Please enter the Docker image (eg. ruby:2.1):
alpine:latest

Configuration File 配置文件

给项目加上.gitlab-ci.yml 文件 , 以下是golang的示范文件 。

我的环境时shell , 也就是说下面文件所有的运行环境都是在bin/sh 输入command而已。

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
before_script:
- export GO_PROJECT_NAMESPACE="$GOPATH/src/gitexample.com/$CI_PROJECT_NAMESPACE"
- echo $GO_PROJECT_NAMESPACE
- mkdir -p $GO_PROJECT_NAMESPACE
- ln -srf $(pwd) $GO_PROJECT_NAMESPACE
- export GO_PROJECT_PATH="$GO_PROJECT_NAMESPACE/$CI_PROJECT_NAME"
- echo $GO_PROJECT_PATH
- cd $GO_PROJECT_PATH

stages:
- build
- test
- release

build:
stage: build
script:
- go build
tags:
- project-runner-tag
except:
- dev

test:
stage: test
script:
- go test -v ./...

release:
stage: release
script:
- make
- ./admin.sh start
allow_failure: true
only:
- master

太明显的就懒得讲了,主要讲三个 , 一个是 tags , 这个对应的是 gitlab-runnertag . 而 only 代表这一 stages只有该分支需要运行 。还有一个 except , 也就是说这一阶段除了这一分支都需要运行 。

如果你打算用 docker 来当运行器的话, 接下来的就可以略过了,节省时间。

一个坑

当在使用shell 环境的时候,默认的gitlab-runner使用的账户会经常碰到 permission denied 的问题 , 临时解决方法是当你需要跑ci的时候上服务器

1
sudo gitlab-runner run

而一劳永逸的方法就是 , 给gitlab-runner的账号提权。

  • 方法一

    1
    useradd gitlab-runner --shell /bin/bash -g root -G root #直接在创建的时候给root权限就完事了。
  • 方法二

    1
    usermod -g root gitlab-runner #修改分组
  • 方法三

    1
    2
    3
    4
    5
    #vim /etc/sudoers 
    修改:
    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    gitlab-runner ALL=(ALL) ALL
  • 方法四

    1
    2
    3
    4
    # vim  /etc/passwd 
    gitlab-runner:x:500:500:gitlab-runner:/home/gitlab-runner:/bin/bash
    #修改成⬇️
    gitlab-runner:x:0:500:gitlab-runner:/home/gitlab-runner:/bin/bash

    以上四个方法来自 linux 技术屋