前一天我们将 Image Build 好并上传到 GitLab 的 Registry 以便暂时储存,当测试完成准备进入部属,就要推送到生产环境的 Registry 。 在使用 Docker-in-Docker
的框架下,只需要把 Image 给 pull
下来 ,tag
修改一下就可以 push
了。
了解完上述概念, Publish 的 Job 写法大致上会长这样,唯一的问题就只剩要如何拥有 GCP 的权限了。
publish:
stage: publish
only:
- master
before_script:
- # 登入到 GitLab 的 Container Registry
- # 登入到 GCP 的 Container Registry
script:
- docker pull $CI_IMAGE
- docker tag $CI_IMAGE $DEPLOY_IMAGE
- docker push $DEPLOY_IMAGE
要让 GitLab 有存取 GCP 的权限,可以建立 Identity and Access Management (IAM) 来让我们管理对 GCP 服务资源的存取, 下面就来创建一个管理 GCP Storage 的 IAM 使用者。
进入 GCP 网站
点击 console 左上角 -> IAM 与管理 -> 服务帐户
建立服务帐户
gitlab-ci-publish
,接着点选建立并继续
请选择角色
,找到 Cloud Storage -> Storage 管理员
并选取继续
,接着点选完成
gitlab-ci-publish
的服务帐户金钥
新增金钥 -> 建立新的金钥
JSON
,接着按下建立
金钥就会下载到电脑里,可用来存取云端资源。
有了此金钥等於拥有
gitlab-ci-publish
服务帐户的权限,不能随意将金钥外流。
有了金钥档案之後,可以将其储存到 GitLab 的环境变数,在执行 CI/CD Pipeline 时就能透过金钥获取 GCP 的权限,马上来实际操作看看。
到 GitLab 网站,点击之前建立的 web app 的 Repository
进入到 Repository 後,点击 Settings -> CI/CD
Add variable
Add variable
Add variable
这样 PROJECT_ID
以及 GCP_KEY
的环境变数就建置完成。
准备好金钥,就可以建置 Publish Stage 了。
进入 Cloud Shell 网站
点击左上 Explorer -> Open Folder -> 选择 project 资料夹 -> Open
.gitlab-ci.yml
档案并用以下内容取代image: docker
services:
- docker:dind
variables:
IMAGE_NAME: node-project
CI_IMAGE: $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
HOST_NAME: gcr.io
DEPLOY_IMAGE: $HOST_NAME/$PROJECT_ID/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
stages:
- build
- test
- publish
- stg-deploy
- prod-deploy
build:
stage: build
only:
- dev
- master
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build -t $CI_IMAGE .
- docker push $CI_IMAGE
test:
stage: test
only:
- dev
- master
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker pull $CI_IMAGE
- docker run $CI_IMAGE echo "run test script here"
publish:
stage: publish
only:
- master
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- cat $GCP_KEY | docker login -u _json_key --password-stdin https://$HOST_NAME
script:
- docker pull $CI_IMAGE
- docker tag $CI_IMAGE $DEPLOY_IMAGE
- docker push $DEPLOY_IMAGE
stg-deploy:
stage: stg-deploy
only:
- master
script:
- echo "Staging deploy job"
prod-deploy:
stage: prod-deploy
only:
- master
script:
- echo "Production deploy job"
when: manual
cd ~/project
git add .
git commit -m "add publish stage"
git push origin master
Enter
Username for 'https://gitlab.com':
Password for 'https://[email protected]':
CI/CD -> Pipelines
会看到新的 CI/CD Pipeline ,等待一段时间直到运行成功。
Container Registry
,找到Container Registry
node-project
里面出现 CI/CD Pipeline 建置的 Image ,代表 Publish Stage 执行成功。
今天学会如何将 Image 推送到 Google Container Registry ,若是要 Push 到 Docker Hub,方法也是差不多,只要建立 Docker Hub 的 Access Tokens,并将其放入到环境变数,就可以用同样步骤上传 Image。
<<: [Pizza吃到饱-3] 牛室炙烧牛排 BEEFHOUSE - 台中大里店 #珍珠奶茶口味的披萨才是卖点~
笔者前阵子蛮喜欢路跑的,但跑了很久,成绩却一直没有明显进步,为此感到因扰。後来有一天,一位朋友跟我说...
看完第一个案例不知道大家有什麽收获?欢迎给我一些回馈哦!接着,跟大家分享第二个案例罗! 欢迎有兴趣的...
「Scrum 说每个 Sprint 结束,都应该有可以使用的新功能释出,如果一个 Story 在一个...
本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...
今天介绍另外一个古老的文件技术FTP(File Transfer Protocol)。建立一个档案s...