Skip to content

docker/pipeline changes #529

docker/pipeline changes

docker/pipeline changes #529

Workflow file for this run

name: 'CI/CD'
env:
REGISTRY: ghcr.io
DEVELOPMENT: dev
STAGING: staging
PRODUCTION: production
MAIN_BRANCH: main
DEV_DOMAIN: d.nest.saydao.org
STAGING_DOMAIN: s.nest.saydao.org
PRODUCTION_DOMAIN: nest.saydao.org
TARGET_LAYER: production
TEST_TARGET_LAYER: development
DEV_STACK_NAME: say-dev-nest1
STAGING_STACK_NAME: say-staging-nest1
PRODUCTION_STACK_NAME: say-nest1
DOCKER_STACK_PATH: docker-compose.production.yml
on:
push:
branches:
- 'main'
- 'dev'
- 'release*'
jobs:
build_and_push:
name: Build and Push
runs-on: ubuntu-latest
outputs:
image_id: ${{ steps.image_id.outputs.image_id }}
test_image_id: ${{ steps.image_id.outputs.test_image_id }}
steps:
- name: Git Checkout
uses: actions/checkout@v2
- id: image_id
name: Generate Image ID
run: |
echo "::set-output name=image_id::${{ env.REGISTRY }}/$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]'):${{ github.sha }}"
echo "::set-output name=test_image_id::${{ env.REGISTRY }}/$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]'):${{ github.sha }}-test"
- name: Get Ref Name
run: echo "REF=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
- name: Set Development Envars
if: ${{ env.REF == 'dev' }}
run: |
echo "ENVIRONMENT=${{ env.DEVELOPMENT }}" >> $GITHUB_ENV
- name: Set Staging Envars
if: ${{ env.REF == 'main' }}
run: |
echo "ENVIRONMENT=staging" >> $GITHUB_ENV
- name: Set Production Envars
if: ${{ env.REF == 'release' }}
run: |
echo "ENVIRONMENT=production" >> $GITHUB_ENV
- name: Login to GitHub Container Registry
run: echo ${{ secrets.GITHUB_TOKEN }} | docker login -u ${{ github.repository_owner }} --password-stdin ${{ env.REGISTRY }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build Image
uses: docker/build-push-action@v2
with:
context: .
target: ${{ env.TARGET_LAYER }}
push: true
tags: ${{ steps.image_id.outputs.image_id }}
build-args: |
ENVIRONMENT=${ENVIRONMENT}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,mode=max,dest=/tmp/.buildx-cache-new # mode=max: https://github.com/docker/buildx#--cache-tonametypetypekeyvalue
- # Temp fix
# https://github.com/docker/build-push-action/issues/252
# https://github.com/moby/buildkit/issues/1896
name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
deploy_dev:
name: Deploy to Development Server
runs-on: ubuntu-latest
if: github.event.ref == 'refs/heads/dev'
needs:
- build_and_push
env:
IMAGE_ID: ${{ needs.build_and_push.outputs.image_id }}
environment:
name: Development
url: https://${{ env.DEV_DOMAIN }}
steps:
- name: Git Checkout
uses: actions/checkout@v2
- name: Set Envars
run: |
echo "STACK_FILE=docker-stack-${{ env.DEV_STACK_NAME }}-${{ github.sha }}.yml" >> $GITHUB_ENV
- name: Prepare Stack File
run: >
ENVIRONMENT=${{ env.DEVELOPMENT }} DOMAIN=${{ env.DEV_DOMAIN }} CONTAINER_IMAGE=${IMAGE_ID} STACK_NAME=${{ env.DEV_STACK_NAME }}
docker compose
-f ${{ env.DOCKER_STACK_PATH }}
config
> ${{ env.STACK_FILE }}
- name: Move Stack File to Server
uses: appleboy/[email protected]
with:
host: ${{ secrets.DEV_SERVER_ADDR }}
username: ${{ secrets.DEV_SERVER_USER }}
key: ${{ secrets.DEV_SSH_PRIVATE_KEY }}
port: ${{ secrets.DEV_SERVER_PORT }}
source: ${{ env.STACK_FILE }}
target: '/tmp'
- name: Deploy Stack
uses: appleboy/[email protected]
with:
host: ${{ secrets.DEV_SERVER_ADDR }}
username: ${{ secrets.DEV_SERVER_USER }}
key: ${{ secrets.DEV_SSH_PRIVATE_KEY }}
port: ${{ secrets.DEV_SERVER_PORT }}
script: docker stack deploy --prune --resolve-image=changed --with-registry-auth -c /tmp/${{ env.STACK_FILE }} ${{ env.DEV_STACK_NAME }}
deploy_staging:
name: Deploy to Staging Server
runs-on: ubuntu-latest
if: github.event.ref == 'refs/heads/main'
needs:
- build_and_push
env:
IMAGE_ID: ${{ needs.build_and_push.outputs.image_id }}
environment:
name: Staging
url: https://${{ env.STAGING_DOMAIN }}
steps:
- name: Git Checkout
uses: actions/checkout@v2
- name: Set Envars
run: |
echo "STACK_FILE=docker-stack-${{ env.STAGING_STACK_NAME }}-${{ github.sha }}.yml" >> $GITHUB_ENV
- name: Prepare Stack File
run: >
ENVIRONMENT=${{ env.STAGING }} DOMAIN=${{ env.STAGING_DOMAIN }} CONTAINER_IMAGE=${IMAGE_ID} STACK_NAME=${{ env.STAGING_STACK_NAME }}
docker compose
-f ${{ env.DOCKER_STACK_PATH }}
config
> ${{ env.STACK_FILE }}
- name: Move Stack File to Server
uses: appleboy/[email protected]
with:
host: ${{ secrets.STAGING_SERVER_ADDR }}
username: ${{ secrets.STAGING_SERVER_USER }}
key: ${{ secrets.STAGING_SSH_PRIVATE_KEY }}
port: ${{ secrets.STAGING_SERVER_PORT }}
source: ${{ env.STACK_FILE }}
target: '/tmp'
- name: Deploy Stack
uses: appleboy/[email protected]
with:
host: ${{ secrets.STAGING_SERVER_ADDR }}
username: ${{ secrets.STAGING_SERVER_USER }}
key: ${{ secrets.STAGING_SSH_PRIVATE_KEY }}
port: ${{ secrets.STAGING_SERVER_PORT }}
script: docker stack deploy --prune --resolve-image=changed --with-registry-auth -c /tmp/${{ env.STACK_FILE }} ${{ env.STAGING_STACK_NAME }}
deploy_production:
name: Deploy to Production Server
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/heads/release')
needs:
- build_and_push
env:
IMAGE_ID: ${{ needs.build_and_push.outputs.image_id }}
environment:
name: Production
url: https://${{ env.PRODUCTION_DOMAIN }}
steps:
- name: Git Checkout
uses: actions/checkout@v2
- name: Set Envars
run: |
echo "STACK_FILE=docker-stack-${{ env.PRODUCTION_STACK_NAME }}-${{ github.sha }}.yml" >> $GITHUB_ENV
- name: Prepare Stack File
run: >
ENVIRONMENT=${{ env.PRODUCTION }} DOMAIN=${{ env.PRODUCTION_DOMAIN }} CONTAINER_IMAGE=${IMAGE_ID} STACK_NAME=${{ env.PRODUCTION_STACK_NAME }}
docker compose
-f ${{ env.DOCKER_STACK_PATH }}
config
> ${{ env.STACK_FILE }} && docker compose config | sed '/^name:*/d' > /target
- name: Move Stack File to Server
uses: appleboy/[email protected]
with:
host: ${{ secrets.PROD_SERVER_ADDR }}
username: ${{ secrets.PROD_SERVER_USER }}
key: ${{ secrets.PROD_SSH_PRIVATE_KEY }}
port: ${{ secrets.PROD_SERVER_PORT }}
source: ${{ env.STACK_FILE }}
target: '/tmp'
- name: Deploy Stack
uses: appleboy/[email protected]
with:
host: ${{ secrets.PROD_SERVER_ADDR }}
username: ${{ secrets.PROD_SERVER_USER }}
key: ${{ secrets.PROD_SSH_PRIVATE_KEY }}
port: ${{ secrets.PROD_SERVER_PORT }}
script: docker stack deploy --prune --resolve-image=changed --with-registry-auth -c /tmp/${{ env.STACK_FILE }} ${{ env.PRODUCTION_STACK_NAME }}