英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论