Gitlab ci with unit testing that connects to MySQL

huangapple go评论75阅读模式
英文:

Gitlab ci with unit testing that connects to MySQL

问题

我已经构建了一个 Golang 项目,我希望在成功通过 GitLab ci 进行测试后部署该应用程序,但是在进行一些测试时失败了,因为无法连接到 MySQL。我想在一个阶段中使用 Golang 镜像和 MySQL 镜像。这是我的当前流水线。在测试阶段,before script 失败(/bin/bash: line 130: mysql: command not found)。

如何实现这一目标?

提前感谢。

英文:

I have built a Golang project, I want to deploy the app when successfully tested with GitLab ci, but when do some tests, it fails because cannot connect to MySQL.
I want to use the Golang image and MySQL image in one stage.
This is my current pipeline. On stage test, on before script fails (/bin/bash: line 130: mysql: command not found)

# To contribute improvements to CI/CD templates, please follow the Development guide 

at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Go.gitlab-ci.yml

image: golang:latest

services:
  - mysql:latest

stages:
  - test
  - build
  - deploy

variables:
  MYSQL_DATABASE: "db"
  MYSQL_USER: "user"
  MYSQL_PASSWORD: "password"
  MYSQL_ROOT_PASSWORD: "password"

format:
  stage: test
  variables:
    # Configure mysql environment variables (https://hub.docker.com/_/mysql/)
    MYSQL_DATABASE: $MYSQL_DATABASE
    MYSQL_PASSWORD: $MYSQL_PASSWORD
    MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
  services:
    - mysql:latest
  before_script:
    - mysql --version

  script:
    - go fmt $(go list ./... | grep -v /vendor/)
    - go vet $(go list ./... | grep -v /vendor/)
    - go test -race $(go list ./... | grep -v /vendor/)

compile:
  stage: build
  script:
    - mkdir -p typing
    - go build -o typing ./...
  artifacts:
    paths:
      - typing

deploy:
  image: google/cloud-sdk:alpine
  stage: deploy
  allow_failure: true
  script:
    - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
    # Run ssh-agent (inside the build environment)
    - eval $(ssh-agent -s)
    # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
    - ssh-add <(echo "$SSH_PRIVATE_KEY" | base64 -d)
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - (echo "$SSH_PRIVATE_KEY" | base64 -d) > file
    - echo "$SSH_PUBLIC_KEY" > file.pub
    - chmod 600 file
    - echo $SERVICE_ACCOUNT > file.json
    - gcloud auth activate-service-account --key-file file.json
    - gcloud compute scp typing/* --project="project-id" --zone="zone"  vm-name:/home/ubuntu
    - ssh -i file ubuntu@public-ip 'sudo ./kill.sh; sudo ./start.sh'
  artifacts:
    paths:
      - typing

How can I achieve that?

Thanks in advance.

答案1

得分: 1

test 阶段,该作业基于 golang 镜像,因此不包含 MySQL 客户端

为了访问你定义的 MySQL 服务,你需要安装客户端。

如果我没记错的话,Golang 镜像是基于 Debian 的,所以可以这样做:

before_script:
  - apt-get update
  - apt-get install -y default-mysql-client
  - mysql --version
英文:

In the stage test, the job is based on the golang image as a result it does not come packaged with the MySQL client.

In order to reach the MySQL service you defined you need to install the client

If I am not mistaken the Golang image is based on debian, so something like this

before_script:
  - apt get-update
  - apt get-install -y default-mysql-client
  - mysql --version

huangapple
  • 本文由 发表于 2022年5月20日 11:40:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/72313322.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定