GitHub-Actions를 어떻게 사용했는지 기억도 잘 떠오르지도 않고

Secret을 어떻게 다뤘는지도 기억이 가물거려서 간단한 예제 겸 교육자료로 써먹고자 진행해봤다.

 

1. git clone

  - 각자 상황에 맞는 Repository를 이용하면 된다.

❯ git clone git@github.com:whatwant-school/node-web.git

 

 

2. coding

  - 예제를 위해, node.js 웹 서비스를 하나 만들어 보자.

❯ nano app.js

  - 그냥, 간단히 어느 host에서 서비스를 하고 있는 것인지를 보여주는 웹페이지이다.

const http = require('http');
const os = require('os');
console.log(“node-web server starting...");
var handler = function(request, response) {
  console.log("Received request from " + request.connection.remoteAddress);
  response.writeHead(200);
  response.end("You've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);

 

 

3. write Dockerfile

  - 위에서 작성한 웹서비스를 구동할 container image를 어떻게 구성할지를 작성해보자.

❯ nano Dockerfile

  - 내용은 심플하다.

FROM node:latest

ADD app.js /app.js

ENTRYPOINT ["node", "app.js"]

 

 

4. ready DockerHub

  - Actions를 이용해 만들어진 container image를 업로드할 DockerHub의 Repository를 준비하자.

  - 이미 1.0 버전이 있지만 해당 버전을 업데이트하는 방식으로 구성할 것이다.

 

 

5. get Token

  - Actions에서 DockerHub로 업로드 하기 위해서는 계정 인증이 필요하고, 이 때 사용할 Token을 발행해보자.

  - Write 권한을 필수로 넣어줘야 한다.

 

 

6. mkdir

  - Repository 내부에 Actions workflow를 작성할 경로를 생성하자.

❯ mkdir -p .github/workflows/

 

 

7. write Action

  - 내가 사용할 Action workflow를 작성하자.

❯ nano .github/workflows/deploy-image.yml

  - 일부 내용은 각자의 상황에 맞춰서 업데이트 하면 된다.

name: Build and Push Docker Image
on:
  push:
    branches:
      - main  
jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    - name: Build and push
      id: docker_build
      uses: docker/build-push-action@v2
      with:
        push: true
        tags: whatwant/node-web:1.0

 

 

8. Set Secret

  - Action workflow에서 사용하는 Secret 변수 값을 입력하자.

  - USERNAME과 TOKEN을 입력하면 된다.

 

 

 

9. push

  - 이제 준비는 끝났다. push 해보자.

❯ git add -A

❯ git commit -m "make action's workflow"

❯ git push origin main

 

 

10. Actions

  - 입력한대로 잘 동작했는지 확인해보자.

  - 상세 내용도 확인해볼 수 있다.

 

  - 로그 레벨로도 확인해볼 수 있다.

 

  - 정말 DockerHub에 업로드까지 잘 되었는지 확인해보자.

 

 

여기까지~

 

반응형

 

Docker를 처음 접했을 때에 필자는 VirtualBox의 대용품으로만 생각했다.

 

온전한 가상환경이 아닌

부분적인 가상환경을 제공함으로써 성능저하 없이 사용할 수 있게 해주는 놈이라고만 생각했던 것이다.

 

하지만, Docker를 알아가면 알아갈 수록

Docker의 가치는 솔루션의 훌륭한 배포 플랫폼이라는 것에 있는 것 같다.

 

 

일단, 지금 여기에서 알아보고자 하는 것을 보면,,,

Dockerfile이라는 것은 이미지를 어떻게 생성하면 되는지를 적어놓은 파일이다.

 

아래는 MySQL 을 배포하기 위한 Dockerfile 내용이다. 내용을 살펴보면 Dockerfile이라는 것이 뭔지 보일 것이다.

   - https://hub.docker.com/_/mysql/

 

FROM debian:jessie

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql

RUN mkdir /docker-entrypoint-initdb.d

# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
RUN apt-get update && apt-get install -y perl pwgen --no-install-recommends && rm -rf /var/lib/apt/lists/*

# gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5

ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.10-1debian8

RUN echo "deb http://repo.mysql.com/apt/debian/ jessie mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list

# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \
echo mysql-community-server mysql-community-server/data-dir select ''; \
echo mysql-community-server mysql-community-server/root-pass password ''; \
echo mysql-community-server mysql-community-server/re-root-pass password ''; \
echo mysql-community-server mysql-community-server/remove-test-db select false; \
} | debconf-set-selections \
&& apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql

# comment out a few problematic configuration values
# don't reverse lookup hostnames, they are usually another container
RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf \
&& echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \
&& mv /tmp/my.cnf /etc/mysql/my.cnf

VOLUME /var/lib/mysql

COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

EXPOSE 3306
CMD ["mysqld"]

 

여기에서 Dockerfile의 문법에 대해서 설명을 하지는 않겠다.

하지만, 이 포스팅을 보시는 분이라면 대강 어떤 내용인지 알 수 있을 것이다.

 

 

이걸 잘 이용하면 재미있는 작품이 많이 나올 것만 같은 느낌인데.... 오홋~ ^^

 

 

반응형

+ Recent posts